diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.RuleDict; import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java new file mode 100644 index 0000000..8d3e559 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java @@ -0,0 +1,38 @@ +package com.casic.missiles.factory; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@AllArgsConstructor +public class LeadingCodeMatcher { + + private final ProtocolConfigMapper protocolMapper; + + //** 1、首字母匹配前导码, + // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 + public List matchLeadingCode(String protocolContent){ + List initialConfigs = initialMatch(protocolContent); + List preCodeConfigs = initialConfigs.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + return preCodeConfigs; + } + + //初始化匹配前导码内容 + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(0) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .likeRight("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map
+ * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java new file mode 100644 index 0000000..8d3e559 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java @@ -0,0 +1,38 @@ +package com.casic.missiles.factory; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@AllArgsConstructor +public class LeadingCodeMatcher { + + private final ProtocolConfigMapper protocolMapper; + + //** 1、首字母匹配前导码, + // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 + public List matchLeadingCode(String protocolContent){ + List initialConfigs = initialMatch(protocolContent); + List preCodeConfigs = initialConfigs.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + return preCodeConfigs; + } + + //初始化匹配前导码内容 + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(0) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .likeRight("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map
+ * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java new file mode 100644 index 0000000..8d3e559 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java @@ -0,0 +1,38 @@ +package com.casic.missiles.factory; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@AllArgsConstructor +public class LeadingCodeMatcher { + + private final ProtocolConfigMapper protocolMapper; + + //** 1、首字母匹配前导码, + // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 + public List matchLeadingCode(String protocolContent){ + List initialConfigs = initialMatch(protocolContent); + List preCodeConfigs = initialConfigs.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + return preCodeConfigs; + } + + //初始化匹配前导码内容 + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(0) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .likeRight("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map
+ * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map dataBuilder(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getDataBuilderBean()); + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { //加上固定字段的数据 bizDataMap.putAll(getFixedField(protocolId)); return bizDataMap; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java index b5b5857..80ec65c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/resolver/ByteMergeProvider.java @@ -25,7 +25,7 @@ public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { String values = ""; RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - Map vaildMap = getVaildRangeMap(vaildRange); + Map vaildMap = getValidRangeMap(vaildRange); try { fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); if (ObjectUtil.isEmpty(fieldRuleEngine)) { @@ -45,7 +45,7 @@ } } - private Map getVaildRangeMap(String vaildRange) { + private Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { 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 3524fbb..9b95b9f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.ByteResolverParam; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -30,22 +30,24 @@ //1、字段截取 => 2、简单的字节解析和复杂的字节解析 public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); + //最大固定位置不为空, if (!ObjectUtil.isEmpty(maxFixedPosition)) { orignPosition -= maxFixedPosition; } Object fieldValue = 0; + //待优化 if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); + fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); } return fieldValue; } //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object fieldsResolveManger(ByteBuf byteBuf, String ruleJson) { + private Object parsingFields(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (ObjectUtil.isEmpty(ruleMapList)) { @@ -112,7 +114,7 @@ } System.out.println(JSON.toJSON(customizeResolveValue)); return customizeResolveValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } @@ -162,7 +164,7 @@ } System.out.println(JSON.toJSON(fieldValue)); return fieldValue; - } catch (Exception ex) { + } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } 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 da63217..5dfe6dd 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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 0deef2e..a7c0459 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.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/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java index 8ef70d8..b066f10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/DatagramFactory.java @@ -6,7 +6,10 @@ import java.util.List; /** - * 对基本配置进行缓存,同时保证数据的使用便捷性 + * 数据库访问优化(暂时未做) + * + * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java new file mode 100644 index 0000000..8d3e559 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java @@ -0,0 +1,38 @@ +package com.casic.missiles.factory; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@AllArgsConstructor +public class LeadingCodeMatcher { + + private final ProtocolConfigMapper protocolMapper; + + //** 1、首字母匹配前导码, + // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 + public List matchLeadingCode(String protocolContent){ + List initialConfigs = initialMatch(protocolContent); + List preCodeConfigs = initialConfigs.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + return preCodeConfigs; + } + + //初始化匹配前导码内容 + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(0) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .likeRight("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map
+ * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 + * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 */ public interface DatagramFactory { @@ -26,8 +29,9 @@ public List filer(); /** - * 保证数据的唯一性选择器 + * 保证数据的唯一性选择器 */ public List selectOne(); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java index c107266..3c27f94 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/FrameStructMatcher.java @@ -3,8 +3,14 @@ import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; +/** + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 + */ public interface FrameStructMatcher{ - Boolean intactValidator(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java new file mode 100644 index 0000000..88e00c0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/GenericProtocolParser.java @@ -0,0 +1,141 @@ +package com.casic.missiles.factory; + +import com.casic.missiles.codec.decoder.processor.ProcessorSelector; +import com.casic.missiles.codec.decoder.resolver.FieldParser; +import com.casic.missiles.codec.decoder.rule.RulerProvider; +import com.casic.missiles.codec.decoder.safe.SafeStrategy; +import com.casic.missiles.codec.decoder.sender.DataSubscribeProvider; +import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service("defaultProtocolSelector") +@Slf4j +@AllArgsConstructor +public class GenericProtocolParser implements ProtocolSelector { + + private final LeadingCodeMatcher leadingCodeMatcher; + private final List frameStructDispenserList; + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + //匹配前导码 + List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 + if (preCodeConfigs.size() == 0) { + return rematch(byteBuf,protocolContent); + } + //暂时先取第一个 + ProtocolConfig protocolConfig = preCodeConfigs.get(0); + ByteBuf wholeDatagramByte = null; + //通过匹配帧结构获取完整的数据包 + for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { + //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + break; + } + } + //没有匹配成功 + if (wholeDatagramByte == null) { + return false; + } + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + String protocolId = String.valueOf(protocolConfig.getId()); + //统一固定字段解析 + Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); + //规则解析,规则循环匹配 + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap, protocolId); + //选取规则对应的流程= + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + //选定业务字段内容 + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + //密文解析 + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + //解析业务字段 + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + //构建发送解析任务 + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); + return true; + } + + private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + //重置位判断 + byteBuf.resetReaderIndex(); + //判断重置是否前移,如果没有前移,则直接判为匹配失败 + if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + return false; + } else { + return doParseProtocol(byteBuf); + } + } + + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { + String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() + : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String lightText = ""; +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); + return lightText; + } + return bizDataContent.toString(Charset.forName("ISO-8859-1")); + } + + //数据发送 + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); + dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + + } + + //数据构建 + private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //加上固定字段的数据 + bizDataMap.putAll(getFixedField(protocolId)); + return bizDataMap; + } + + //获取固定字段 + private Map getFixedField(String protocolId) { + Map fixedDataMap = new HashMap<>(); + List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); + fieldConfigList.stream().forEach( + fieldConfig -> { + fixedDataMap.put(fieldConfig.getFieldName(), ""); + } + ); + return fixedDataMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java new file mode 100644 index 0000000..8d3e559 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/LeadingCodeMatcher.java @@ -0,0 +1,38 @@ +package com.casic.missiles.factory; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@AllArgsConstructor +public class LeadingCodeMatcher { + + private final ProtocolConfigMapper protocolMapper; + + //** 1、首字母匹配前导码, + // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 + public List matchLeadingCode(String protocolContent){ + List initialConfigs = initialMatch(protocolContent); + List preCodeConfigs = initialConfigs.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + return preCodeConfigs; + } + + //初始化匹配前导码内容 + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(0) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .likeRight("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + +} diff --git a/pom.xml b/pom.xml index 21fc7b1..96a11a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,11 +23,9 @@ 2.0.0.alpha 2.0.0.alpha - 2.0.0.alpha 3.5.2 - 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 new file mode 100644 index 0000000..1c22b3f --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/ApplicationContextUtil.java @@ -0,0 +1,33 @@ +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/RedisCommon.java b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java index f15a0cb..828daa0 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -19,9 +19,9 @@ @Autowired protected RedisTemplate redisTemplate; - @Value("${smartcity.device.redis.invalid-time}") + @Value("${casic.device.redis.invalid-time}") private String invalidTime; - @Value("${smartcity.device.redis.config-prefix}") + @Value("${casic.device.redis.config-prefix}") private String configPrefix; diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index df05b97..8cf9520 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -30,7 +30,6 @@ 2.4.5 - org.projectlombok lombok @@ -78,6 +77,12 @@ jar + + sensorhub + com.casic + 0.0.1-SNAPSHOT + + 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 235529c..24b1e76 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -1,18 +1,17 @@ package com.casic.missiles; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@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 +@SpringBootApplication(scanBasePackages = "com.casic.missiles") +@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"}) @EnableTransactionManagement(proxyTargetClass = true) @Slf4j public class SensorhubServerApplication implements CommandLineRunner { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java index 519c062..624ed4f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubServerAutoConfiguration.java @@ -1,6 +1,6 @@ package com.casic.missiles.autoconfig; -import com.casic.missiles.server.SensorhubServer; +import com.casic.missiles.netty.SensorhubServer; import io.netty.bootstrap.ServerBootstrap; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java index 96afa7d..87decbc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/SensorhubCodec.java @@ -7,16 +7,11 @@ import com.casic.missiles.codec.encoder.SensorhubEncoder; import io.netty.channel.CombinedChannelDuplexHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - /** - * SensorhubCodec 编解码器 + * SensorhubCodec 自定义组合协议编解码器(废弃) */ public class SensorhubCodec extends CombinedChannelDuplexHandler { + public SensorhubCodec() { super(new SensorhubDecoder(), new SensorhubEncoder()); } 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 cf24b39..e90fab7 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; @@ -29,9 +29,11 @@ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) throws Exception { // 可读长度必须大于帧的最小长度 - if (buffer.readableBytes() >= MIN_FRAME_LEN){ - // 记录包头开始的index + if (buffer.readableBytes() >= MIN_FRAME_LEN) { + System.out.println(ByteBufUtil.hexDump(buffer)); + //这里可以增加一些前置处理,例如判断拆包合包等网络流的操作 ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("defaultProtocolSelector"); + // 记录包头开始的index Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); } } 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 bab1b46..aeeea2f 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.utils.ApplicationContextUtil; +import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.RuleConfig; @@ -38,7 +38,8 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + @Deprecated + public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { try { String protocolId = String.valueOf(protocolConfig.getId()); //统一固定字段解析 @@ -54,9 +55,9 @@ //解析业务字段 Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); //构建发送解析任务 - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - - dataSender(datagramEventConfig, senderDataMap, protocolId); + Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + //数据发送 + storeData(datagramEventConfig, senderDataMap, protocolId); return true; } catch (Exception ex) { log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", @@ -80,15 +81,14 @@ } //数据发送 - private void dataSender(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } //数据构建 - private Map