diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 9f43341..d9929bf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -28,11 +28,11 @@ if (StringUtils.isEmpty(protocolConfig.getUnpackId())&&StringUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); if (ObjectUtil.isEmpty(totalLength)) { - if (dataGramContent.length() > totalLength) {//等于长度返回true,超出长度,切断 + if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 this.cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); return false; } else { - return false; + return true; } } } diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 9f43341..d9929bf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -28,11 +28,11 @@ if (StringUtils.isEmpty(protocolConfig.getUnpackId())&&StringUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); if (ObjectUtil.isEmpty(totalLength)) { - if (dataGramContent.length() > totalLength) {//等于长度返回true,超出长度,切断 + if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 this.cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); return false; } else { - return false; + return true; } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 5039817..b4a34ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -41,8 +41,9 @@ Integer upback = 0; if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig,null); - if (upback == 1){//使用esayRule + upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + //是否存在后续位 + if (upback == 1) {//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { @@ -51,7 +52,7 @@ upback = 1; } } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameLeng(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); } } if (upback == 1) { @@ -64,6 +65,7 @@ } //选取第一个帧,将业务内容和后面部分分开 + //计算数据报文-业务内容 private void cutOffPackageBuilder(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { //切割 byteBuf.readBytes(totalLength); @@ -71,10 +73,11 @@ byteBuf.markReaderIndex();//读的标志位前移 //重置 byteBufContent.resetReaderIndex(); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - String standardFreame = ""; + ByteBuf mergeFrameByte = ByteBufAllocator.DEFAULT.buffer(); + String mergeFrameStr = ""; String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); + //会存在多个帧拼接在一起的的情况,进行合并处理 while (hasNextFullFrame(byteBufContent, protocolConfig)) { Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); byteBufContent.readBytes(currentFrameLength); @@ -82,33 +85,41 @@ byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); + //获取当前固定帧结构的关系map Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); - if (StringUtils.isEmpty(standardFreame)) { - standardFreame += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); + if (StringUtils.isEmpty(mergeFrameStr)) { + //首次获取业务数据报文 + mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); tail = hexDump.substring(currentFrameFixedProperty.get("tailPosition")); } else { - standardFreame += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition")-1); + //再次获取业务数据报文 + mergeFrameStr += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition") - 1); } } - standardFreame += tail; - bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); - System.out.println(ByteBufUtil.hexDump(bufferContent)); - generalProcessor.codeGenerator(bufferContent, protocolConfig); + mergeFrameStr += tail; + mergeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1"))); + System.out.println(ByteBufUtil.hexDump(mergeFrameByte)); + generalProcessor.codeGenerator(mergeFrameByte, protocolConfig); } /** - * 平移到下一帧起始位置 + * 获取平移到下一帧起始位置 */ - public int getNextFrameLeng(ByteBuf buffer, ProtocolConfig protocolConfig) { + public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); return currentFrameFixedProperty.get("totalLength"); } + /** + * 判断是否出错进行整个帧的 + */ public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + //保证读取位置不在固定位置,是可变的业务内容 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { return false; } + //判断读取是否操作帧长度 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { return false; } diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 9f43341..d9929bf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -28,11 +28,11 @@ if (StringUtils.isEmpty(protocolConfig.getUnpackId())&&StringUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); if (ObjectUtil.isEmpty(totalLength)) { - if (dataGramContent.length() > totalLength) {//等于长度返回true,超出长度,切断 + if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 this.cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); return false; } else { - return false; + return true; } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 5039817..b4a34ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -41,8 +41,9 @@ Integer upback = 0; if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig,null); - if (upback == 1){//使用esayRule + upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + //是否存在后续位 + if (upback == 1) {//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { @@ -51,7 +52,7 @@ upback = 1; } } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameLeng(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); } } if (upback == 1) { @@ -64,6 +65,7 @@ } //选取第一个帧,将业务内容和后面部分分开 + //计算数据报文-业务内容 private void cutOffPackageBuilder(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { //切割 byteBuf.readBytes(totalLength); @@ -71,10 +73,11 @@ byteBuf.markReaderIndex();//读的标志位前移 //重置 byteBufContent.resetReaderIndex(); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - String standardFreame = ""; + ByteBuf mergeFrameByte = ByteBufAllocator.DEFAULT.buffer(); + String mergeFrameStr = ""; String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); + //会存在多个帧拼接在一起的的情况,进行合并处理 while (hasNextFullFrame(byteBufContent, protocolConfig)) { Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); byteBufContent.readBytes(currentFrameLength); @@ -82,33 +85,41 @@ byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); + //获取当前固定帧结构的关系map Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); - if (StringUtils.isEmpty(standardFreame)) { - standardFreame += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); + if (StringUtils.isEmpty(mergeFrameStr)) { + //首次获取业务数据报文 + mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); tail = hexDump.substring(currentFrameFixedProperty.get("tailPosition")); } else { - standardFreame += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition")-1); + //再次获取业务数据报文 + mergeFrameStr += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition") - 1); } } - standardFreame += tail; - bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); - System.out.println(ByteBufUtil.hexDump(bufferContent)); - generalProcessor.codeGenerator(bufferContent, protocolConfig); + mergeFrameStr += tail; + mergeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1"))); + System.out.println(ByteBufUtil.hexDump(mergeFrameByte)); + generalProcessor.codeGenerator(mergeFrameByte, protocolConfig); } /** - * 平移到下一帧起始位置 + * 获取平移到下一帧起始位置 */ - public int getNextFrameLeng(ByteBuf buffer, ProtocolConfig protocolConfig) { + public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); return currentFrameFixedProperty.get("totalLength"); } + /** + * 判断是否出错进行整个帧的 + */ public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + //保证读取位置不在固定位置,是可变的业务内容 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { return false; } + //判断读取是否操作帧长度 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { return false; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java index 43a63fa..cba0681 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.stream.Collectors; -@Service("defaultSelector") +@Service("defaultProtocolSelector") @Slf4j public class DefaultProtocolSelector implements ProtocolSelector { @@ -26,35 +26,38 @@ // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); List protocolFilterList = protocolConfigList.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 if (protocolFilterList.size() == 0) { + //error byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } - return true; } private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; + String protocolStr = protocolContent.charAt(0) + ""; QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); + .likeLeft("pre_fix", protocolStr); List protocolConfigList = protocolMapper.selectList(queryWrapper); return protocolConfigList; } private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { + for (int i = 0; i < frameStructDispenserList.size()&&frameValidatorFlag; i++) { + //帧结构判断该协议,经过帧结构判断选定帧协议,进行数据报文的解析 frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); } return frameValidatorFlag; diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 9f43341..d9929bf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -28,11 +28,11 @@ if (StringUtils.isEmpty(protocolConfig.getUnpackId())&&StringUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); if (ObjectUtil.isEmpty(totalLength)) { - if (dataGramContent.length() > totalLength) {//等于长度返回true,超出长度,切断 + if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 this.cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); return false; } else { - return false; + return true; } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 5039817..b4a34ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -41,8 +41,9 @@ Integer upback = 0; if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig,null); - if (upback == 1){//使用esayRule + upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + //是否存在后续位 + if (upback == 1) {//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { @@ -51,7 +52,7 @@ upback = 1; } } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameLeng(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); } } if (upback == 1) { @@ -64,6 +65,7 @@ } //选取第一个帧,将业务内容和后面部分分开 + //计算数据报文-业务内容 private void cutOffPackageBuilder(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { //切割 byteBuf.readBytes(totalLength); @@ -71,10 +73,11 @@ byteBuf.markReaderIndex();//读的标志位前移 //重置 byteBufContent.resetReaderIndex(); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - String standardFreame = ""; + ByteBuf mergeFrameByte = ByteBufAllocator.DEFAULT.buffer(); + String mergeFrameStr = ""; String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); + //会存在多个帧拼接在一起的的情况,进行合并处理 while (hasNextFullFrame(byteBufContent, protocolConfig)) { Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); byteBufContent.readBytes(currentFrameLength); @@ -82,33 +85,41 @@ byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); + //获取当前固定帧结构的关系map Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); - if (StringUtils.isEmpty(standardFreame)) { - standardFreame += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); + if (StringUtils.isEmpty(mergeFrameStr)) { + //首次获取业务数据报文 + mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); tail = hexDump.substring(currentFrameFixedProperty.get("tailPosition")); } else { - standardFreame += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition")-1); + //再次获取业务数据报文 + mergeFrameStr += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition") - 1); } } - standardFreame += tail; - bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); - System.out.println(ByteBufUtil.hexDump(bufferContent)); - generalProcessor.codeGenerator(bufferContent, protocolConfig); + mergeFrameStr += tail; + mergeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1"))); + System.out.println(ByteBufUtil.hexDump(mergeFrameByte)); + generalProcessor.codeGenerator(mergeFrameByte, protocolConfig); } /** - * 平移到下一帧起始位置 + * 获取平移到下一帧起始位置 */ - public int getNextFrameLeng(ByteBuf buffer, ProtocolConfig protocolConfig) { + public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); return currentFrameFixedProperty.get("totalLength"); } + /** + * 判断是否出错进行整个帧的 + */ public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + //保证读取位置不在固定位置,是可变的业务内容 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { return false; } + //判断读取是否操作帧长度 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { return false; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java index 43a63fa..cba0681 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.stream.Collectors; -@Service("defaultSelector") +@Service("defaultProtocolSelector") @Slf4j public class DefaultProtocolSelector implements ProtocolSelector { @@ -26,35 +26,38 @@ // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); List protocolFilterList = protocolConfigList.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 if (protocolFilterList.size() == 0) { + //error byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } - return true; } private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; + String protocolStr = protocolContent.charAt(0) + ""; QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); + .likeLeft("pre_fix", protocolStr); List protocolConfigList = protocolMapper.selectList(queryWrapper); return protocolConfigList; } private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { + for (int i = 0; i < frameStructDispenserList.size()&&frameValidatorFlag; i++) { + //帧结构判断该协议,经过帧结构判断选定帧协议,进行数据报文的解析 frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); } return frameValidatorFlag; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index a97a0d5..0ec6d91 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); -// pipeline.addLast("codec", new SensorhubCodec()); + pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 9f43341..d9929bf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -28,11 +28,11 @@ if (StringUtils.isEmpty(protocolConfig.getUnpackId())&&StringUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); if (ObjectUtil.isEmpty(totalLength)) { - if (dataGramContent.length() > totalLength) {//等于长度返回true,超出长度,切断 + if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 this.cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); return false; } else { - return false; + return true; } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 5039817..b4a34ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -41,8 +41,9 @@ Integer upback = 0; if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig,null); - if (upback == 1){//使用esayRule + upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + //是否存在后续位 + if (upback == 1) {//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { @@ -51,7 +52,7 @@ upback = 1; } } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameLeng(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); } } if (upback == 1) { @@ -64,6 +65,7 @@ } //选取第一个帧,将业务内容和后面部分分开 + //计算数据报文-业务内容 private void cutOffPackageBuilder(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { //切割 byteBuf.readBytes(totalLength); @@ -71,10 +73,11 @@ byteBuf.markReaderIndex();//读的标志位前移 //重置 byteBufContent.resetReaderIndex(); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - String standardFreame = ""; + ByteBuf mergeFrameByte = ByteBufAllocator.DEFAULT.buffer(); + String mergeFrameStr = ""; String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); + //会存在多个帧拼接在一起的的情况,进行合并处理 while (hasNextFullFrame(byteBufContent, protocolConfig)) { Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); byteBufContent.readBytes(currentFrameLength); @@ -82,33 +85,41 @@ byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); + //获取当前固定帧结构的关系map Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); - if (StringUtils.isEmpty(standardFreame)) { - standardFreame += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); + if (StringUtils.isEmpty(mergeFrameStr)) { + //首次获取业务数据报文 + mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); tail = hexDump.substring(currentFrameFixedProperty.get("tailPosition")); } else { - standardFreame += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition")-1); + //再次获取业务数据报文 + mergeFrameStr += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition") - 1); } } - standardFreame += tail; - bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); - System.out.println(ByteBufUtil.hexDump(bufferContent)); - generalProcessor.codeGenerator(bufferContent, protocolConfig); + mergeFrameStr += tail; + mergeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1"))); + System.out.println(ByteBufUtil.hexDump(mergeFrameByte)); + generalProcessor.codeGenerator(mergeFrameByte, protocolConfig); } /** - * 平移到下一帧起始位置 + * 获取平移到下一帧起始位置 */ - public int getNextFrameLeng(ByteBuf buffer, ProtocolConfig protocolConfig) { + public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); return currentFrameFixedProperty.get("totalLength"); } + /** + * 判断是否出错进行整个帧的 + */ public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + //保证读取位置不在固定位置,是可变的业务内容 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { return false; } + //判断读取是否操作帧长度 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { return false; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java index 43a63fa..cba0681 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.stream.Collectors; -@Service("defaultSelector") +@Service("defaultProtocolSelector") @Slf4j public class DefaultProtocolSelector implements ProtocolSelector { @@ -26,35 +26,38 @@ // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); List protocolFilterList = protocolConfigList.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 if (protocolFilterList.size() == 0) { + //error byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } - return true; } private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; + String protocolStr = protocolContent.charAt(0) + ""; QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); + .likeLeft("pre_fix", protocolStr); List protocolConfigList = protocolMapper.selectList(queryWrapper); return protocolConfigList; } private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { + for (int i = 0; i < frameStructDispenserList.size()&&frameValidatorFlag; i++) { + //帧结构判断该协议,经过帧结构判断选定帧协议,进行数据报文的解析 frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); } return frameValidatorFlag; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index a97a0d5..0ec6d91 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); -// pipeline.addLast("codec", new SensorhubCodec()); + pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index b135a66..4df654a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,7 +1,6 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.codec.SensorhubCodec; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; @@ -25,12 +24,12 @@ protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - for (int i = 0; i < proccessCodecList.size(); i++) { - pipeline.addLast(proccessCodecList.get(0)); - } - pipeline.addLast(new MessageDecoder()); +// for (int i = 0; i < proccessCodecList.size(); i++) { +// pipeline.addLast(proccessCodecList.get(0)); +// } +// pipeline.addLast(new MessageDecoder()); // pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); -// pipeline.addLast("codec", new SensorhubCodec()); + pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new LengthFieldPrepender(2)); pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java deleted file mode 100644 index 1c22b3f..0000000 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.util; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @Auther: cz - * @Date: 2021-10-26 - * 配置类,解决定时任务无法注入的问题 - */ -@Component -public class ApplicationContextUtil implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtil.applicationContext = applicationContext; - - } - - - public static Object getBean(String beanName) { - return applicationContext.getBean(beanName); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9bbd6da..235529c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig", +@ComponentScan({"com.casic.missiles.mapper","com.casic.missiles.autoconfig","com.casic.missiles.utils","com.casic.missiles.factory", "com.casic.missiles.codec","com.casic.missiles.server"}) @SpringBootApplication @EnableTransactionManagement(proxyTargetClass = true) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index c6982b3..cf24b39 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -1,7 +1,7 @@ package com.casic.missiles.codec.decoder; import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -31,40 +31,8 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); + ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); - // 标记包头开始的index -// byte preamble = buffer.getByte(beginReader); -// if (protocolFlag) { -// log.error("前导码:{},不合法", preamble); -// throw new Exception("前导码不合法"); -// } -// // 获取长度 -// byte[] lengthArr = new byte[FrameAttributeEnums.LENG.getLength()]; -// buffer.getBytes(beginReader + FrameAttributeEnums.LENG.getOffset(), lengthArr); -// // 计算协议内容长度 -// int contentLength = MsgUtil.getLength(lengthArr); - // 获取帧的长度 -// int frameLength = contentLength + FRAME_LEN_EXCLUDE_CONTENT; - // 判断可读的字节是否大于实际的帧的长度, 如果小于,则返回等待后续的数据 || 或者后续还有数据则等待后续数据 -// boolean hasNextAccess = MsgUtil.hasNextAccessByTransControlFlag(buffer); -// boolean hasNextAccess = MsgUtil.hasNextLoop(buffer); -// if (frameLength > buffer.readableBytes()){ // 说明有拆包的情况可以直接返回 -// return; -// } else - if (protocolFlag) { // 说明后续还有数据,存在粘包的情况,byteBuf中存在多个帧 - // 设置读下标到帧的尾部,方便后续帧的读取 - return; - } else { // 说明整个请求的所有数据已经都存储到了byteBuf中了,可以开始解析帧结构了 -// Msg msg = new Msg(); -// // 还原bytebuf的读下标到原始位置 -// buffer=buffer.resetReaderIndex(); -// boolean hasNext = transToMsg(buffer, msg); -// while (hasNext) { -// hasNext = transToMsg(buffer, msg); -// } -// list.add(msg); - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java index 097d235..bab1b46 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -7,7 +7,7 @@ import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; import com.casic.missiles.pojo.DatagramEventConfig; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -41,13 +41,21 @@ public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + //规则解析,规则循环匹配 RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + //选取规则对应的流程= DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + //密文解析 String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + //构建发送解析任务 Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 15bed91..3524fbb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java index 1bbdfd1..2e99039 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/fields/StandardFieldParser.java @@ -76,6 +76,7 @@ for (String filterField : filterFieldList) { FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 totalFilterLength += fieldConfig.getOffsetLength(); } @@ -90,14 +91,19 @@ // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 @Override public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { + //业务内容 String lightText = buffer.toString(Charset.forName("ISO-8859-1")); String protocolId = String.valueOf(protocolConfig.getId()); List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + //计算固定长度 Integer fixedLength = calculateLength(fieldConfigList); // Integer totalLength = this.getTotalLength(protocolConfig, buffer); + //总长度获取 Integer totalLength = lightText.length(); + //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); +// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + //计算数据报文内容 ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); return bizDataFields; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java index fb8e4cb..c1974a8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/rule/RulerProvider.java @@ -27,11 +27,15 @@ //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 //=>循环判断=>通过规则得到业务字段 public RuleConfig RulerBuilder(Map fixDataMap, String protocolId) { + //批量获取规则 List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); + //获取固定字段 Map fixFieldMap = getAllFieldMap(protocolId); + //获取前置规则字段 final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); + //递归选定解析规则,进行规则解析 while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); @@ -40,7 +44,7 @@ } /** - * 规则字段 + * 获取前置规则解析字段 */ private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { Map ruleFieldMap= new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java index 5dfe6dd..da63217 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/CommandDelivery.java @@ -3,7 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.codec.decoder.safe.SafeStrategy; import com.casic.missiles.codec.encoder.delivery.service.ComandeEventService; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java index a7c0459..0deef2e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/delivery/FieldDecoratorManger.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.codec.encoder.delivery.decorator.ByteDecorator; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.utils.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 9f43341..d9929bf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -28,11 +28,11 @@ if (StringUtils.isEmpty(protocolConfig.getUnpackId())&&StringUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); if (ObjectUtil.isEmpty(totalLength)) { - if (dataGramContent.length() > totalLength) {//等于长度返回true,超出长度,切断 + if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 this.cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); return false; } else { - return false; + return true; } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 5039817..b4a34ff 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -41,8 +41,9 @@ Integer upback = 0; if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig,null); - if (upback == 1){//使用esayRule + upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + //是否存在后续位 + if (upback == 1) {//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { @@ -51,7 +52,7 @@ upback = 1; } } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameLeng(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); } } if (upback == 1) { @@ -64,6 +65,7 @@ } //选取第一个帧,将业务内容和后面部分分开 + //计算数据报文-业务内容 private void cutOffPackageBuilder(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { //切割 byteBuf.readBytes(totalLength); @@ -71,10 +73,11 @@ byteBuf.markReaderIndex();//读的标志位前移 //重置 byteBufContent.resetReaderIndex(); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - String standardFreame = ""; + ByteBuf mergeFrameByte = ByteBufAllocator.DEFAULT.buffer(); + String mergeFrameStr = ""; String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); + //会存在多个帧拼接在一起的的情况,进行合并处理 while (hasNextFullFrame(byteBufContent, protocolConfig)) { Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); byteBufContent.readBytes(currentFrameLength); @@ -82,33 +85,41 @@ byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); + //获取当前固定帧结构的关系map Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); - if (StringUtils.isEmpty(standardFreame)) { - standardFreame += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); + if (StringUtils.isEmpty(mergeFrameStr)) { + //首次获取业务数据报文 + mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); tail = hexDump.substring(currentFrameFixedProperty.get("tailPosition")); } else { - standardFreame += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition")-1); + //再次获取业务数据报文 + mergeFrameStr += hexDump.substring(currentFrameFixedProperty.get("fixedPosition"), currentFrameFixedProperty.get("tailPosition") - 1); } } - standardFreame += tail; - bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); - System.out.println(ByteBufUtil.hexDump(bufferContent)); - generalProcessor.codeGenerator(bufferContent, protocolConfig); + mergeFrameStr += tail; + mergeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1"))); + System.out.println(ByteBufUtil.hexDump(mergeFrameByte)); + generalProcessor.codeGenerator(mergeFrameByte, protocolConfig); } /** - * 平移到下一帧起始位置 + * 获取平移到下一帧起始位置 */ - public int getNextFrameLeng(ByteBuf buffer, ProtocolConfig protocolConfig) { + public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); return currentFrameFixedProperty.get("totalLength"); } + /** + * 判断是否出错进行整个帧的 + */ public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + //保证读取位置不在固定位置,是可变的业务内容 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { return false; } + //判断读取是否操作帧长度 if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { return false; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java index 43a63fa..cba0681 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.stream.Collectors; -@Service("defaultSelector") +@Service("defaultProtocolSelector") @Slf4j public class DefaultProtocolSelector implements ProtocolSelector { @@ -26,35 +26,38 @@ // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); List protocolFilterList = protocolConfigList.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 if (protocolFilterList.size() == 0) { + //error byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); + return frameDispenserManger(byteBuf, protocolFilterList.get(0)); } - return true; } private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; + String protocolStr = protocolContent.charAt(0) + ""; QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); + .likeLeft("pre_fix", protocolStr); List protocolConfigList = protocolMapper.selectList(queryWrapper); return protocolConfigList; } private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { + for (int i = 0; i < frameStructDispenserList.size()&&frameValidatorFlag; i++) { + //帧结构判断该协议,经过帧结构判断选定帧协议,进行数据报文的解析 frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); } return frameValidatorFlag; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index a97a0d5..0ec6d91 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); -// pipeline.addLast("codec", new SensorhubCodec()); + pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index b135a66..4df654a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,7 +1,6 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.codec.SensorhubCodec; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; @@ -25,12 +24,12 @@ protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - for (int i = 0; i < proccessCodecList.size(); i++) { - pipeline.addLast(proccessCodecList.get(0)); - } - pipeline.addLast(new MessageDecoder()); +// for (int i = 0; i < proccessCodecList.size(); i++) { +// pipeline.addLast(proccessCodecList.get(0)); +// } +// pipeline.addLast(new MessageDecoder()); // pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); -// pipeline.addLast("codec", new SensorhubCodec()); + pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new LengthFieldPrepender(2)); pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/utils/ApplicationContextUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/utils/ApplicationContextUtil.java new file mode 100644 index 0000000..4baa500 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/utils/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * @Auther: cz + * @Date: 2021-10-26 + * 配置类,解决定时任务无法注入的问题 + */ +@Component +public class ApplicationContextUtil implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + ApplicationContextUtil.applicationContext = applicationContext; + + } + + + public static Object getBean(String beanName) { + return applicationContext.getBean(beanName); + } +}