diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + public SensorhubCodec() { + super(new SensorhubDecoder(), new SensorhubEncoder()); + } } diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java new file mode 100644 index 0000000..987e18a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + System.out.println(ByteBufUtil.hexDump(byteBuf)); + } +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java new file mode 100644 index 0000000..987e18a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + System.out.println(ByteBufUtil.hexDump(byteBuf)); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index ac24e38..f25aa7c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,32 +1,41 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.codec.SensorhubCodec; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** - * SensorhubServerChannelInitialHandler + * */ @Service public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel socketChannel){ - ChannelPipeline pipeline = socketChannel.pipeline(); - pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); - pipeline.addLast("codec", new SensorhubCodec()); - pipeline.addLast(new LengthFieldPrepender(2)); - pipeline.addLast(new SensorhubServerHandler()); + @Autowired + private List proccessCodecList; + + @Override + protected void initChannel(SocketChannel socketChannel) { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast(new LoggingHandler(LogLevel.INFO)); + for (int i = 0; i < proccessCodecList.size(); i++) { + pipeline.addLast(proccessCodecList.get(0)); + } + pipeline.addLast(new MessageDecoder()); +// pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); +// pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast(new LengthFieldPrepender(2)); + pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 // pipeline.addLast(this.chatRespHandler); 对话处理器 - } + } } \ No newline at end of file diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java new file mode 100644 index 0000000..987e18a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + System.out.println(ByteBufUtil.hexDump(byteBuf)); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index ac24e38..f25aa7c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,32 +1,41 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.codec.SensorhubCodec; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** - * SensorhubServerChannelInitialHandler + * */ @Service public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel socketChannel){ - ChannelPipeline pipeline = socketChannel.pipeline(); - pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); - pipeline.addLast("codec", new SensorhubCodec()); - pipeline.addLast(new LengthFieldPrepender(2)); - pipeline.addLast(new SensorhubServerHandler()); + @Autowired + private List proccessCodecList; + + @Override + protected void initChannel(SocketChannel socketChannel) { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast(new LoggingHandler(LogLevel.INFO)); + for (int i = 0; i < proccessCodecList.size(); i++) { + pipeline.addLast(proccessCodecList.get(0)); + } + pipeline.addLast(new MessageDecoder()); +// pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); +// pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast(new LengthFieldPrepender(2)); + pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 // pipeline.addLast(this.chatRespHandler); 对话处理器 - } + } } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java index 7da8a40..1f37eda 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java @@ -14,6 +14,7 @@ @Override protected void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj.toString()); if (obj instanceof Msg) { Msg msg = (Msg) obj; System.out.println("Client->Server:" + JSON.toJSONString(msg)); diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java new file mode 100644 index 0000000..987e18a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + System.out.println(ByteBufUtil.hexDump(byteBuf)); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index ac24e38..f25aa7c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,32 +1,41 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.codec.SensorhubCodec; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** - * SensorhubServerChannelInitialHandler + * */ @Service public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel socketChannel){ - ChannelPipeline pipeline = socketChannel.pipeline(); - pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); - pipeline.addLast("codec", new SensorhubCodec()); - pipeline.addLast(new LengthFieldPrepender(2)); - pipeline.addLast(new SensorhubServerHandler()); + @Autowired + private List proccessCodecList; + + @Override + protected void initChannel(SocketChannel socketChannel) { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast(new LoggingHandler(LogLevel.INFO)); + for (int i = 0; i < proccessCodecList.size(); i++) { + pipeline.addLast(proccessCodecList.get(0)); + } + pipeline.addLast(new MessageDecoder()); +// pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); +// pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast(new LengthFieldPrepender(2)); + pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 // pipeline.addLast(this.chatRespHandler); 对话处理器 - } + } } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java index 7da8a40..1f37eda 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java @@ -14,6 +14,7 @@ @Override protected void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj.toString()); if (obj instanceof Msg) { Msg msg = (Msg) obj; System.out.println("Client->Server:" + JSON.toJSONString(msg)); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java new file mode 100644 index 0000000..7bd123f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java @@ -0,0 +1,47 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.List; + +@Component +@Slf4j +public class nbBeforeProccessCodec extends BeforeProccessCodec{ + + private final Base64Dialect dialect; + + public nbBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public nbBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java new file mode 100644 index 0000000..987e18a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + System.out.println(ByteBufUtil.hexDump(byteBuf)); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index ac24e38..f25aa7c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,32 +1,41 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.codec.SensorhubCodec; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** - * SensorhubServerChannelInitialHandler + * */ @Service public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel socketChannel){ - ChannelPipeline pipeline = socketChannel.pipeline(); - pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); - pipeline.addLast("codec", new SensorhubCodec()); - pipeline.addLast(new LengthFieldPrepender(2)); - pipeline.addLast(new SensorhubServerHandler()); + @Autowired + private List proccessCodecList; + + @Override + protected void initChannel(SocketChannel socketChannel) { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast(new LoggingHandler(LogLevel.INFO)); + for (int i = 0; i < proccessCodecList.size(); i++) { + pipeline.addLast(proccessCodecList.get(0)); + } + pipeline.addLast(new MessageDecoder()); +// pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); +// pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast(new LengthFieldPrepender(2)); + pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 // pipeline.addLast(this.chatRespHandler); 对话处理器 - } + } } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java index 7da8a40..1f37eda 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java @@ -14,6 +14,7 @@ @Override protected void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj.toString()); if (obj instanceof Msg) { Msg msg = (Msg) obj; System.out.println("Client->Server:" + JSON.toJSONString(msg)); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java new file mode 100644 index 0000000..7bd123f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java @@ -0,0 +1,47 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.List; + +@Component +@Slf4j +public class nbBeforeProccessCodec extends BeforeProccessCodec{ + + private final Base64Dialect dialect; + + public nbBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public nbBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index eefbc4a..4f897a8 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -14,24 +14,6 @@ port: 11412 password: ew5T4K3#203lwh redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer - # session: - # store-type: redis -#flowable数据源和多数据源配置 -casic: - kaptcha-open: false #是否开启登录时验证码 (true/false) - #kaptcha-open: false #是否开启登录时验证码 (true/false) - db: - init: - enable: false - spring-session-open: false #开启spring session -smartcity: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' logging: level.root: error level.com.casic: info diff --git a/sensorbub-common/pom.xml b/sensorbub-common/pom.xml index 6b0e15d..9856c17 100644 --- a/sensorbub-common/pom.xml +++ b/sensorbub-common/pom.xml @@ -41,6 +41,13 @@ ${redis.version} + + + + + + + \ No newline at end of file diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java index 988f355..81a221a 100644 --- a/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/HttpClientUtil.java @@ -1,127 +1,127 @@ -package com.casic.missiles.util; - -import lombok.AllArgsConstructor; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Component -@AllArgsConstructor -public class HttpClientUtil { - - public String sendHourGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "apiloction"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "1"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - - public String sendDayGet() { - String url = "http://123"; - Map param = new HashMap<>(); - param.put("key", "key"); - param.put("location", "location"); - param.put("language", "zh-Hans"); - param.put("unit", "c"); - param.put("start", "0"); - param.put("hours", "24"); - // 创建Httpclient对象 - CloseableHttpClient httpclient = HttpClients.createDefault(); - String resultString = ""; - CloseableHttpResponse response = null; - try { - httpclient = HttpClients.custom() - .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() - //忽略掉对服务器端证书的校验 - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(), NoopHostnameVerifier.INSTANCE)) - .build(); - // 创建uri - URIBuilder builder = new URIBuilder(url); - if (param != null) { - for (String key : param.keySet()) { - builder.addParameter(key, param.get(key)); - } - } - URI uri = builder.build(); - // 创建http GET请求 - HttpGet httpGet = new HttpGet(uri); - // 执行请求 - response = httpclient.execute(httpGet); - // 判断返回状态是否为200 - if (response.getStatusLine().getStatusCode() == 200) { - resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (response != null) { - response.close(); - } - httpclient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return resultString; - } - -} +//package com.casic.missiles.util; +// +//import lombok.AllArgsConstructor; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.utils.URIBuilder; +//import org.apache.http.conn.ssl.NoopHostnameVerifier; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.ssl.SSLContexts; +//import org.apache.http.util.EntityUtils; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.net.URI; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//@AllArgsConstructor +//public class HttpClientUtil { +// +// public String sendHourGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "apiloction"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "1"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +// public String sendDayGet() { +// String url = "http://123"; +// Map param = new HashMap<>(); +// param.put("key", "key"); +// param.put("location", "location"); +// param.put("language", "zh-Hans"); +// param.put("unit", "c"); +// param.put("start", "0"); +// param.put("hours", "24"); +// // 创建Httpclient对象 +// CloseableHttpClient httpclient = HttpClients.createDefault(); +// String resultString = ""; +// CloseableHttpResponse response = null; +// try { +// httpclient = HttpClients.custom() +// .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom() +// //忽略掉对服务器端证书的校验 +// .loadTrustMaterial(null, new TrustSelfSignedStrategy()) +// .build(), NoopHostnameVerifier.INSTANCE)) +// .build(); +// // 创建uri +// URIBuilder builder = new URIBuilder(url); +// if (param != null) { +// for (String key : param.keySet()) { +// builder.addParameter(key, param.get(key)); +// } +// } +// URI uri = builder.build(); +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(uri); +// // 执行请求 +// response = httpclient.execute(httpGet); +// // 判断返回状态是否为200 +// if (response.getStatusLine().getStatusCode() == 200) { +// resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } finally { +// try { +// if (response != null) { +// response.close(); +// } +// httpclient.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return resultString; +// } +// +//} diff --git a/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java new file mode 100644 index 0000000..9b3ab90 --- /dev/null +++ b/sensorbub-common/src/main/java/com/casic/missiles/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.missiles.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml index 56bd4fd..df05b97 100644 --- a/sensorhub-core/pom.xml +++ b/sensorhub-core/pom.xml @@ -57,9 +57,6 @@ 3.4.3 - - - org.apache.httpcomponents @@ -67,6 +64,12 @@ 4.5.7 + + org.bouncycastle + bcprov-jdk15to18 + 1.64 + + redis.clients diff --git a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java index 063a3c3..1b1a261 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/autoconfig/SensorhubProperties.java @@ -14,6 +14,8 @@ */ private Integer port = 7091; + private String secret; + } 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 333fbe7..96afa7d 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,12 +7,18 @@ 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 编解码器 */ public class SensorhubCodec extends CombinedChannelDuplexHandler { - public SensorhubCodec() { - super(new SensorhubDecoder(), new SensorhubEncoder()); - } + 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 b10d05a..c6982b3 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 @@ -32,7 +32,7 @@ if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); - Boolean protocolFlag = protocolSelector.selectorProvider(buffer); + Boolean protocolFlag = protocolSelector.doParseProtocol(buffer); // 标记包头开始的index // byte preamble = buffer.getByte(beginReader); // if (protocolFlag) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java deleted file mode 100644 index ff2709c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.casic.missiles.codec.decoder.processor; - -import com.alibaba.fastjson.JSONObject; -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.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -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; -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 -@Slf4j -@AllArgsConstructor -public class CodeGeneratorProvider { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); - DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); - dataSender(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态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 dataSender(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()); - //加上固定字段的数据 - 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/codec/decoder/processor/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java new file mode 100644 index 0000000..097d235 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/processor/GeneralProcessor.java @@ -0,0 +1,101 @@ +package com.casic.missiles.codec.decoder.processor; + +import com.alibaba.fastjson.JSONObject; +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.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +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; +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 +@Slf4j +@AllArgsConstructor +public class GeneralProcessor { + + private final FieldConfigDao fieldConfigDao; + private final ProcessorSelector processorSelector; + private final RulerProvider rulerProvider; + private final FieldParser fieldParser; + + /** + * 统一固定字段解析=>进行规则的查询的判断 + * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 + * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 + */ + public boolean codeGenerator(ByteBuf buffer, ProtocolConfig protocolConfig) { + try { + String protocolId = String.valueOf(protocolConfig.getId()); + Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); + RuleConfig ruleConfig = rulerProvider.RulerBuilder(fixDataMap,protocolId); + DatagramEventConfig datagramEventConfig = processorSelector.ProcessorProvider(String.valueOf(ruleConfig.getId())); + ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); + String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); + Map senderDataMap = dataBuilder(datagramEventConfig, bizDataMap, protocolId); + dataSender(datagramEventConfig, senderDataMap, protocolId); + return true; + } catch (Exception ex) { + log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", + ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); + return false; + } + } + + // 是否有动态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 dataSender(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()); + //加上固定字段的数据 + 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/codec/decoder/safe/impl/Sm4CryptStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java new file mode 100644 index 0000000..b2d4ebe --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/decoder/safe/impl/Sm4CryptStrategy.java @@ -0,0 +1,129 @@ +//package com.casic.missiles.codec.decoder.safe.impl; +// +//import org.bouncycastle.crypto.engines.SM4Engine; +//import org.bouncycastle.crypto.params.KeyParameter; +//import org.bouncycastle.util.encoders.Hex; +// +///** +// * SM4算法工具类 +// */ +//public class Sm4CryptStrategy { +// +// //加解密的字节快大小 +// public static final int BlockSize = 16; +// +// /** +// * SM4ECB加密算法,对内 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(true, new KeyParameter(keyBytes)); +// byte[] out = new byte[in.length]; +// int times = in.length / BlockSize; +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// return out; +// } +// +// /** +// * SM4ECB加密算法 +// * @param in 待加密字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbEncrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_encrypt(in, keyBytes); +// String cipher = Hex.toHexString(out); +// return cipher; +// } +// +// /** +// * SM4的ECB加密算法 +// * @param content 待加密字符串, hex字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbEncrypt(String content, String key) { +// byte[] in = Hex.decode(content); +// byte[] keyBytes = Hex.decode(key); +// +// String cipher = EcbEncrypt(in, keyBytes); +// return cipher; +// } +// +// /** +// * SM4的ECB解密算法,对内 +// * @param in 输入的密文字符串 +// * @param keyBytes 密钥 +// * @return +// */ +// private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) { +// SM4Engine sm4Engine = new SM4Engine(); +// sm4Engine.init(false, new KeyParameter(keyBytes)); +// int inLen = in.length; +// byte[] out = new byte[inLen]; +// +// int times = inLen / BlockSize; +// +// for (int i = 0; i < times; i++) { +// sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize); +// } +// +// return out; +// } +// +// /** +// * SM4的ECB解密算法,对外 +// * @param in 输入的密文字节数组 +// * @param keyBytes 密钥 +// * @return +// */ +// public static String EcbDecrypt(byte[] in, byte[] keyBytes) { +// byte[] out = ecb_decrypt(in, keyBytes); +// String plain = Hex.toHexString(out); +// return plain; +// } +// +// /** +// * SM4的ECB解密算法 +// * @param cipher 输入的密文字符串 +// * @param key 密钥 +// * @return +// */ +// public static String EcbDecrypt(String cipher, String key) { +// byte[] in = Hex.decode(cipher); +// byte[] keyBytes = Hex.decode(key); +// +// String plain = EcbDecrypt(in, keyBytes); +// return plain; +// } +// +// /** +// * 测试函数 +// */ +// public static void Sm4Test() { +// String data = "FB8661A82ADD944230C3AD3957DAA224"; +// String key ="8012BADD542E2C182DFD84795E65A013"; +// String resCipherData = EcbEncrypt(data,key); +// String resPlainData = EcbDecrypt(resCipherData,key); +// System.out.println("原始明文:" + data); +// System.out.println("加密后密文:" + resCipherData); +// System.out.println("解密后明文:" + resPlainData); +// } +// +// /** +// * 主函数 +// * @param args +// */ +// public static void main(String[] args) { +// Sm4Test(); +// } +// +//} +// +// +// diff --git a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 8a87bc0..cbd1916 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -28,6 +28,7 @@ ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String hexByte="A3200045312022080608C306080484016000002000015710000050000317041A60000009000100C5002D9E000400000000600005110002001C600005130002FF8F60000516000200095C46"; String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; demoByte = demoByte.replace(" ", ""); // try { 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 9220608..8ef70d8 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 @@ -13,7 +13,7 @@ /** * 初始化 */ - public List init(); + public List datagramInit(); /** * 根据前导码配置匹配,模糊匹配获取所有的报文项 @@ -23,11 +23,11 @@ /** * 根据前导码匹配,返回报文项 */ - public List filerByRule(); + public List filer(); /** * 保证数据的唯一性选择器 */ - public List selector(); + public List selectOne(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java index 64793cc..9f48983 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/ProtocolSelector.java @@ -4,6 +4,6 @@ public interface ProtocolSelector { - Boolean selectorProvider(ByteBuf byteBuf); + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java index 3246f2f..9f43341 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameLengthMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.pojo.ProtocolConfig; @@ -19,7 +19,7 @@ @Autowired private FieldParser fieldParser; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //超过长度 @Override @@ -43,7 +43,7 @@ byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent = byteBuf.slice(0, totalLength - 1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java index 9211bb8..5039817 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameMarkMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.codec.decoder.resolver.FieldParser; import com.casic.missiles.codec.decoder.resolver.FieldResolverManger; import com.casic.missiles.factory.FrameStructMatcher; @@ -28,7 +28,7 @@ public class FrameMarkMatcher implements FrameStructMatcher { private final FieldConfigDao fieldConfigDao; - private final CodeGeneratorProvider codeGeneratorProvider; + private final GeneralProcessor generalProcessor; private final FieldParser fieldParser; private final FieldResolverManger fieldResolverManger; @@ -93,7 +93,7 @@ standardFreame += tail; bufferContent.writeBytes(standardFreame.getBytes(Charset.forName("ISO-8859-1"))); System.out.println(ByteBufUtil.hexDump(bufferContent)); - codeGeneratorProvider.codeGenerator(bufferContent, protocolConfig); + generalProcessor.codeGenerator(bufferContent, protocolConfig); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java index 8d9dcda..c298d40 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/matcher/FrameTailMatcher.java @@ -1,7 +1,7 @@ package com.casic.missiles.factory.matcher; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.codec.decoder.processor.CodeGeneratorProvider; +import com.casic.missiles.codec.decoder.processor.GeneralProcessor; import com.casic.missiles.factory.FrameStructMatcher; import com.casic.missiles.mapper.dao.FieldConfigDao; import com.casic.missiles.pojo.FieldConfig; @@ -22,7 +22,7 @@ @Resource private FieldConfigDao fieldConfigDao; @Autowired - private CodeGeneratorProvider codeGeneratorProvider; + private GeneralProcessor generalProcessor; //结尾标志位后面还有数据怎么办 @Override @@ -48,7 +48,7 @@ byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf byteBufContent=byteBuf.slice(0,length-1); - codeGeneratorProvider.codeGenerator(byteBufContent, protocolConfig); + generalProcessor.codeGenerator(byteBufContent, protocolConfig); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java new file mode 100644 index 0000000..43a63fa --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/DefaultProtocolSelector.java @@ -0,0 +1,84 @@ +package com.casic.missiles.factory.selector; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.factory.FrameStructMatcher; +import com.casic.missiles.factory.ProtocolSelector; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service("defaultSelector") +@Slf4j +public class DefaultProtocolSelector implements ProtocolSelector { + + @Resource + private ProtocolConfigMapper protocolMapper; + @Autowired + List frameStructDispenserList; + + // 匹配首字母前导码=> 帧结构匹配前导码=> + // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 + // 2、存在该协议,经过帧结构判断进行数据分发 + @Override + public Boolean doParseProtocol(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List protocolConfigList = initialMatch(protocolContent); + List protocolFilterList = protocolConfigList.stream() + .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) + .collect(Collectors.toList()); + //如果不存在前导码,则需要判断是否拆包 + if (protocolFilterList.size() == 0) { + byteBuf.resetReaderIndex();//重置位判断 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } else {//判断拆包、封包 + frameDispenserManger(byteBuf, protocolFilterList.get(0)); + } + return true; + } + + private List initialMatch(String protocolContent) { + String protocolStr = protocolContent.charAt(1) + ""; + QueryWrapper queryWrapper = new QueryWrapper() + .like("pre_fix", protocolStr); + List protocolConfigList = protocolMapper.selectList(queryWrapper); + return protocolConfigList; + } + + private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + Boolean frameValidatorFlag = true; + for (int i = 0; i < frameStructDispenserList.size(); i++) { + frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); + } + return frameValidatorFlag; + } + +// public void serialEvent(SerialPortEvent event) { +// switch (event.getEventType()) { +// case SerialPortEvent.BI: // 通讯中断 +// case SerialPortEvent.OE: // 溢位错误 +// case SerialPortEvent.FE: // 帧错误 +// case SerialPortEvent.PE: // 奇偶校验错误 +// case SerialPortEvent.CD: // 载波检测 +// case SerialPortEvent.CTS: // 清除发送 +// case SerialPortEvent.DSR: // 数据设备准备好 +// case SerialPortEvent.RI: // 响铃侦测 +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 +// break; +// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 +// // 调用读取数据的方法 +// data = this.readFromPort(); +// break; +// default: +// break; +// } +// } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java deleted file mode 100644 index 8832c63..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/selector/StandardProtocolSelector.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.casic.missiles.factory.selector; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.factory.FrameStructMatcher; -import com.casic.missiles.factory.ProtocolSelector; -import com.casic.missiles.mapper.ProtocolConfigMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Service("standardSelector") -@Slf4j -public class StandardProtocolSelector implements ProtocolSelector { - - @Resource - private ProtocolConfigMapper protocolMapper; - @Autowired - List frameStructDispenserList; - - // 匹配首字母前导码=> 帧结构匹配前导码=> - // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 - // 2、存在该协议,经过帧结构判断进行数据分发 - @Override - public Boolean selectorProvider(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); - List protocolConfigList = initialMatch(protocolContent); - List protocolFilterList = protocolConfigList.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - //如果不存在前导码,则需要判断是否拆包 - if (protocolFilterList.size() == 0) { - byteBuf.resetReaderIndex();//重置位判断 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } else {//判断拆包、封包 - frameDispenserManger(byteBuf, protocolFilterList.get(0)); - } - return true; - } - - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(1) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .like("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; - } - - private Boolean frameDispenserManger(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Boolean frameValidatorFlag = true; - for (int i = 0; i < frameStructDispenserList.size(); i++) { - frameValidatorFlag = frameValidatorFlag && frameStructDispenserList.get(i).intactValidator(byteBuf, protocolConfig); - } - return frameValidatorFlag; - } - -// public void serialEvent(SerialPortEvent event) { -// switch (event.getEventType()) { -// case SerialPortEvent.BI: // 通讯中断 -// case SerialPortEvent.OE: // 溢位错误 -// case SerialPortEvent.FE: // 帧错误 -// case SerialPortEvent.PE: // 奇偶校验错误 -// case SerialPortEvent.CD: // 载波检测 -// case SerialPortEvent.CTS: // 清除发送 -// case SerialPortEvent.DSR: // 数据设备准备好 -// case SerialPortEvent.RI: // 响铃侦测 -// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 输出缓冲区已清空 -// break; -// case SerialPortEvent.DATA_AVAILABLE: // 有数据到达 -// // 调用读取数据的方法 -// data = this.readFromPort(); -// break; -// default: -// break; -// } -// } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java new file mode 100644 index 0000000..08788b2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/EventListener.java @@ -0,0 +1,6 @@ +package com.casic.missiles.listeners; + +public interface EventListener{ + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java new file mode 100644 index 0000000..2df07e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/listeners/event/DataGramLifeCycleEvent.java @@ -0,0 +1,9 @@ +package com.casic.missiles.listeners.event; + + +public class DataGramLifeCycleEvent { + + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java index 74619d9..d3bb9aa 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/SensorhubServer.java @@ -35,6 +35,8 @@ */ @Autowired private SensorhubProperties sensorhubProperties; + @Autowired + private SensorhubServerChannelInitialHandler serverChannelInitialHandler; public SensorhubServer(SensorhubProperties sensorhubProperties) { this.sensorhubProperties = sensorhubProperties; @@ -55,7 +57,7 @@ /** * 启动sensorhub服务 */ - public void startServer(){ + public void startServer() { new Thread(new Runnable() { @Override public void run() { @@ -69,7 +71,7 @@ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) // 设置EventLoopGroup .channel(NioServerSocketChannel.class) // 指明新的Channel的类型 - .childHandler(new SensorhubServerChannelInitialHandler()) // 指定ChannelHandler + .childHandler(serverChannelInitialHandler) // 指定ChannelHandler .option(ChannelOption.SO_BACKLOG, 1024) // 设置的ServerChannel的一些选项 .childOption(ChannelOption.SO_KEEPALIVE, true); // 当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端关闭了,那么服务端的连接可以关闭掉,释放资源 // 绑定端口,开始接收进来的连接 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java index 0ec6d91..a97a0d5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/client/handler/SensorhubClientChannelInitialHandler.java @@ -18,7 +18,7 @@ protected void initChannel(SocketChannel socketChannel){ ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast("codec", new SensorhubCodec()); // pipeline.addLast(new SensorhubDecoder()); // pipeline.addLast(new SensorhubEncoder()); pipeline.addLast(new SensorhubClientHandler()); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java new file mode 100644 index 0000000..bcc6db0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/AepBeforeProccessCodec.java @@ -0,0 +1,52 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 将从接口取到的数据编码 + * @author: Stone + * @create: 2019-01-11 15:15 + **/ +@Slf4j +@Service +public class AepBeforeProccessCodec extends BeforeProccessCodec { + private final Base64Dialect dialect; + + public AepBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public AepBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java new file mode 100644 index 0000000..9ac8cb3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/BeforeProccessCodec.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; + +import java.util.List; + +public class BeforeProccessCodec extends MessageToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + return; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java new file mode 100644 index 0000000..987e18a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/MessageDecoder.java @@ -0,0 +1,15 @@ +package com.casic.missiles.server.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + System.out.println(ByteBufUtil.hexDump(byteBuf)); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java index ac24e38..f25aa7c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerChannelInitialHandler.java @@ -1,32 +1,41 @@ package com.casic.missiles.server.handler; -import com.casic.missiles.codec.SensorhubCodec; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** - * SensorhubServerChannelInitialHandler + * */ @Service public class SensorhubServerChannelInitialHandler extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel socketChannel){ - ChannelPipeline pipeline = socketChannel.pipeline(); - pipeline.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); - pipeline.addLast("codec", new SensorhubCodec()); - pipeline.addLast(new LengthFieldPrepender(2)); - pipeline.addLast(new SensorhubServerHandler()); + @Autowired + private List proccessCodecList; + + @Override + protected void initChannel(SocketChannel socketChannel) { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast(new LoggingHandler(LogLevel.INFO)); + for (int i = 0; i < proccessCodecList.size(); i++) { + pipeline.addLast(proccessCodecList.get(0)); + } + pipeline.addLast(new MessageDecoder()); +// pipeline.addLast(new LengthFieldBasedFrameDecoder(1024*100, 0, 2, 0, 2)); +// pipeline.addLast("codec", new SensorhubCodec()); +// pipeline.addLast(new LengthFieldPrepender(2)); + pipeline.addLast(new SensorhubServerHandler()); // //心跳续约 // pipeline.addLast(this.heartBeatRespHandler); // pipeline.addLast(this.loginAuthRespHandler); 登录验证 // pipeline.addLast(this.chatRespHandler); 对话处理器 - } + } } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java index 7da8a40..1f37eda 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/SensorhubServerHandler.java @@ -14,6 +14,7 @@ @Override protected void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { + System.out.println("Client->Server:" + obj.toString()); if (obj instanceof Msg) { Msg msg = (Msg) obj; System.out.println("Client->Server:" + JSON.toJSONString(msg)); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java new file mode 100644 index 0000000..7bd123f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/server/handler/nbBeforeProccessCodec.java @@ -0,0 +1,47 @@ +package com.casic.missiles.server.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.base64.Base64; +import io.netty.handler.codec.base64.Base64Dialect; +import io.netty.util.internal.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.List; + +@Component +@Slf4j +public class nbBeforeProccessCodec extends BeforeProccessCodec{ + + private final Base64Dialect dialect; + + public nbBeforeProccessCodec() { + this(Base64Dialect.STANDARD); + } + + public nbBeforeProccessCodec(Base64Dialect dialect) { + this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); + } + + //执行nb平台前的协议解析 预处理 + @Override + public void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + //aep平台处理 + if (msg.toString(Charset.defaultCharset()).contains("aep")) { + String httpContent = msg.toString(Charset.defaultCharset()); + log.info(" String : " + msg.toString(Charset.defaultCharset())); + String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + log.info("----------------------------------" + values); + ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); + bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); + out.add(Base64.decode(bufferContent, bufferContent.readerIndex(), bufferContent.readableBytes(), this.dialect)); + } + } + +} diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index eefbc4a..4f897a8 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -14,24 +14,6 @@ port: 11412 password: ew5T4K3#203lwh redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer - # session: - # store-type: redis -#flowable数据源和多数据源配置 -casic: - kaptcha-open: false #是否开启登录时验证码 (true/false) - #kaptcha-open: false #是否开启登录时验证码 (true/false) - db: - init: - enable: false - spring-session-open: false #开启spring session -smartcity: - device: - redis: - invalid-time: 86400 - host: 111.198.10.15 - port: 11412 - password: ew5T4K3#203lwh - config-prefix: 'Casic:' logging: level.root: error level.com.casic: info diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index d0843ad..c3fce06 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -28,7 +28,7 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' - -#swagger: -# enable: true -# groupName: "硫化氢课题" \ No newline at end of file +sensorhub: + config: + port: 7091 + secret: \ No newline at end of file