diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java index cf6d907..7fa5fc4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java @@ -7,6 +7,6 @@ */ public interface AbstractValueTypeResolver { - void invoke(Integer totalLength,Object currentValue, ByteBuf byteBuf,Boolean networkOrder); + String invoke(Integer totalLength,Object currentValue, String halfPackTag,Boolean networkOrder); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java index cf6d907..7fa5fc4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java @@ -7,6 +7,6 @@ */ public interface AbstractValueTypeResolver { - void invoke(Integer totalLength,Object currentValue, ByteBuf byteBuf,Boolean networkOrder); + String invoke(Integer totalLength,Object currentValue, String halfPackTag,Boolean networkOrder); } 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 39f37e6..353917a 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 @@ -7,12 +7,13 @@ import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; /** * @author cz @@ -21,18 +22,18 @@ public class BitFieldDecorator { /** - * 构建bitBuf + * 构建bitBuf * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { + public static String buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String packTagMsg, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -47,7 +48,7 @@ String binaryStr = ""; //取关键的值byteBuf if (originPosition != 0) { - Byte fields = dynamicContent.getByte(dynamicContent.writerIndex()); + Byte fields = Hex.decode(packTagMsg)[Hex.decode(packTagMsg).length - 1]; binaryStr = getBinaryStrFromByte(fields); binaryStr = binaryStr.substring(0, originPosition); } @@ -56,17 +57,20 @@ binaryStr += "0"; } byte[] bytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = null; //string 转化成byte - dynamicContent.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); + packTagMsg += ByteBufUtil.hexDump(bytes); +// byteBuf.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); System.out.println(JSON.toJSON(fieldValue)); } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); } + return packTagMsg; } /** - * 从二进制字符串转为byte[] + * 从二进制字符串转为byte[] * * @param binaryStr * @return @@ -81,7 +85,7 @@ } /** - * 把byte转化成2进制字符串 + * 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java index cf6d907..7fa5fc4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java @@ -7,6 +7,6 @@ */ public interface AbstractValueTypeResolver { - void invoke(Integer totalLength,Object currentValue, ByteBuf byteBuf,Boolean networkOrder); + String invoke(Integer totalLength,Object currentValue, String halfPackTag,Boolean networkOrder); } 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 39f37e6..353917a 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 @@ -7,12 +7,13 @@ import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; /** * @author cz @@ -21,18 +22,18 @@ public class BitFieldDecorator { /** - * 构建bitBuf + * 构建bitBuf * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { + public static String buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String packTagMsg, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -47,7 +48,7 @@ String binaryStr = ""; //取关键的值byteBuf if (originPosition != 0) { - Byte fields = dynamicContent.getByte(dynamicContent.writerIndex()); + Byte fields = Hex.decode(packTagMsg)[Hex.decode(packTagMsg).length - 1]; binaryStr = getBinaryStrFromByte(fields); binaryStr = binaryStr.substring(0, originPosition); } @@ -56,17 +57,20 @@ binaryStr += "0"; } byte[] bytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = null; //string 转化成byte - dynamicContent.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); + packTagMsg += ByteBufUtil.hexDump(bytes); +// byteBuf.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); System.out.println(JSON.toJSON(fieldValue)); } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); } + return packTagMsg; } /** - * 从二进制字符串转为byte[] + * 从二进制字符串转为byte[] * * @param binaryStr * @return @@ -81,7 +85,7 @@ } /** - * 把byte转化成2进制字符串 + * 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index c3a00ce..730614a 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,25 +1,16 @@ 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.casic.missiles.pojo.CallTagMsg; import org.apache.commons.lang3.StringUtils; -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.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.ArrayList; -import java.util.List; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Function; /** @@ -36,16 +27,17 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { + public static String buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + return buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); + return buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -57,12 +49,13 @@ * @param currentValue * @param dynamicContent */ - private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + private static String buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, String dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; - valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + String halfPackTag = valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + return halfPackTag; } /** @@ -75,8 +68,9 @@ * @param dynamicContent * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, - ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + private static String buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + String dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + String halfPackTag = dynamicContent; try { String[] ruleStrs = ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 @@ -98,14 +92,16 @@ } //计算长度 if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + halfPackTag = buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } + return halfPackTag; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java index cf6d907..7fa5fc4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java @@ -7,6 +7,6 @@ */ public interface AbstractValueTypeResolver { - void invoke(Integer totalLength,Object currentValue, ByteBuf byteBuf,Boolean networkOrder); + String invoke(Integer totalLength,Object currentValue, String halfPackTag,Boolean networkOrder); } 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 39f37e6..353917a 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 @@ -7,12 +7,13 @@ import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; /** * @author cz @@ -21,18 +22,18 @@ public class BitFieldDecorator { /** - * 构建bitBuf + * 构建bitBuf * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { + public static String buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String packTagMsg, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -47,7 +48,7 @@ String binaryStr = ""; //取关键的值byteBuf if (originPosition != 0) { - Byte fields = dynamicContent.getByte(dynamicContent.writerIndex()); + Byte fields = Hex.decode(packTagMsg)[Hex.decode(packTagMsg).length - 1]; binaryStr = getBinaryStrFromByte(fields); binaryStr = binaryStr.substring(0, originPosition); } @@ -56,17 +57,20 @@ binaryStr += "0"; } byte[] bytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = null; //string 转化成byte - dynamicContent.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); + packTagMsg += ByteBufUtil.hexDump(bytes); +// byteBuf.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); System.out.println(JSON.toJSON(fieldValue)); } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); } + return packTagMsg; } /** - * 从二进制字符串转为byte[] + * 从二进制字符串转为byte[] * * @param binaryStr * @return @@ -81,7 +85,7 @@ } /** - * 把byte转化成2进制字符串 + * 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index c3a00ce..730614a 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,25 +1,16 @@ 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.casic.missiles.pojo.CallTagMsg; import org.apache.commons.lang3.StringUtils; -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.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.ArrayList; -import java.util.List; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Function; /** @@ -36,16 +27,17 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { + public static String buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + return buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); + return buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -57,12 +49,13 @@ * @param currentValue * @param dynamicContent */ - private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + private static String buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, String dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; - valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + String halfPackTag = valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + return halfPackTag; } /** @@ -75,8 +68,9 @@ * @param dynamicContent * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, - ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + private static String buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + String dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + String halfPackTag = dynamicContent; try { String[] ruleStrs = ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 @@ -98,14 +92,16 @@ } //计算长度 if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + halfPackTag = buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } + return halfPackTag; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index d6fad15..8ebce13 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,7 +1,7 @@ package com.casic.missiles.replier.decorator; +import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; -import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; /** @@ -18,12 +18,13 @@ * * @param totalLength * @param currentObjectValue - * @param byteBuf + * @param halfPackTag */ @Override - public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf, Boolean networkOrder) { + public String invoke(Integer totalLength, Object currentObjectValue, String halfPackTag, Boolean networkOrder) { String hexStrValue = convertObjectToHexStr(currentObjectValue); - strToByteBuf(totalLength, hexStrValue, byteBuf, networkOrder); + halfPackTag = strToByteBuf(totalLength, hexStrValue, halfPackTag, networkOrder); + return halfPackTag; } /** @@ -31,9 +32,9 @@ * * @param totalLength 应填充的总长度 * @param currentStrValue 待填充的字符串 - * @param byteBuf 待使用的bytebuf + * @param halfPackTag 半包的tag信息 */ - private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf, Boolean networkOrder) { + private String strToByteBuf(Integer totalLength, String currentStrValue, String halfPackTag, Boolean networkOrder) { byte[] keyBytes = null; Integer fillIndex = 0; if (StringUtils.isNotEmpty(currentStrValue)) { @@ -47,24 +48,33 @@ //网络序处理,大端在后面,小端在前面 if (fillIndex != 0) { int tempIndex = fillIndex; - while (tempIndex > 0) { - byteBuf.writeByte(keyBytes[--tempIndex]); - } + //逆序,然后加上去 + byte[] reverseBytes = reverse(keyBytes); + halfPackTag += ByteBufUtil.hexDump(reverseBytes); } while (totalLength > fillIndex) { - byteBuf.writeByte(0); + halfPackTag += "00"; fillIndex++; } } else { int tempIndex = fillIndex; while (totalLength != null && totalLength > tempIndex) { - byteBuf.writeByte(0); + halfPackTag += "00"; tempIndex++; } if (fillIndex != 0) { - byteBuf.writeBytes(keyBytes); + halfPackTag += ByteBufUtil.hexDump(keyBytes); } } + return halfPackTag; + } + + public static byte[] reverse(byte[] array) { + byte[] reversed = new byte[array.length]; + for (int i = 0, j = array.length - 1; i < array.length; i++, j--) { + reversed[j] = array[i]; + } + return reversed; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java index cf6d907..7fa5fc4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java @@ -7,6 +7,6 @@ */ public interface AbstractValueTypeResolver { - void invoke(Integer totalLength,Object currentValue, ByteBuf byteBuf,Boolean networkOrder); + String invoke(Integer totalLength,Object currentValue, String halfPackTag,Boolean networkOrder); } 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 39f37e6..353917a 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 @@ -7,12 +7,13 @@ import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; /** * @author cz @@ -21,18 +22,18 @@ public class BitFieldDecorator { /** - * 构建bitBuf + * 构建bitBuf * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { + public static String buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String packTagMsg, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -47,7 +48,7 @@ String binaryStr = ""; //取关键的值byteBuf if (originPosition != 0) { - Byte fields = dynamicContent.getByte(dynamicContent.writerIndex()); + Byte fields = Hex.decode(packTagMsg)[Hex.decode(packTagMsg).length - 1]; binaryStr = getBinaryStrFromByte(fields); binaryStr = binaryStr.substring(0, originPosition); } @@ -56,17 +57,20 @@ binaryStr += "0"; } byte[] bytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = null; //string 转化成byte - dynamicContent.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); + packTagMsg += ByteBufUtil.hexDump(bytes); +// byteBuf.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); System.out.println(JSON.toJSON(fieldValue)); } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); } + return packTagMsg; } /** - * 从二进制字符串转为byte[] + * 从二进制字符串转为byte[] * * @param binaryStr * @return @@ -81,7 +85,7 @@ } /** - * 把byte转化成2进制字符串 + * 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index c3a00ce..730614a 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,25 +1,16 @@ 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.casic.missiles.pojo.CallTagMsg; import org.apache.commons.lang3.StringUtils; -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.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.ArrayList; -import java.util.List; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Function; /** @@ -36,16 +27,17 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { + public static String buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + return buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); + return buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -57,12 +49,13 @@ * @param currentValue * @param dynamicContent */ - private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + private static String buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, String dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; - valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + String halfPackTag = valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + return halfPackTag; } /** @@ -75,8 +68,9 @@ * @param dynamicContent * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, - ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + private static String buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + String dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + String halfPackTag = dynamicContent; try { String[] ruleStrs = ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 @@ -98,14 +92,16 @@ } //计算长度 if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + halfPackTag = buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } + return halfPackTag; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index d6fad15..8ebce13 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,7 +1,7 @@ package com.casic.missiles.replier.decorator; +import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; -import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; /** @@ -18,12 +18,13 @@ * * @param totalLength * @param currentObjectValue - * @param byteBuf + * @param halfPackTag */ @Override - public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf, Boolean networkOrder) { + public String invoke(Integer totalLength, Object currentObjectValue, String halfPackTag, Boolean networkOrder) { String hexStrValue = convertObjectToHexStr(currentObjectValue); - strToByteBuf(totalLength, hexStrValue, byteBuf, networkOrder); + halfPackTag = strToByteBuf(totalLength, hexStrValue, halfPackTag, networkOrder); + return halfPackTag; } /** @@ -31,9 +32,9 @@ * * @param totalLength 应填充的总长度 * @param currentStrValue 待填充的字符串 - * @param byteBuf 待使用的bytebuf + * @param halfPackTag 半包的tag信息 */ - private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf, Boolean networkOrder) { + private String strToByteBuf(Integer totalLength, String currentStrValue, String halfPackTag, Boolean networkOrder) { byte[] keyBytes = null; Integer fillIndex = 0; if (StringUtils.isNotEmpty(currentStrValue)) { @@ -47,24 +48,33 @@ //网络序处理,大端在后面,小端在前面 if (fillIndex != 0) { int tempIndex = fillIndex; - while (tempIndex > 0) { - byteBuf.writeByte(keyBytes[--tempIndex]); - } + //逆序,然后加上去 + byte[] reverseBytes = reverse(keyBytes); + halfPackTag += ByteBufUtil.hexDump(reverseBytes); } while (totalLength > fillIndex) { - byteBuf.writeByte(0); + halfPackTag += "00"; fillIndex++; } } else { int tempIndex = fillIndex; while (totalLength != null && totalLength > tempIndex) { - byteBuf.writeByte(0); + halfPackTag += "00"; tempIndex++; } if (fillIndex != 0) { - byteBuf.writeBytes(keyBytes); + halfPackTag += ByteBufUtil.hexDump(keyBytes); } } + return halfPackTag; + } + + public static byte[] reverse(byte[] array) { + byte[] reversed = new byte[array.length]; + for (int i = 0, j = array.length - 1; i < array.length; i++, j--) { + reversed[j] = array[i]; + } + return reversed; } /** 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 8f3c0f1..7435c91 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 @@ -5,20 +5,12 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; -import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.*; import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.*; -import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -37,16 +29,13 @@ * (2)处理长度字段的反构 * (3)将核心字段的反构,交给解析器进行反构 */ - public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { + public static String combinedField(Map fieldConfigsMap, + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { return null; } - ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); - //先构建oid编号 - fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, combinedFieldConfig.getPrefixCode(), fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -59,58 +48,64 @@ throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); }); if (dataFieldIds.length == 1) { - if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { - if (bizDataMap.get(combinedFieldConfig.getDataFieldName()) == null) { - return null; - } + if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(combinedFieldConfig.getDataFieldName()) && bizDataMap.get(combinedFieldConfig.getDataFieldName()) == null) { + return null; } fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); - return fragmentByte; + + String packTagMsg = simpleField(fieldConfigs, bizDataMap, "", fieldRuleConfigMap, realLengthConsumer); + return packTagMsg; } /** * 计算长度 + * 同时构建长度的报文 * * @param combinedFieldConfig * @param bizDataMap - * @param fragmentByte + * @param prefixCode * @param fieldConfigsMap * @param fieldRuleConfigMap * @return */ - private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, - Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, String prefixCode, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 return (Integer realLength) -> { + + String halfPackTag = ""; 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); + halfPackTag = simpleField(fieldConfigs, bizDataMap, prefixCode, fieldRuleConfigMap, null); } else { //静态配置的长度 AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); if (combinedFieldConfig.getLength() > 0) { combinedFieldConfig.setLength(combinedFieldConfig.getLength()); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + halfPackTag = valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), prefixCode, false); } else { - //改成回调 //以实际长度为准 int sampleStandardLength = 0 - combinedFieldConfig.getLength(); if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { //实际长度要小于等于参考长度 if (realLength <= sampleStandardLength) { - valueTypeResolver.invoke(2, realLength, fragmentByte, false); + halfPackTag = valueTypeResolver.invoke(2, realLength, prefixCode, false); combinedFieldConfig.setLength(realLength); + } } } } - return combinedFieldConfig.getLength(); + + return CallTagMsg.builder() + .length(combinedFieldConfig.getLength()) + .packMsg(halfPackTag) + .build(); }; } @@ -124,31 +119,31 @@ * * @param fieldConfigs * @param bizDataMap - * @param fragmentByte + * @param packTagMsg * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf - fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { + public static String simpleField(List fieldConfigs, Map bizDataMap, String + packTagMsg, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { - return null; + return packTagMsg; } //根据起始点排序 List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); - //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { - throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); - }); +// //校验是不是一个完整ByteBuf数组 +// Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { +// throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); +// }); Object prepareData = null; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { //判断是否存在业务值 if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); + packTagMsg = buildBuf(sortFieldConfig, prepareData, packTagMsg, fieldRuleConfigMap, realLengthConsumer); } - return fragmentByte; + return packTagMsg; } /** @@ -158,22 +153,24 @@ * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf - dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { + private static String buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String + packTagMsg, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = 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); + packTagMsg = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); + packTagMsg = BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, packTagMsg, fieldRuleConfigMap); } - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + packTagMsg = BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, packTagMsg, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); + packTagMsg = ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, packTagMsg, fieldRuleConfigMap, realLengthConsumer); } + return packTagMsg; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 8ac88bb..40c358e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -56,7 +56,7 @@ String devcode = null; //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); - Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, byteBuf); + Map parseFixedDataMap = getParseFixedDataMap(protocolFactory, ByteBufUtil.hexDump(byteBuf)); try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 @@ -82,23 +82,23 @@ break; } } - Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(ByteBufUtil.hexDump(intactMessageByte), protocolConfig); //获取报文的业务内容 - ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); + String packBodyMsg = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(ByteBufUtil.hexDump(intactMessageByte)); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); - log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); + String clearZeroPlainPackMsg = ruleConfigProvider.getSafeDatagram(packBodyMsg, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + log.debug("解析的明文是----------" + clearZeroPlainPackMsg); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 - ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); + ProtocolProcessEventListener.setTask(devcode, clearZeroPlainPackMsg, 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainPackMsg, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,6 +121,7 @@ //出现异常情况,再次匹配,丢弃无法识别的帧即其中异常的数据 LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); } finally { + byteBuf.markReaderIndex(); //10、数据发送,异步,转存整体数据 ProtocolProcessEventListener.saveData(devcode); return result; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 9dba3a0..99f7551 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -32,10 +32,10 @@ * 获取协议的固定数据信息 * * @param protocolFactory - * @param wholeDatagramByte + * @param packMsg * @return */ - protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + protected Map getParseFixedDataMap(AbstractProtocolConfigFactory protocolFactory, String packMsg) { ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); @@ -43,11 +43,11 @@ || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { return null; } - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(packMsg, protocolConfig.getFieldRuleConfigMap()); //打印源数据,设备编号 ProcessEventTask processEventTask = ProcessEventTask.builder() .devcode((String) parseFixedDataMap.get("devcode")) - .decryptSoureData(ByteBufUtil.hexDump(wholeDatagramByte).substring(wholeDatagramByte.readerIndex())) + .decryptSoureData(packMsg) .build(); ProtocolProcessEventListener.asynAddTask(processEventTask); return parseFixedDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java index e4f97cb..d5a7810 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRC16.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { - String hexString = "a3200051312020040095c30095048401911775fa081beb555c07257ee0f09440126128ca60a48db09bd155a818fe29f0f7b5ebb9390a671b899aeb9fc736911217802da58fd248a4d952d9c6f18870339d1b9fe544cbfd10dfebeab8afd428d29863"; + String hexString = "a3200045312022020006030006048402f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbedb728"; String toBeVerified = hexString.substring(0, hexString.length() - 4); byte[] toBeVerifiedByte = Hex.decode(toBeVerified); CRCUtil crcUtil = new CRCUtil(CRCUtil.Parameters.CRC16MODBUS); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 444c668..5a570d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -30,6 +30,9 @@ * 2、如果没有加密方式,则进行业务设定的长度与实例长度,比较,对最后两位进行CRC校验,如果小于实际长度, * 则进行长度截取CRC校验,CRC校验通过,则截取对应的数据报文,否则返回null * 3、不满足1、2则不对协议进行解析,同时打印日志 + *

+ *

+ * 返回的包应该是个截取的半包结构 * * @return */ @@ -40,7 +43,7 @@ } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer totalLength = currentFrameFixedProperty.get(TOTAL_LENGTH); //一次匹配 ByteBuf matchByteBuf = doMatchLength(byteBuf, totalLength); @@ -52,7 +55,7 @@ protocolFactory.getProtocolFieldConfigProvider(); if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { //执行补零操作 - Integer fixedLength = protocolFieldConfigProvider.getFixedLength(byteBuf, protocolConfig); + Integer fixedLength = protocolFieldConfigProvider.getFixedLength(ByteBufUtil.hexDump(byteBuf), protocolConfig); Integer realContentLength = totalLength - fixedLength; Integer remainder = realContentLength % groupLength; Integer fillZero = groupLength - remainder; @@ -90,13 +93,13 @@ private ByteBuf doMatchLength(ByteBuf byteBuf, Integer totalLength) { //放在加密前进行计算, if (ByteBufUtil.hexDump(byteBuf).length() / 2 == totalLength && crcCheck(byteBuf)) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); return preJudgment; } if (ByteBufUtil.hexDump(byteBuf).length() / 2 > totalLength) { - ByteBuf preJudgment = byteBuf.slice(0, totalLength); + ByteBuf preJudgment = byteBuf.slice(byteBuf.readerIndex(), totalLength); if (crcCheck(preJudgment)) { byteBuf.readerIndex(totalLength); byteBuf.markReaderIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 44d22f1..1dcb4bc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -82,15 +82,14 @@ * 2、采用有限匹配原则,不允许匹配字符包含 * * @param fieldFixedMap 组合字段配置配置集合 - * @param byteBuf 当前要解析的组合字段内容 + * @param tagPackMsg 当前要解析的组合字段内容 * @return 组合字段配置 */ - public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, String tagPackMsg) { Set> en = fieldFixedMap.entrySet(); for (Map.Entry entry : en) { String key = entry.getKey(); - if (doMatchLeftLeadCode(key, protocolContent)) { + if (doMatchLeftLeadCode(key, tagPackMsg)) { return entry.getValue(); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b0cc1d7..a1de7b6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -35,7 +36,7 @@ } //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); + Integer totalLength = protocolFieldConfigProvider.getTotalLength(ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 3db3481..ec98333 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.FrameNodeStr; import com.casic.missiles.factory.AbstractProtocolConfigFactory; @@ -42,14 +43,16 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(byteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { @@ -57,15 +60,17 @@ ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); - //后续标志位结束,表示当前帧可以解析 + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), + ByteBufUtil.hexDump(matchByteBuf).substring(byteBuf.readerIndex()), + protocolConfig.getFieldRuleConfigMap()); + //,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 - storeHalfPackBuf(protocolFactory, matchByteBuf); + storeHalfPackBuf(protocolFactory, ByteBufUtil.hexDump(matchByteBuf)); } //前一帧没有解析,当前流可以读取,需再次进行匹配 matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); @@ -81,7 +86,7 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); @@ -89,11 +94,12 @@ List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); - ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); + String bizFrameStr = protocolFactory.getProtocolFieldConfigProvider() + .setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); //增加业务内容 - mergeWholeFrameByte.writeBytes(bizFrameByte); + mergeWholeFrameByte.writeBytes(Hex.decode(bizFrameStr)); //增加尾部 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameTail())); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); @@ -112,9 +118,7 @@ String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { - ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); - currentByteBuf.resetReaderIndex(); - String hexDump = ByteBufUtil.hexDump(currentByteBuf); + String hexDump = expiringByteBuf.getHistoryPackMsg(); //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); if (StringUtils.isEmpty(frameBody)) { @@ -151,14 +155,15 @@ String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); //获取挂起的半包帧结构,并排序 List sortList = getStoreHalfPackBuf(key); - Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(ByteBufUtil.hexDump(byteBufContent), protocolConfig); //添加当前的帧信息 sortList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(byteBufContent) + .historyPackMsg(ByteBufUtil.hexDump(byteBufContent)) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(parseFixedDataMap) .build()); + return sortList; } @@ -167,13 +172,13 @@ * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory - * @param byteBuf + * @param historyPackMsg * @return */ - private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, ByteBuf byteBuf) { + private Boolean storeHalfPackBuf(AbstractProtocolConfigFactory protocolFactory, String historyPackMsg) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(historyPackMsg, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); // key += Thread.currentThread().getName(); @@ -181,10 +186,8 @@ if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } - ByteBuf currentByteBuf = ByteBufAllocator.DEFAULT.buffer(); - currentByteBuf.writeBytes(byteBuf); storeList.add(MatchDataStore.ExpiringByteBuf.builder() - .byteBuf(currentByteBuf) + .historyPackMsg(historyPackMsg) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 905c728..e127b40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -31,19 +31,19 @@ @Data public static class ExpiringByteBuf { /** - * byteBuf + * 历史数据包消息 */ - private ByteBuf byteBuf; + private String historyPackMsg; /** - * 总长度 + * 历史数据包总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 历史数据包尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 历史数据包分片号 */ private Map fixedStoreMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5a743f0..46430e4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -20,7 +20,7 @@ Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); - Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); + Map getFrameStructBuf(List protocolFieldConfigs, String packMsg); Integer totalFilterLength(ProtocolConfig protocolConfig, Map protocolFieldConfigMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index aef2f71..4abd134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,18 +1,16 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.codec.Hex; import java.util.*; @@ -32,11 +30,12 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { - Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + public static Object doResolveFieldByteRule(String packMsgStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + Object resolveRuleValue = packMsgStr; List byteBufList = new ArrayList<>(); String[] ruleStrs = ruleIds.split(","); - + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(packMsgStr)); //存放到数组里面 if (ruleStrs.length == 1) { byteBufList.add(byteBuf); @@ -79,7 +78,7 @@ } } catch (RuntimeException ex) { - log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", ByteBufUtil.hexDump(byteBuf), JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); + log.error(EngineExceptionEnum.RULE_PARSE_FAIL.getCode() + "报文信息是{},当前解析内容{},规则配置信息{},异常信息{}", packMsgStr, JSON.toJSONString(byteBufList), JSON.toJSONString(fieldRuleConfig), ex); //解析失败,直接返回null return null; } @@ -87,6 +86,7 @@ if (CollectionUtils.isNotEmpty(byteBufList)) { resolveRuleValue = byteBufList.get(0); } + byteBuf.release(); return resolveRuleValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index 9226dc3..ee99bb4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -44,9 +44,9 @@ Assert.isFalse(Objects.isNull(lengthConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + lengthConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + lengthConfig.getOriginPositionByte()); Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(lengthConfig); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + combinedFieldParam.setCurrentParseLength(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 72b75dc..6bacdbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -32,7 +32,7 @@ * @author cz * @date 2023-6-13 */ -//依次递增进行数据的解析, +//依次递增进行数据的解析 @Slf4j public class GenericCombinedFieldResolver { @@ -44,16 +44,16 @@ public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + String plainPackMsg = combinedFieldParam.getPlainPackMsg(); List> storeObjectList = combinedFieldParam.getStoreObjectList(); - while (byteBuf.readerIndex() < byteBuf.writerIndex()) { + while (combinedFieldParam.getCurrentParsePosition() < (plainPackMsg.length() / 2)) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { - Integer oldLength = byteBuf.readerIndex(); + Integer oldLength = combinedFieldParam.getCurrentParsePosition(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + if (combinedFieldParam.getCurrentParsePosition() >= (plainPackMsg.length() / 2)) { return; } - Assert.isFalse(oldLength == byteBuf.readerIndex(), () -> { + Assert.isFalse(oldLength == combinedFieldParam.getCurrentParsePosition(), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_CONFIG_MATCH_FAILED); }); // 将前一个节点作为参数传入下一次,保留前一个节点的信息 @@ -78,11 +78,11 @@ } - public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + public static CombinedFieldProcessorParam buildCombinedFieldParam(String plainPackMsg, Map fieldFixedMap, Map fieldRuleConfigMap, Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() - .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) - .byteBuf(byteBuf) + .resolveFieldFunction(new FieldResolver().parseField(plainPackMsg, fieldRuleConfigMap)) + .plainPackMsg(plainPackMsg) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 4d18f63..142e1f2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -32,7 +32,7 @@ */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); @@ -50,11 +50,11 @@ Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); abstractFieldConfig.setOriginPositionByte(originPositionByte); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - setStoreObjectMap(currentIndex-1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); + setStoreObjectMap(currentIndex - 1, combinedFieldParam.getStoreObjectList(), abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); + combinedFieldParam.setCurrentParseLength(combinedFieldParam.getTotalLength()); return null; } @@ -72,8 +72,8 @@ } - private void setStoreObjectMap(int currrentIndex, List> storeObjectMap, String name, Object fieldValue) { - for (int i = currrentIndex; i < storeObjectMap.size(); i++) { + private void setStoreObjectMap(int currentIndex, List> storeObjectMap, String name, Object fieldValue) { + for (int i = currentIndex; i < storeObjectMap.size(); i++) { storeObjectMap.get(i).put(name, fieldValue); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index 23d1e4c..262c8b8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -25,14 +25,14 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 计算业务字段长度,同时拿到对应指定的字段解析配置 + * 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return */ @Override - public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException{ - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); @@ -47,12 +47,12 @@ fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); - fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; } else if (dataFieldIds.length > 1) {//含有多个字段的操作 fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index ac1cf52..5d85656 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -35,13 +35,13 @@ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { //前导码匹配 - log.debug(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); + log.debug(combinedFieldParam.getPlainPackMsg()); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), - combinedFieldParam.getByteBuf()); + combinedFieldParam.getPlainPackMsg()); Assert.isFalse(Objects.isNull(combinedFieldConfig), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL.getCode(), - "匹配失败,报文信息是"+ByteBufUtil.hexDump( combinedFieldParam.getByteBuf())+",配置信息是" - + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); + "匹配失败,报文信息是" + combinedFieldParam.getPlainPackMsg() + ",配置信息是" + + JSON.toJSONString(combinedFieldParam.getFieldFixedMap())); }); //解析前导码 int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); @@ -53,7 +53,7 @@ skipNotConfigPreCode(combinedFieldParam); } } else if (executeResult == NOT_PARSE) { - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); } return combinedFieldConfig; } @@ -72,7 +72,7 @@ } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); - fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getCurrentParsePosition() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); @@ -82,10 +82,10 @@ private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) throws RuntimeException { CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + combinedFieldParam.setCurrentParseLength(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); - combinedFieldParam.getByteBuf().readBytes(fieldValue); - if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { + combinedFieldParam.setCurrentParseLength(fieldValue); + if (combinedFieldParam.getCurrentParsePosition() == (combinedFieldParam.getPlainPackMsg().length() / 2)) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index 2f77154..48fa80a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.List; import java.util.Map; @@ -26,9 +27,9 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseBitField(String fieldBytes, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; - String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + String binaryStr = convertBinaryStr(fieldBytes, fieldConfig); if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { //暂时没处理网络序 fieldsResolveValue = defaultBitResolve(binaryStr); @@ -57,19 +58,16 @@ */ private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); - byteBuf.writeBytes(binaryBytes); - Object resolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); - byteBuf.release(); + Object resolveValue = doResolveFieldByteRule(ByteBufUtil.hexDump(binaryBytes), ruleIds, fieldRuleConfigMap, networkOrder); return resolveValue; } - private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + private static String convertBinaryStr(String fieldBytes, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - byte fields = 0x00; + String fields = ""; //计算字节所占的比例位置 Integer offsetByte = (fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) / 8; if ((fieldConfig.getOffsetLength() + fieldConfig.getOriginPositionBit()) % 8 != 0) { @@ -80,8 +78,8 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(originPosition + visitIndex); - binaryStr = getBinaryStrFromByte(fields) + binaryStr; + fields = fieldBytes.substring((originPosition + visitIndex) * 2, (originPosition + visitIndex + 1) * 2); + binaryStr = getBinaryStrFromByte(Hex.decode(fields)[0]) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); return binaryStr; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index e8506e7..8c67aa4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.Map; @@ -19,16 +20,16 @@ * 字节字段解析核心类 * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * - * @param byteBuf + * @param packMsgStr * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { + public static Object doParseByteField(String packMsgStr , String ruleIds, Map fieldRuleConfigMap, Boolean networkOrder) { Object fieldsResolveValue = null; if (StringUtils.isEmpty(ruleIds)) { - fieldsResolveValue = defaultResolve(byteBuf, networkOrder); + fieldsResolveValue = defaultResolve(packMsgStr , networkOrder); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap, networkOrder); + fieldsResolveValue = doResolveFieldByteRule(packMsgStr , ruleIds, fieldRuleConfigMap, networkOrder); } return fieldsResolveValue; } @@ -36,16 +37,17 @@ /** * 默认解析方法 * - * @param byteBuf + * @param packMsgStr * @return */ - private static Object defaultResolve(ByteBuf byteBuf, Boolean networkOrder) { + private static Object defaultResolve(String packMsgStr , Boolean networkOrder) { Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { + for (int i = 0; i < packMsgStr .length() / 2; i++) { // if (networkOrder) { // defaultResolveValue = defaultResolveValue | (int) byteBuf.readByte() & 0xff << 8 * i; // } else { - defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; + + defaultResolveValue = defaultResolveValue << 8 | (int) Hex.decode(packMsgStr )[i] & 0xff; // } } return defaultResolveValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 27bbe27..ef2b5e7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -23,14 +23,14 @@ public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { /** - * 按照配置和待解析的缓冲池解析字段 + * 按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { + public Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { @@ -45,7 +45,7 @@ } /** - * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * 解析和协议帧结构相关的协议字段结合(位置、长度等信息) * * @param protocolFieldConfigs * @param totalLength @@ -64,29 +64,29 @@ } /** - * 获取业务内容的byteBuf + * 获取业务内容的byteBuf * 主要流程如下所示 * 1、通过协议配置计算固定长度 * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override - public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { - Map frameStructBufMap = new HashMap<>(); + public Map getFrameStructBuf(List protocolFieldConfigs, String packMsg) { + Map frameStructBufMap = new HashMap<>(); //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; + Integer totalLength = packMsg.length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 - frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); + frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, packMsg.substring(0, maxFixedPosition * 2)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, packMsg.substring(2 * maxFixedPosition, 2 * (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, packMsg.substring((maxFixedPosition + totalLength - fixedLength) * 2, (fixedLength - maxFixedPosition) * 2)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * 获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 0b5f79f..b162cfd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -25,10 +25,10 @@ * TODO: 解析字段 * 分为bit和byte单位解析 * - * @param byteBuf + * @param packMsgStr * @return */ - public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Function parseField(String packMsgStr, Map fieldRuleConfigMap) { return (AbstractFieldConfig fieldConfig) -> { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); Object fieldValue = 0; @@ -36,11 +36,10 @@ try { Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig, fieldRuleConfigMap,networkOrder); + fieldValue = BitFieldParser.doParseBitField(packMsgStr, fieldConfig, fieldRuleConfigMap, networkOrder); } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap,networkOrder); + String fieldBytes = packMsgStr.substring(originPosition * 2, originPosition * 2 + fieldConfig.getOffsetLength() * 2); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(), fieldRuleConfigMap, networkOrder); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java index 603ddec..6f248f1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -2,10 +2,13 @@ import com.google.common.primitives.UnsignedInteger; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; /** * 数值类型转换规则 @@ -37,8 +40,8 @@ parseValue = String.valueOf((Integer.valueOf((String) object, 16).shortValue())); break; case "float": - Long longValue=Long.parseLong((String)object, 16); - parseValue= Float.intBitsToFloat(longValue.intValue()); + Long longValue = Long.parseLong((String) object, 16); + parseValue = Float.intBitsToFloat(longValue.intValue()); // parseValue = Float.intBitsToFloat(Integer.parseInt((String) "b90bf333".substring(2), 16)); break; case "int": @@ -59,11 +62,17 @@ public static void main(String[] args) { // Float parseValue = Float.intBitsToFloat(Integer.parseInt(("a69e63a"))); System.out.println(Long.parseLong("9a19df3a", 16)); - Long value=Long.parseLong("b90bf333", 16); + Long value = Long.parseLong("b90bf333", 16); Float f = Float.intBitsToFloat(value.intValue()); - System.out.println(f); - - +// System.out.println(f); + String packMsg = "123456"; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(Hex.decode(packMsg)); + key.getByte(0); + System.out.println(ByteBufUtil.hexDump(key)); + AtomicInteger counter = new AtomicInteger(8); + counter.decrementAndGet(); + System.out.println(counter); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 81457c2..d7ea4ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -1,11 +1,10 @@ package com.casic.missiles.parser.safe; -import io.netty.buffer.ByteBuf; public interface SafeStrategy { - ByteBuf decryption(String cipher); + byte[] decryption(String cipher); - ByteBuf encryption(String lightText); + byte[] encryption(String lightText); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index b001944..db2c2d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -21,7 +21,7 @@ public static final int BlockSize = 16; @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -29,12 +29,12 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf plainBuf = EcbDecrypt(in, keyBytes); + byte[] plainBuf = EcbDecrypt(in, keyBytes); return plainBuf; } @Override - public ByteBuf encryption(String cipher) { + public byte[] encryption(String cipher) { byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; @@ -42,7 +42,7 @@ key.writeBytes(keyByte); byte[] in = Hex.decode(cipher); byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); - ByteBuf ciphertext = EcbEncrypt(in, keyBytes); + byte[] ciphertext = EcbEncrypt(in, keyBytes); return ciphertext; } @@ -54,9 +54,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbEncrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbEncrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_encrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** @@ -84,9 +84,9 @@ * @param keyBytes 密钥 * @return */ - public static ByteBuf EcbDecrypt(byte[] in, byte[] keyBytes) { + public static byte[] EcbDecrypt(byte[] in, byte[] keyBytes) { byte[] out = ecb_decrypt(in, keyBytes); - return ByteBufAllocator.DEFAULT.buffer().writeBytes(out); + return out; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java index 3536b87..1f78eca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -19,7 +19,7 @@ @Override - public ByteBuf decryption(String cipher) { + public byte[] decryption(String cipher) { TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ 0x33, 0x32, 0x31, 0x30, @@ -35,11 +35,11 @@ byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); dec = teaUtilsX.decrypt(reverse);//解密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + return reverseBytesBy8(dec); } @Override - public ByteBuf encryption(String lightText) { + public byte[] encryption(String lightText) { byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); TeaUtilsX t = new TeaUtilsX(); byte[] k = new byte[]{ @@ -49,8 +49,8 @@ 0x66, 0x65, 0x64, 0x63 }; t.setKey(k); - byte[] enc = encrypt(reverse);//加密 - return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + byte[] enc = t.encrypt(reverse);//加密 + return reverseBytesBy8(enc); } private static long UINT32_MAX = 0xFFFFFFFFL; @@ -291,8 +291,8 @@ } public static void main(String[] args) { - String infos = "1000006300233836343533303035373237333532373839383631313231323839303037323132353932"; - String infoss = "f1f0979a14881412819b7c635f748f26a4f88a5203d598362ebe6a2085cd7647d796ad2359abe2012040c89a0eb25ea42e52d046d65207c8dac4b13220c7cbed"; + String infos = "1000005100061805100a2b2b00000000"; + String infoss = "bb458025e99fa0697035c77f97769ef2"; byte[] reverse = reverseBytesBy8(Hex.decode(infos)); TeaUtilsX teaUtilsX = new TeaUtilsX(); byte[] k = new byte[]{ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java new file mode 100644 index 0000000..0527e85 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CallTagMsg.java @@ -0,0 +1,16 @@ +package com.casic.missiles.pojo; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + * @date 2024-05-15 + */ +@Data +@Builder +public class CallTagMsg { + + private String packMsg; + private Integer length; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 0d2c465..f423b6a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -19,10 +19,27 @@ * 前一个流程结果 */ private Object preProcessorResult; + /** - * + * 解密后的数据包字符串 */ - private ByteBuf byteBuf; + private String plainPackMsg; + + + /** + * 解密后的数据包字符串 + */ + private String oldPlainPackMsg; + + /** + * 解密后的数据包字符串 + */ + private int currentParsePosition; + + + public void setCurrentParseLength(int offsetLength) { + currentParsePosition += offsetLength; + } /** * 防止出现内存泄漏 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index d7ed3e7..999cf31 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -5,7 +5,6 @@ import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -14,6 +13,10 @@ import java.util.Map; import java.util.stream.Collectors; +/** + * tag 业务字段的配置处理 + */ + public class CombinedFieldConfigProvider { @@ -34,27 +37,26 @@ /** - * 解析数据字段 + * 解析数据字段 * * @param ruleConfig - * @param byteBuf + * @param plainPackMsg 明文数据包消息 * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { + public void parseDataField(RuleConfig ruleConfig, String plainPackMsg, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); - byteBuf.resetReaderIndex(); //装配参数 CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. - buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + buildCombinedFieldParam(plainPackMsg, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList), fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** - * 查询规则对应的组合配合 + * 查询规则对应的组合配合 * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 97a78ad..d7b22f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.FieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import java.util.HashMap; import java.util.List; @@ -44,20 +43,17 @@ * 解析数据字段 * * @param ruleConfig - * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { + public Map parseDataField(RuleConfig ruleConfig, String packmsg,Map fieldRuleConfigMap) { if (showSkip()) { return null; } - byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); - byteBuf.resetReaderIndex(); Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, - new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); + new FieldResolver().parseField(packmsg,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 4023e2d..92e2424 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; -import com.casic.missiles.pojo.RuleEventConfig; -import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -16,16 +14,11 @@ import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.ProtocolFieldConfigUtil; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -47,7 +40,7 @@ private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); - private Map frameStructMap; + private Map frameStructMap; public Map getStoreObjectMap() { return storeObjectMap; @@ -80,21 +73,21 @@ * 通过协议字段id和协议报文获取该配置实例化内容的值 * * @param protocolFieldId - * @param byteBuf + * @param packMsgStr * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Integer getProtocolFieldValue(Long protocolFieldId, String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + packMsgStr; //获取缓存 if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf, fieldRuleConfigMap); + Map fixDataMap = this.getProtocolDataMap(packMsgStr, fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -116,18 +109,18 @@ /** * @return 帧结构map集合 */ - public Map getFrameStructMap() { + public Map getFrameStructMap() { return frameStructMap; } /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsgStr * @param protocolConfig * @return */ - public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Map getFixedProperty(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -138,7 +131,7 @@ } Map fixedPropertyMap = new HashMap<>(); FieldParser fieldParser = new DefaultProtocolFieldParser(); - fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig)); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(packMsgStr, protocolConfig)); if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { this.singleObjects.put(catchKey, fixedPropertyMap); return fixedPropertyMap; @@ -150,11 +143,11 @@ /** * 获取帧固定位置字段配置信息 * - * @param byteBuf + * @param packMsg * @param protocolConfig * @return */ - public Integer getFixedLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getFixedLength(String packMsg, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } @@ -164,7 +157,7 @@ return (Integer) singleObjects.get(catchKey); } Integer fixedLength = 0; - Map fixedProperty = getFixedProperty(byteBuf, protocolConfig); + Map fixedProperty = getFixedProperty(packMsg, protocolConfig); fixedLength = fixedProperty.get(FIXED_LENGTH); if (ObjectUtils.isNotEmpty(fixedLength)) { this.singleObjects.put(catchKey, fixedLength); @@ -194,7 +187,7 @@ /** * 获取帧结构中业务字段的长度 */ - public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Supplier getBizFieldLength(String byteBuf, ProtocolConfig protocolConfig) { return () -> { if (showSkip()) { return null; @@ -237,16 +230,16 @@ /** * 获取帧结构应有的总长度 */ - public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public Integer getTotalLength(String packMsgStr, ProtocolConfig protocolConfig) { if (showSkip()) { return null; } //获取缓存 - String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + String catchKey = PROTOCOL_LENGTH + packMsgStr; if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), packMsgStr, protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -267,7 +260,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf, Map fieldRuleConfigMap) { + public Map getProtocolDataMap(String packMsgStr, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -278,7 +271,7 @@ FieldParser fieldParser = new DefaultProtocolFieldParser(); Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, storeObjectMap, - new FieldResolver().parseField(byteBuf, fieldRuleConfigMap) + new FieldResolver().parseField(packMsgStr, fieldRuleConfigMap) ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); @@ -287,22 +280,16 @@ return null; } - public ByteBuf setDataContentBuf(String bizDataStr, String headFrame, String tail) { + public String setDataContentBuf(String bizDataStr, String headFrame, String tail) { log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { frameStructMap = new HashMap<>(); - ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); - headFrameByte.writeBytes(Hex.decode(headFrame)); - frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); - ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); - bizFrameByte.writeBytes(Hex.decode(bizDataStr)); - frameStructMap.put(AROUND_BUSINESS_CONTENT, bizFrameByte); - ByteBuf tailFrameByte = ByteBufAllocator.DEFAULT.buffer(); - tailFrameByte.writeBytes(Hex.decode(tail)); - frameStructMap.put(AFTER_BUSINESS_CONTENT, tailFrameByte); - this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); - return bizFrameByte; + frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrame); + frameStructMap.put(AROUND_BUSINESS_CONTENT, bizDataStr); + frameStructMap.put(AFTER_BUSINESS_CONTENT, tail); + this.singleObjects.put(CONTENT_FIELD_DS, bizDataStr); + return bizDataStr; } log.debug("设置帧结构出错了...------------------------"); return null; @@ -311,26 +298,25 @@ /** * 获取业务报文内容的content字节 * - * @param wholeDatagramByte + * @param packMsg * @return */ - public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + public String getDataContentBuf(String packMsg) { if (showSkip()) { return null; } - ByteBuf bizDataByteBuf = null; + String packBodyMsg = ""; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); - bizDataByteBuf.resetReaderIndex(); - return bizDataByteBuf; + packBodyMsg = (String) singleObjects.get(CONTENT_FIELD_DS); + return packBodyMsg; } FieldParser fieldParser = new DefaultProtocolFieldParser(); - frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); - if (bizDataByteBuf != null) { - this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); - return bizDataByteBuf; + frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, packMsg); + packBodyMsg = frameStructMap.get(AROUND_BUSINESS_CONTENT); + if (StringUtils.isNotEmpty(packBodyMsg)) { + this.singleObjects.put(CONTENT_FIELD_DS, packBodyMsg); + return packBodyMsg; } return null; } @@ -344,17 +330,17 @@ * @param clearZeroPlainBuf 解密后的业务报文内容 * @return */ - public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { - ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); - if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); - } - wholePlainBuf.writeBytes(clearZeroPlainBuf); - if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { - wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); - } - return wholePlainBuf; - } +// public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) { +// ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer(); +// if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT)); +// } +// wholePlainBuf.writeBytes(clearZeroPlainBuf); +// if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) { +// wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT)); +// } +// return wholePlainBuf; +// } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 22188b1..f619a27 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -2,7 +2,6 @@ import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.config.SensorhubProperties; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; @@ -13,7 +12,6 @@ import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; @@ -94,40 +92,40 @@ * 1、否有动态bean,没有去设置的bean,有则取之 * 2、bean不为空,进行解密操作,否则返回原文 * - * @param bizDataContent + * @param packBodyMsg * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getSafeDatagram(String packBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { //如果执行完合并的解密,不需要再次进行解密,直接跳出 if (textPlain) { - return bizDataContent; + return packBodyMsg; } String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + byte[] plainByte = safeStrategy.decryption(packBodyMsg); //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); + return clearComplementZero(ByteBufUtil.hexDump(plainByte), bizFieldLength); } - return bizDataContent; + return packBodyMsg; } - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + public String getPlainTextDatagram(String replyBodyMsg, Map fieldConfigMap, Supplier fieldLengthSupplier) { textPlain = true; String safeName = matchingRuleConfig.getSafeBean(); if (!StringUtils.isEmpty(safeName)) { Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); + byte[] plainBytes = safeStrategy.decryption(replyBodyMsg); //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + String plainMsg = clearComplementZero(ByteBufUtil.hexDump(plainBytes), bizFieldLength); + return StringUtils.isEmpty(plainMsg) ? "" : plainMsg; } - return bizDataContent; + return replyBodyMsg; } @@ -136,18 +134,18 @@ *

* 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + public String buildSafeDatagram(String replyMsgStr, Map fieldConfigMap) { String safeName = matchingRuleConfig.getSafeBean(); - ByteBuf cipherByteBuf = null; + String cipherMsg = ""; if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + String replyMsg = fillFrameStructZero(replyMsgStr, matchingRuleConfig.getSafeFillZeroCoefficient()); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; + byte[] cipherBytes = safeStrategy.encryption(replyMsg); + return ByteBufUtil.hexDump(cipherBytes); } - return cipherByteBuf; + return cipherMsg; } @@ -161,29 +159,30 @@ } /** + * 难点在于控制讲一个数组如何无损添加到另一个数组后面 * 解密清零操作 * - * @param plainBuf + * @param plainMsg * @return */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + private String clearComplementZero(String plainMsg, int bizFieldLength) { + Integer plainLength = plainMsg.length() / 2; + while ("00".equals(plainMsg.substring((plainLength - 1)*2, plainLength*2)) + && plainLength >= bizFieldLength) { plainLength--; } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; + plainMsg = plainMsg.substring(0, (plainLength) * 2); + return plainMsg; } /** * 加密补零操作 */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); + private String fillFrameStructZero(String replyMsgStr, Integer safeLength) { + while (replyMsgStr.length() % (safeLength*2) != 0) { + replyMsgStr += "00"; } - return replyBytes; + return replyMsgStr; } /** 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 8ede8fc..a5b1793 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 @@ -39,8 +39,7 @@ */ @Override public ByteBuf excute(ParseResult parseResult) { - ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); + 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(); @@ -54,25 +53,27 @@ //TODO 配置特定设备升级 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); - int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; - System.out.println("业务内容: " + ByteBufUtil.hexDump(replyBytes)); + String replyPackMsg = defaultRuleReply(sendRuleConfig, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); + int oldLength = replyPackMsg.length() / 2; + //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); + CallTagMsg callTagMsg = buildBizConfigFieldFrame(replyPackMsg, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + String replyBodyMsg = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(callTagMsg.getPackMsg(), fieldConfigsMap); //pareFrameBuild - Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); + Map fixMap = calculatedFrameLength(callTagMsg.getLength(), parseResult.getProtocolFactory()); //参数准备 - Boolean isDeliver = (oldLength != contentLength); + Boolean isDeliver = (oldLength != callTagMsg.getLength()); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap, fieldRuleConfigMap); - //组建CRC校验位 - replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); - System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyBytes)); + replyBodyMsg = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBodyMsg, fixMap, fieldRuleConfigMap); + System.out.println("数据内容head+body: " + replyBodyMsg); + //组建CRC校验位,并写入到 + ByteBuf replyPackByteBuf = ByteBufAllocator.DEFAULT.buffer(); + replyPackByteBuf.writeBytes(Hex.decode(replyBodyMsg+CRC16.getCRC(replyBodyMsg))); + System.out.println("CRC校验后: " + ByteBufUtil.hexDump(replyPackByteBuf)); //返回对象,是http请求?base4加密码:明文 - return parseResult.getRequestCode() ? Base64.encode(replyBytes) : replyBytes; + return parseResult.getRequestCode() ? Base64.encode(replyPackByteBuf) : replyPackByteBuf; } } 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 4dca86e..bec1e77 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 @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; import java.util.ArrayList; import java.util.HashMap; @@ -95,8 +94,9 @@ * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 */ - protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + protected String defaultRuleReply(RuleConfig ruleConfig, Map bizDataMap, + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { + String replyPackMsg = ""; try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -105,16 +105,16 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - ByteBuf byteBuf = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); - if (ObjectUtils.isNotEmpty(byteBuf)) { - replyBytes.writeBytes(byteBuf); + String tagPackMsg = FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); + if (StringUtils.isNotEmpty(tagPackMsg)) { + replyPackMsg += tagPackMsg; } } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); + replyPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, null, replyPackMsg, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } + return replyPackMsg; } /** @@ -124,10 +124,10 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { + protected CallTagMsg buildBizConfigFieldFrame(String replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 if (parseResult.getReplyCommand() != SUCCESS_DATA || !parseResult.getIsDeliveryConfig()) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } String devcode = parseResult.getDevcode(); AbstractRuleConfigFactory configFactory = parseResult.getRuleConfigFactory(); @@ -136,7 +136,7 @@ Map bizDataMap = redisCommon.getMsg(devcode); // 配置为空则直接返回值 if (ObjectUtils.isEmpty(bizDataMap)) { - return ByteBufUtil.hexDump(replyBytes).length() / 2; + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } //配置不为空,则进行查询组合字段配置 List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().getCombinedFieldConfigList().stream().filter( @@ -146,12 +146,12 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); + replyBytes += FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap); } - System.out.println(ByteBufUtil.hexDump(replyBytes)); - - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); - return ByteBufUtil.hexDump(replyBytes).length() / 2; + //简单的字段解析合并 + replyBytes+=FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); + System.out.println(replyBytes); + return CallTagMsg.builder().packMsg(replyBytes).length(replyBytes.length() / 2).build(); } /** @@ -181,6 +181,7 @@ // if (isDeliver) { // fixMap.put(PDU_TYPE, "3"); // } else { + fixMap.put(SEQ, "1"); switch (parseResult.getReplyCommand()) { case SUCCESS_DATA: fixMap.put(PDU_TYPE, "3"); @@ -207,9 +208,9 @@ * * @param frameStructByeBuf * @param protocolFieldConfigs - * @param replyBytes + * @param packBodyMsg */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { + protected String buildFrameBeforeFixedField(String frameStructByeBuf, List protocolFieldConfigs, String packBodyMsg, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -232,9 +233,9 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); + String headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 - headBuf.writeBytes(replyBytes); + headBuf += packBodyMsg; //将组合得到的帧作为结果进行返回 return headBuf; } @@ -265,7 +266,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { + protected String buildFrameTailFixedField(String frameStructByeBuf, List protocolFieldConfigs, String replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -273,9 +274,10 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); + String tailPackMsg = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 - replyBytes.writeBytes(tailBuf); + replyBytes += tailPackMsg; + return replyBytes; } /** @@ -284,36 +286,34 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { - ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); - frameStructByeBuf.resetReaderIndex(); - String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); + private String buildFixedFieldCommand(String fixContent, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { + String fixedMsgHead = ""; //前后发生变化,根据规则和字典表进行数据的构建 for (List fieldConfigs : sortPreFixFieldLists) { - ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + String tagPackMsg = "";//固定请求头 try { String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + ProtocolFieldConfigUtil.calculateOffset(fieldConfigs) * 2); - combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); + tagPackMsg = fieldContent; for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (!"1".equals(fieldConfig.getIsReplyFix())) { if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } else { - combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); + tagPackMsg=""; fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); + tagPackMsg = FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, tagPackMsg, fieldRuleConfigMap, null); } } } } catch (Exception ex) { log.error("异常,异常配置{},异常信息{}", JSON.toJSON(fieldConfigs), ex); } - fixedByteBuf.writeBytes(combinedFixedByteBuf); + fixedMsgHead += tagPackMsg; } - return fixedByteBuf; + return fixedMsgHead; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java index cf6d907..7fa5fc4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/AbstractValueTypeResolver.java @@ -7,6 +7,6 @@ */ public interface AbstractValueTypeResolver { - void invoke(Integer totalLength,Object currentValue, ByteBuf byteBuf,Boolean networkOrder); + String invoke(Integer totalLength,Object currentValue, String halfPackTag,Boolean networkOrder); } 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 39f37e6..353917a 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 @@ -7,12 +7,13 @@ import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; /** * @author cz @@ -21,18 +22,18 @@ public class BitFieldDecorator { /** - * 构建bitBuf + * 构建bitBuf * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { + public static String buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String packTagMsg, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -47,7 +48,7 @@ String binaryStr = ""; //取关键的值byteBuf if (originPosition != 0) { - Byte fields = dynamicContent.getByte(dynamicContent.writerIndex()); + Byte fields = Hex.decode(packTagMsg)[Hex.decode(packTagMsg).length - 1]; binaryStr = getBinaryStrFromByte(fields); binaryStr = binaryStr.substring(0, originPosition); } @@ -56,17 +57,20 @@ binaryStr += "0"; } byte[] bytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = null; //string 转化成byte - dynamicContent.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); + packTagMsg += ByteBufUtil.hexDump(bytes); +// byteBuf.writeBytes(bytes, dynamicContent.writerIndex() - 1, binaryStr.length() % 8); System.out.println(JSON.toJSON(fieldValue)); } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); } + return packTagMsg; } /** - * 从二进制字符串转为byte[] + * 从二进制字符串转为byte[] * * @param binaryStr * @return @@ -81,7 +85,7 @@ } /** - * 把byte转化成2进制字符串 + * 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index c3a00ce..730614a 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,25 +1,16 @@ 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.casic.missiles.pojo.CallTagMsg; import org.apache.commons.lang3.StringUtils; -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.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.ArrayList; -import java.util.List; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Function; /** @@ -36,16 +27,17 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { + public static String buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + return buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); + return buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -57,12 +49,13 @@ * @param currentValue * @param dynamicContent */ - private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + private static String buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, String dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; - valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + String halfPackTag = valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); + return halfPackTag; } /** @@ -75,8 +68,9 @@ * @param dynamicContent * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, - ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + private static String buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + String dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { + String halfPackTag = dynamicContent; try { String[] ruleStrs = ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 @@ -98,14 +92,16 @@ } //计算长度 if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = realLengthConsumer.apply(currentConfigValue instanceof String ? ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); - fieldConfig.setOffsetLength(realLength); + dynamicContent = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); } - buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); + halfPackTag = buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } + return halfPackTag; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index d6fad15..8ebce13 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -1,7 +1,7 @@ package com.casic.missiles.replier.decorator; +import io.netty.buffer.ByteBufUtil; import org.apache.commons.lang3.StringUtils; -import io.netty.buffer.ByteBuf; import org.bouncycastle.util.encoders.Hex; /** @@ -18,12 +18,13 @@ * * @param totalLength * @param currentObjectValue - * @param byteBuf + * @param halfPackTag */ @Override - public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf, Boolean networkOrder) { + public String invoke(Integer totalLength, Object currentObjectValue, String halfPackTag, Boolean networkOrder) { String hexStrValue = convertObjectToHexStr(currentObjectValue); - strToByteBuf(totalLength, hexStrValue, byteBuf, networkOrder); + halfPackTag = strToByteBuf(totalLength, hexStrValue, halfPackTag, networkOrder); + return halfPackTag; } /** @@ -31,9 +32,9 @@ * * @param totalLength 应填充的总长度 * @param currentStrValue 待填充的字符串 - * @param byteBuf 待使用的bytebuf + * @param halfPackTag 半包的tag信息 */ - private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf, Boolean networkOrder) { + private String strToByteBuf(Integer totalLength, String currentStrValue, String halfPackTag, Boolean networkOrder) { byte[] keyBytes = null; Integer fillIndex = 0; if (StringUtils.isNotEmpty(currentStrValue)) { @@ -47,24 +48,33 @@ //网络序处理,大端在后面,小端在前面 if (fillIndex != 0) { int tempIndex = fillIndex; - while (tempIndex > 0) { - byteBuf.writeByte(keyBytes[--tempIndex]); - } + //逆序,然后加上去 + byte[] reverseBytes = reverse(keyBytes); + halfPackTag += ByteBufUtil.hexDump(reverseBytes); } while (totalLength > fillIndex) { - byteBuf.writeByte(0); + halfPackTag += "00"; fillIndex++; } } else { int tempIndex = fillIndex; while (totalLength != null && totalLength > tempIndex) { - byteBuf.writeByte(0); + halfPackTag += "00"; tempIndex++; } if (fillIndex != 0) { - byteBuf.writeBytes(keyBytes); + halfPackTag += ByteBufUtil.hexDump(keyBytes); } } + return halfPackTag; + } + + public static byte[] reverse(byte[] array) { + byte[] reversed = new byte[array.length]; + for (int i = 0, j = array.length - 1; i < array.length; i++, j--) { + reversed[j] = array[i]; + } + return reversed; } /** 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 8f3c0f1..7435c91 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 @@ -5,20 +5,12 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; -import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.*; import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.*; -import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -37,16 +29,13 @@ * (2)处理长度字段的反构 * (3)将核心字段的反构,交给解析器进行反构 */ - public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { + public static String combinedField(Map fieldConfigsMap, + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { return null; } - ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); - //先构建oid编号 - fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, combinedFieldConfig.getPrefixCode(), fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -59,58 +48,64 @@ throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); }); if (dataFieldIds.length == 1) { - if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { - if (bizDataMap.get(combinedFieldConfig.getDataFieldName()) == null) { - return null; - } + if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(combinedFieldConfig.getDataFieldName()) && bizDataMap.get(combinedFieldConfig.getDataFieldName()) == null) { + return null; } fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); - return fragmentByte; + + String packTagMsg = simpleField(fieldConfigs, bizDataMap, "", fieldRuleConfigMap, realLengthConsumer); + return packTagMsg; } /** * 计算长度 + * 同时构建长度的报文 * * @param combinedFieldConfig * @param bizDataMap - * @param fragmentByte + * @param prefixCode * @param fieldConfigsMap * @param fieldRuleConfigMap * @return */ - private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, - Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, String prefixCode, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 return (Integer realLength) -> { + + String halfPackTag = ""; 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); + halfPackTag = simpleField(fieldConfigs, bizDataMap, prefixCode, fieldRuleConfigMap, null); } else { //静态配置的长度 AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); if (combinedFieldConfig.getLength() > 0) { combinedFieldConfig.setLength(combinedFieldConfig.getLength()); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + halfPackTag = valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), prefixCode, false); } else { - //改成回调 //以实际长度为准 int sampleStandardLength = 0 - combinedFieldConfig.getLength(); if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { //实际长度要小于等于参考长度 if (realLength <= sampleStandardLength) { - valueTypeResolver.invoke(2, realLength, fragmentByte, false); + halfPackTag = valueTypeResolver.invoke(2, realLength, prefixCode, false); combinedFieldConfig.setLength(realLength); + } } } } - return combinedFieldConfig.getLength(); + + return CallTagMsg.builder() + .length(combinedFieldConfig.getLength()) + .packMsg(halfPackTag) + .build(); }; } @@ -124,31 +119,31 @@ * * @param fieldConfigs * @param bizDataMap - * @param fragmentByte + * @param packTagMsg * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf - fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { + public static String simpleField(List fieldConfigs, Map bizDataMap, String + packTagMsg, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { - return null; + return packTagMsg; } //根据起始点排序 List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); - //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { - throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); - }); +// //校验是不是一个完整ByteBuf数组 +// Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { +// throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); +// }); Object prepareData = null; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { //判断是否存在业务值 if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); + packTagMsg = buildBuf(sortFieldConfig, prepareData, packTagMsg, fieldRuleConfigMap, realLengthConsumer); } - return fragmentByte; + return packTagMsg; } /** @@ -158,22 +153,24 @@ * * @param fieldConfig * @param currentConfigValue - * @param dynamicContent + * @param packTagMsg */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf - dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { + private static String buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, String + packTagMsg, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { if (realLengthConsumer != null) { - Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + CallTagMsg callTagMsg = 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); + packTagMsg = callTagMsg.getPackMsg(); + fieldConfig.setOffsetLength(callTagMsg.getLength()); + packTagMsg = BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, packTagMsg, fieldRuleConfigMap); } - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + packTagMsg = BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, packTagMsg, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); + packTagMsg = ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, packTagMsg, fieldRuleConfigMap, realLengthConsumer); } + return packTagMsg; } /** diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FrameAttributeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FrameAttributeEnums.java index c7fae41..1fda676 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/FrameAttributeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FrameAttributeEnums.java @@ -13,18 +13,18 @@ PDU_TYPE("PDUType", 2, 13), SEQ("Seq", 1, 15), CRC("CRC", 2, -1); -//// GetRequest("GetRequest", 1, "服务器GET请求", FrameStructEnum.OID_LIST_STRUCT.getValue()), -//// WakeupRequest("WakeupRequest", 10, "服务器唤醒设备", FrameStructEnum.OID_LIST_STRUCT.getValue()), -//// SetRequest("SetRequest", 3, "设置设备参数请求", FrameStructEnum.TAG_LIST_STRUCT.getValue()), -//// GetResponse("GetResponse", 2, "设备响应GET请求", FrameStructEnum.TAG_LIST_STRUCT.getValue()), -//// TrapRequest("TrapRequest", 4, "设备主动上报", FrameStructEnum.TAG_LIST_STRUCT.getValue()), -//// WakeupResponse ("WakeupResponse", 11, "设备响应服务器唤醒", FrameStructEnum.TAG_LIST_STRUCT.getValue()), -//// TrapResponse ("TrapResponse", 5, "设备主动上报响应", FrameStructEnum.TAG_STRUCT.getValue()), -//// OnlineRequest ("OnlineRequest", 6, "用于设备检查连接", FrameStructEnum.TAG_STRUCT.getValue()), -//// OnlineResponse ("OnlineResponse", 7, "用于设备检查连接", FrameStructEnum.TAG_STRUCT.getValue()), -//// StarupRequest ("StarupRequest", 8, "设备上报开机信息", FrameStructEnum.TAG_STRUCT.getValue()), -//// StarupResponse ("StarupResponse", 9, "设备上报开机信息响应", FrameStructEnum.TAG_STRUCT.getValue()), -//// SetResponse ("SetResponse", 12, "设备响应SET请求", FrameStructEnum.TAG_STRUCT.getValue()); +// GetRequest("GetRequest", 1, "服务器GET请求", FrameStructEnum.OID_LIST_STRUCT.getValue()), +// WakeupRequest("WakeupRequest", 10, "服务器唤醒设备", FrameStructEnum.OID_LIST_STRUCT.getValue()), +// SetRequest("SetRequest", 3, "设置设备参数请求", FrameStructEnum.TAG_LIST_STRUCT.getValue()), +// GetResponse("GetResponse", 2, "设备响应GET请求", FrameStructEnum.TAG_LIST_STRUCT.getValue()), +// TrapRequest("TrapRequest", 4, "设备主动上报", FrameStructEnum.TAG_LIST_STRUCT.getValue()), +// WakeupResponse ("WakeupResponse", 11, "设备响应服务器唤醒", FrameStructEnum.TAG_LIST_STRUCT.getValue()), +// TrapResponse ("TrapResponse", 5, "设备主动上报响应", FrameStructEnum.TAG_STRUCT.getValue()), +// OnlineRequest ("OnlineRequest", 6, "用于设备检查连接", FrameStructEnum.TAG_STRUCT.getValue()), +// OnlineResponse ("OnlineResponse", 7, "用于设备检查连接", FrameStructEnum.TAG_STRUCT.getValue()), +// StarupRequest ("StarupRequest", 8, "设备上报开机信息", FrameStructEnum.TAG_STRUCT.getValue()), +// StarupResponse ("StarupResponse", 9, "设备上报开机信息响应", FrameStructEnum.TAG_STRUCT.getValue()), +// SetResponse ("SetResponse", 12, "设备响应SET请求", FrameStructEnum.TAG_STRUCT.getValue()); /** * 名称 */