mh
2 months ago
118 changed files with 3081 additions and 5090 deletions
@ -1,117 +1,117 @@ |
|||||||
package com.mh.user.config; |
//package com.mh.user.config;
|
||||||
|
//
|
||||||
import java.sql.SQLException; |
//import java.sql.SQLException;
|
||||||
import java.util.ArrayList; |
//import java.util.ArrayList;
|
||||||
import java.util.List; |
//import java.util.List;
|
||||||
|
//
|
||||||
import javax.servlet.Filter; |
//import javax.servlet.Filter;
|
||||||
import javax.servlet.Servlet; |
//import javax.servlet.Servlet;
|
||||||
import javax.sql.DataSource; |
//import javax.sql.DataSource;
|
||||||
|
//
|
||||||
import com.alibaba.druid.wall.WallConfig; |
//import com.alibaba.druid.wall.WallConfig;
|
||||||
import com.alibaba.druid.wall.WallFilter; |
//import com.alibaba.druid.wall.WallFilter;
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
//import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.boot.web.servlet.FilterRegistrationBean; |
//import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean; |
//import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
import org.springframework.context.annotation.Bean; |
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration; |
//import org.springframework.context.annotation.Configuration;
|
||||||
|
//
|
||||||
import com.alibaba.druid.pool.DruidDataSource; |
//import com.alibaba.druid.pool.DruidDataSource;
|
||||||
import com.alibaba.druid.support.http.StatViewServlet; |
//import com.alibaba.druid.support.http.StatViewServlet;
|
||||||
import com.alibaba.druid.support.http.WebStatFilter; |
//import com.alibaba.druid.support.http.WebStatFilter;
|
||||||
|
//
|
||||||
/** |
///**
|
||||||
* @author ljf |
// * @author ljf
|
||||||
* @title : |
// * @title :
|
||||||
* @description : |
// * @description :
|
||||||
* @updateTime 2020-03-13 |
// * @updateTime 2020-03-13
|
||||||
* @throws : |
// * @throws :
|
||||||
*/ |
// */
|
||||||
@Configuration |
//@Configuration
|
||||||
@EnableConfigurationProperties({DruidDataSourceProperties.class}) |
//@EnableConfigurationProperties({DruidDataSourceProperties.class})
|
||||||
public class DruidConfig { |
//public class DruidConfig {
|
||||||
@Autowired |
// @Autowired
|
||||||
private DruidDataSourceProperties properties; |
// private DruidDataSourceProperties properties;
|
||||||
|
//
|
||||||
@Bean |
// @Bean
|
||||||
@ConditionalOnMissingBean |
// @ConditionalOnMissingBean
|
||||||
public DataSource druidDataSource() { |
// public DataSource druidDataSource() {
|
||||||
DruidDataSource druidDataSource = new DruidDataSource(); |
// DruidDataSource druidDataSource = new DruidDataSource();
|
||||||
druidDataSource.setDriverClassName(properties.getDriverClassName()); |
// druidDataSource.setDriverClassName(properties.getDriverClassName());
|
||||||
druidDataSource.setUrl(properties.getUrl()); |
// druidDataSource.setUrl(properties.getUrl());
|
||||||
druidDataSource.setUsername(properties.getUsername()); |
// druidDataSource.setUsername(properties.getUsername());
|
||||||
druidDataSource.setPassword(properties.getPassword()); |
// druidDataSource.setPassword(properties.getPassword());
|
||||||
druidDataSource.setInitialSize(properties.getInitialSize()); |
// druidDataSource.setInitialSize(properties.getInitialSize());
|
||||||
druidDataSource.setMinIdle(properties.getMinIdle()); |
// druidDataSource.setMinIdle(properties.getMinIdle());
|
||||||
druidDataSource.setMaxActive(properties.getMaxActive()); |
// druidDataSource.setMaxActive(properties.getMaxActive());
|
||||||
druidDataSource.setMaxWait(properties.getMaxWait()); |
// druidDataSource.setMaxWait(properties.getMaxWait());
|
||||||
druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis()); |
// druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
|
||||||
druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis()); |
// druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
|
||||||
druidDataSource.setValidationQuery(properties.getValidationQuery()); |
// druidDataSource.setValidationQuery(properties.getValidationQuery());
|
||||||
druidDataSource.setTestWhileIdle(properties.isTestWhileIdle()); |
// druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
|
||||||
druidDataSource.setTestOnBorrow(properties.isTestOnBorrow()); |
// druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
|
||||||
druidDataSource.setTestOnReturn(properties.isTestOnReturn()); |
// druidDataSource.setTestOnReturn(properties.isTestOnReturn());
|
||||||
druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements()); |
// druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
|
||||||
druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize()); |
// druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
|
||||||
|
//
|
||||||
List list=new ArrayList<>(); |
// List list=new ArrayList<>();
|
||||||
WallFilter wallFilter=new WallFilter(); |
// WallFilter wallFilter=new WallFilter();
|
||||||
WallConfig config = new WallConfig(); |
// WallConfig config = new WallConfig();
|
||||||
//允许一次执行多条语句
|
// //允许一次执行多条语句
|
||||||
config.setMultiStatementAllow(true); |
// config.setMultiStatementAllow(true);
|
||||||
//允许非基本语句的其他语句
|
// //允许非基本语句的其他语句
|
||||||
//config.setNoneBaseStatementAllow(true);
|
// //config.setNoneBaseStatementAllow(true);
|
||||||
wallFilter.setConfig(config); |
// wallFilter.setConfig(config);
|
||||||
list.add(wallFilter); |
// list.add(wallFilter);
|
||||||
druidDataSource.setProxyFilters(list); |
// druidDataSource.setProxyFilters(list);
|
||||||
|
//
|
||||||
try { |
// try {
|
||||||
druidDataSource.setFilters(properties.getFilters()); |
// druidDataSource.setFilters(properties.getFilters());
|
||||||
druidDataSource.init(); |
// druidDataSource.init();
|
||||||
} catch (SQLException e) { |
// } catch (SQLException e) {
|
||||||
e.printStackTrace(); |
// e.printStackTrace();
|
||||||
} |
// }
|
||||||
|
//
|
||||||
return druidDataSource; |
// return druidDataSource;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 注册Servlet信息, 配置监控视图 |
// * 注册Servlet信息, 配置监控视图
|
||||||
* |
// *
|
||||||
* @return |
// * @return
|
||||||
*/ |
// */
|
||||||
@Bean |
// @Bean
|
||||||
@ConditionalOnMissingBean |
// @ConditionalOnMissingBean
|
||||||
public ServletRegistrationBean<Servlet> druidServlet() { |
// public ServletRegistrationBean<Servlet> druidServlet() {
|
||||||
ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*"); |
// ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*");
|
||||||
|
//
|
||||||
//白名单:
|
// //白名单:
|
||||||
// servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48");
|
//// servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48");
|
||||||
//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
|
// //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
|
||||||
servletRegistrationBean.addInitParameter("deny","192.168.1.222"); |
// servletRegistrationBean.addInitParameter("deny","192.168.1.222");
|
||||||
//登录查看信息的账号密码, 用于登录Druid监控后台
|
// //登录查看信息的账号密码, 用于登录Druid监控后台
|
||||||
servletRegistrationBean.addInitParameter("loginUsername", "admin"); |
// servletRegistrationBean.addInitParameter("loginUsername", "admin");
|
||||||
servletRegistrationBean.addInitParameter("loginPassword", "admin"); |
// servletRegistrationBean.addInitParameter("loginPassword", "admin");
|
||||||
//是否能够重置数据.
|
// //是否能够重置数据.
|
||||||
servletRegistrationBean.addInitParameter("resetEnable", "true"); |
// servletRegistrationBean.addInitParameter("resetEnable", "true");
|
||||||
return servletRegistrationBean; |
// return servletRegistrationBean;
|
||||||
|
//
|
||||||
} |
// }
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 注册Filter信息, 监控拦截器 |
// * 注册Filter信息, 监控拦截器
|
||||||
* |
// *
|
||||||
* @return |
// * @return
|
||||||
*/ |
// */
|
||||||
@Bean |
// @Bean
|
||||||
@ConditionalOnMissingBean |
// @ConditionalOnMissingBean
|
||||||
public FilterRegistrationBean<Filter> filterRegistrationBean() { |
// public FilterRegistrationBean<Filter> filterRegistrationBean() {
|
||||||
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>(); |
// FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
|
||||||
filterRegistrationBean.setFilter(new WebStatFilter()); |
// filterRegistrationBean.setFilter(new WebStatFilter());
|
||||||
filterRegistrationBean.addUrlPatterns("/*"); |
// filterRegistrationBean.addUrlPatterns("/*");
|
||||||
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); |
// filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
|
||||||
return filterRegistrationBean; |
// return filterRegistrationBean;
|
||||||
} |
// }
|
||||||
} |
//}
|
||||||
|
@ -1,172 +1,172 @@ |
|||||||
package com.mh.user.config; |
//package com.mh.user.config;
|
||||||
|
//
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties; |
//import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
//
|
||||||
/** |
///**
|
||||||
* @author ljf |
// * @author ljf
|
||||||
* @title : |
// * @title :
|
||||||
* @description : |
// * @description :
|
||||||
* @updateTime 2020-03-13 |
// * @updateTime 2020-03-13
|
||||||
* @throws : |
// * @throws :
|
||||||
*/ |
// */
|
||||||
@ConfigurationProperties(prefix = "spring.datasource.druid") |
//@ConfigurationProperties(prefix = "spring.datasource.druid")
|
||||||
public class DruidDataSourceProperties { |
//public class DruidDataSourceProperties {
|
||||||
|
//
|
||||||
// jdbc
|
// // jdbc
|
||||||
private String driverClassName; |
// private String driverClassName;
|
||||||
private String url; |
// private String url;
|
||||||
private String username; |
// private String username;
|
||||||
private String password; |
// private String password;
|
||||||
// jdbc connection pool
|
// // jdbc connection pool
|
||||||
private int initialSize; |
// private int initialSize;
|
||||||
private int minIdle; |
// private int minIdle;
|
||||||
private int maxActive = 100; |
// private int maxActive = 100;
|
||||||
private long maxWait; |
// private long maxWait;
|
||||||
private long timeBetweenEvictionRunsMillis; |
// private long timeBetweenEvictionRunsMillis;
|
||||||
private long minEvictableIdleTimeMillis; |
// private long minEvictableIdleTimeMillis;
|
||||||
private String validationQuery; |
// private String validationQuery;
|
||||||
private boolean testWhileIdle; |
// private boolean testWhileIdle;
|
||||||
private boolean testOnBorrow; |
// private boolean testOnBorrow;
|
||||||
private boolean testOnReturn; |
// private boolean testOnReturn;
|
||||||
private boolean poolPreparedStatements; |
// private boolean poolPreparedStatements;
|
||||||
private int maxPoolPreparedStatementPerConnectionSize; |
// private int maxPoolPreparedStatementPerConnectionSize;
|
||||||
// filter
|
// // filter
|
||||||
private String filters; |
// private String filters;
|
||||||
|
//
|
||||||
public int getInitialSize() { |
// public int getInitialSize() {
|
||||||
return initialSize; |
// return initialSize;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setInitialSize(int initialSize) { |
// public void setInitialSize(int initialSize) {
|
||||||
this.initialSize = initialSize; |
// this.initialSize = initialSize;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public int getMinIdle() { |
// public int getMinIdle() {
|
||||||
return minIdle; |
// return minIdle;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setMinIdle(int minIdle) { |
// public void setMinIdle(int minIdle) {
|
||||||
this.minIdle = minIdle; |
// this.minIdle = minIdle;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public int getMaxActive() { |
// public int getMaxActive() {
|
||||||
return maxActive; |
// return maxActive;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setMaxActive(int maxActive) { |
// public void setMaxActive(int maxActive) {
|
||||||
this.maxActive = maxActive; |
// this.maxActive = maxActive;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public long getMaxWait() { |
// public long getMaxWait() {
|
||||||
return maxWait; |
// return maxWait;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setMaxWait(long maxWait) { |
// public void setMaxWait(long maxWait) {
|
||||||
this.maxWait = maxWait; |
// this.maxWait = maxWait;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public long getTimeBetweenEvictionRunsMillis() { |
// public long getTimeBetweenEvictionRunsMillis() {
|
||||||
return timeBetweenEvictionRunsMillis; |
// return timeBetweenEvictionRunsMillis;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) { |
// public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
|
||||||
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; |
// this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public long getMinEvictableIdleTimeMillis() { |
// public long getMinEvictableIdleTimeMillis() {
|
||||||
return minEvictableIdleTimeMillis; |
// return minEvictableIdleTimeMillis;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { |
// public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
|
||||||
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; |
// this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public String getValidationQuery() { |
// public String getValidationQuery() {
|
||||||
return validationQuery; |
// return validationQuery;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setValidationQuery(String validationQuery) { |
// public void setValidationQuery(String validationQuery) {
|
||||||
this.validationQuery = validationQuery; |
// this.validationQuery = validationQuery;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public boolean isTestWhileIdle() { |
// public boolean isTestWhileIdle() {
|
||||||
return testWhileIdle; |
// return testWhileIdle;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setTestWhileIdle(boolean testWhileIdle) { |
// public void setTestWhileIdle(boolean testWhileIdle) {
|
||||||
this.testWhileIdle = testWhileIdle; |
// this.testWhileIdle = testWhileIdle;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public boolean isTestOnBorrow() { |
// public boolean isTestOnBorrow() {
|
||||||
return testOnBorrow; |
// return testOnBorrow;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setTestOnBorrow(boolean testOnBorrow) { |
// public void setTestOnBorrow(boolean testOnBorrow) {
|
||||||
this.testOnBorrow = testOnBorrow; |
// this.testOnBorrow = testOnBorrow;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public boolean isTestOnReturn() { |
// public boolean isTestOnReturn() {
|
||||||
return testOnReturn; |
// return testOnReturn;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setTestOnReturn(boolean testOnReturn) { |
// public void setTestOnReturn(boolean testOnReturn) {
|
||||||
this.testOnReturn = testOnReturn; |
// this.testOnReturn = testOnReturn;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public boolean isPoolPreparedStatements() { |
// public boolean isPoolPreparedStatements() {
|
||||||
return poolPreparedStatements; |
// return poolPreparedStatements;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setPoolPreparedStatements(boolean poolPreparedStatements) { |
// public void setPoolPreparedStatements(boolean poolPreparedStatements) {
|
||||||
this.poolPreparedStatements = poolPreparedStatements; |
// this.poolPreparedStatements = poolPreparedStatements;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public int getMaxPoolPreparedStatementPerConnectionSize() { |
// public int getMaxPoolPreparedStatementPerConnectionSize() {
|
||||||
return maxPoolPreparedStatementPerConnectionSize; |
// return maxPoolPreparedStatementPerConnectionSize;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) { |
// public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
|
||||||
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; |
// this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public String getFilters() { |
// public String getFilters() {
|
||||||
return filters; |
// return filters;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setFilters(String filters) { |
// public void setFilters(String filters) {
|
||||||
this.filters = filters; |
// this.filters = filters;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public String getDriverClassName() { |
// public String getDriverClassName() {
|
||||||
return driverClassName; |
// return driverClassName;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setDriverClassName(String driverClassName) { |
// public void setDriverClassName(String driverClassName) {
|
||||||
this.driverClassName = driverClassName; |
// this.driverClassName = driverClassName;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public String getUrl() { |
// public String getUrl() {
|
||||||
return url; |
// return url;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setUrl(String url) { |
// public void setUrl(String url) {
|
||||||
this.url = url; |
// this.url = url;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public String getUsername() { |
// public String getUsername() {
|
||||||
return username; |
// return username;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setUsername(String username) { |
// public void setUsername(String username) {
|
||||||
this.username = username; |
// this.username = username;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public String getPassword() { |
// public String getPassword() {
|
||||||
return password; |
// return password;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
public void setPassword(String password) { |
// public void setPassword(String password) {
|
||||||
this.password = password; |
// this.password = password;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
} |
//}
|
||||||
|
@ -1,17 +1,17 @@ |
|||||||
package com.mh.user.config; |
//package com.mh.user.config;
|
||||||
|
//
|
||||||
import com.alibaba.druid.support.http.StatViewServlet; |
//import com.alibaba.druid.support.http.StatViewServlet;
|
||||||
|
//
|
||||||
/** |
///**
|
||||||
* druid监控视图配置 |
// * druid监控视图配置
|
||||||
*/ |
// */
|
||||||
//@WebServlet(urlPatterns = "/druid/*", initParams={
|
////@WebServlet(urlPatterns = "/druid/*", initParams={
|
||||||
// @WebInitParam(name="allow",value="192.168.6.195"), // IP白名单 (没有配置或者为空,则允许所有访问)
|
//// @WebInitParam(name="allow",value="192.168.6.195"), // IP白名单 (没有配置或者为空,则允许所有访问)
|
||||||
// @WebInitParam(name="deny",value="192.168.6.73"), // IP黑名单 (存在共同时,deny优先于allow)
|
//// @WebInitParam(name="deny",value="192.168.6.73"), // IP黑名单 (存在共同时,deny优先于allow)
|
||||||
// @WebInitParam(name="loginUsername",value="admin"), // 用户名
|
//// @WebInitParam(name="loginUsername",value="admin"), // 用户名
|
||||||
// @WebInitParam(name="loginPassword",value="admin"), // 密码
|
//// @WebInitParam(name="loginPassword",value="admin"), // 密码
|
||||||
// @WebInitParam(name="resetEnable",value="true") // 禁用HTML页面上的“Reset All”功能
|
//// @WebInitParam(name="resetEnable",value="true") // 禁用HTML页面上的“Reset All”功能
|
||||||
//})
|
////})
|
||||||
public class DruidStatViewServlet extends StatViewServlet { |
//public class DruidStatViewServlet extends StatViewServlet {
|
||||||
private static final long serialVersionUID = 7359758657306626394L; |
// private static final long serialVersionUID = 7359758657306626394L;
|
||||||
} |
//}
|
@ -1,54 +1,53 @@ |
|||||||
package com.mh.user.config; |
//package com.mh.user.config;
|
||||||
|
//
|
||||||
import com.mh.user.job.JobFactory; |
//import lombok.extern.slf4j.Slf4j;
|
||||||
import lombok.extern.slf4j.Slf4j; |
//import org.quartz.Scheduler;
|
||||||
import org.quartz.Scheduler; |
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Bean; |
//import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Configuration; |
//import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
||||||
import org.springframework.scheduling.quartz.SchedulerFactoryBean; |
//
|
||||||
|
///**
|
||||||
/** |
// * @author ljf
|
||||||
* @author ljf |
// * @title : Quartz配置
|
||||||
* @title : Quartz配置 |
// * @description :
|
||||||
* @description : |
// * @updateTime 2020-04-03
|
||||||
* @updateTime 2020-04-03 |
// * @throws :
|
||||||
* @throws : |
// */
|
||||||
*/ |
//@Slf4j
|
||||||
@Slf4j |
//@Configuration
|
||||||
@Configuration |
//public class QuartzConfig {
|
||||||
public class QuartzConfig { |
//
|
||||||
|
// private JobFactory jobFactory;
|
||||||
private JobFactory jobFactory; |
//
|
||||||
|
// /**
|
||||||
/** |
// * @author jinhaoxun
|
||||||
* @author jinhaoxun |
// * @description 构造器
|
||||||
* @description 构造器 |
// * @param jobFactory
|
||||||
* @param jobFactory |
// */
|
||||||
*/ |
// public QuartzConfig(JobFactory jobFactory){
|
||||||
public QuartzConfig(JobFactory jobFactory){ |
// this.jobFactory = jobFactory;
|
||||||
this.jobFactory = jobFactory; |
// }
|
||||||
} |
//
|
||||||
|
// /**
|
||||||
/** |
// * @author jinhaoxun
|
||||||
* @author jinhaoxun |
// * @description 配置SchedulerFactoryBean,将一个方法产生为Bean并交给Spring容器管理
|
||||||
* @description 配置SchedulerFactoryBean,将一个方法产生为Bean并交给Spring容器管理 |
// * @return SchedulerFactoryBean
|
||||||
* @return SchedulerFactoryBean |
// */
|
||||||
*/ |
// @Bean
|
||||||
@Bean |
// public SchedulerFactoryBean schedulerFactoryBean() {
|
||||||
public SchedulerFactoryBean schedulerFactoryBean() { |
//// log.info("开始注入定时任务调度器工厂...");
|
||||||
// log.info("开始注入定时任务调度器工厂...");
|
// System.out.println("开始注入定时任务调度器工厂...");
|
||||||
System.out.println("开始注入定时任务调度器工厂..."); |
// SchedulerFactoryBean factory = new SchedulerFactoryBean();// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
|
||||||
SchedulerFactoryBean factory = new SchedulerFactoryBean();// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
|
// factory.setJobFactory(jobFactory);// 设置自定义Job Factory,用于Spring管理Job bean
|
||||||
factory.setJobFactory(jobFactory);// 设置自定义Job Factory,用于Spring管理Job bean
|
// factory.setOverwriteExistingJobs(true);// 覆盖存在的定时任务
|
||||||
factory.setOverwriteExistingJobs(true);// 覆盖存在的定时任务
|
// factory.setStartupDelay(30); //延时30秒启动定时任务,避免系统未完全启动却开始执行定时任务的情况
|
||||||
factory.setStartupDelay(30); //延时30秒启动定时任务,避免系统未完全启动却开始执行定时任务的情况
|
//// log.info("注入定时任务调度器工厂成功!");
|
||||||
// log.info("注入定时任务调度器工厂成功!");
|
// System.out.println("注入定时任务调度器工厂成功!");
|
||||||
System.out.println("注入定时任务调度器工厂成功!"); |
// return factory;
|
||||||
return factory; |
// }
|
||||||
} |
//
|
||||||
|
// @Bean(name = "scheduler")
|
||||||
@Bean(name = "scheduler") |
// public Scheduler scheduler() {
|
||||||
public Scheduler scheduler() { |
// return schedulerFactoryBean().getScheduler();
|
||||||
return schedulerFactoryBean().getScheduler(); |
// }
|
||||||
} |
//}
|
||||||
} |
|
||||||
|
@ -1,299 +1,296 @@ |
|||||||
package com.mh.user.controller; |
//package com.mh.user.controller;
|
||||||
|
//
|
||||||
import com.alibaba.fastjson.JSONObject; |
//import com.alibaba.fastjson.JSONObject;
|
||||||
import com.mh.common.http.HttpResult; |
//import com.mh.common.http.HttpResult;
|
||||||
import com.mh.user.annotation.SysLogger; |
//import com.mh.user.dto.DeviceMessageDTO;
|
||||||
import com.mh.user.dto.DeviceMessageDTO; |
//import com.mh.user.entity.*;
|
||||||
import com.mh.user.entity.*; |
//import com.mh.user.manage.QuartzManager;
|
||||||
import com.mh.user.manage.QuartzManager; |
//import com.mh.user.service.chillers.DeviceDisplayService;
|
||||||
import com.mh.user.netty.NettyChillerControlClient; |
//import com.mh.user.constants.Constant;
|
||||||
import com.mh.user.service.chillers.DeviceDisplayService; |
//import com.mh.user.service.chillers.DeviceManageService;
|
||||||
import com.mh.user.constants.Constant; |
//import com.mh.user.service.chillers.DeviceParamService;
|
||||||
import com.mh.user.service.chillers.DeviceManageService; |
//import com.mh.user.service.chillers.GatewayManageService;
|
||||||
import com.mh.user.service.chillers.DeviceParamService; |
//import com.mh.user.utils.GetReadOrder485;
|
||||||
import com.mh.user.service.chillers.GatewayManageService; |
//import com.mh.user.utils.QuerySendThread;
|
||||||
import com.mh.user.utils.GetReadOrder485; |
//import com.mh.user.constants.SocketMessage;
|
||||||
import com.mh.user.utils.QuerySendThread; |
//import com.mh.user.utils.TimeDifferenceUtil;
|
||||||
import com.mh.user.constants.SocketMessage; |
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import com.mh.user.utils.TimeDifferenceUtil; |
//import org.springframework.web.bind.annotation.*;
|
||||||
import org.quartz.SchedulerException; |
//
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
//import javax.annotation.Resource;
|
||||||
import org.springframework.web.bind.annotation.*; |
//import java.text.ParseException;
|
||||||
|
//import java.util.HashMap;
|
||||||
import javax.annotation.Resource; |
//import java.util.List;
|
||||||
import java.text.ParseException; |
//import java.util.Map;
|
||||||
import java.util.HashMap; |
//
|
||||||
import java.util.List; |
///**
|
||||||
import java.util.Map; |
// * @author ljf
|
||||||
|
// * @title :
|
||||||
/** |
// * @description : 设备管理接口
|
||||||
* @author ljf |
// * @updateTime 2020-05-29
|
||||||
* @title : |
// * @updateTime 2020-07-17
|
||||||
* @description : 设备管理接口 |
// * @throws :
|
||||||
* @updateTime 2020-05-29 |
// */
|
||||||
* @updateTime 2020-07-17 |
//@RestController
|
||||||
* @throws : |
//public class DeviceManageController {
|
||||||
*/ |
//
|
||||||
@RestController |
// private final DeviceDisplayService deviceDisplayService;
|
||||||
public class DeviceManageController { |
// private final GatewayManageService gatewayManageService;
|
||||||
|
// private final DeviceManageService deviceManageService;
|
||||||
private final DeviceDisplayService deviceDisplayService; |
// private final DeviceParamService deviceParamService;
|
||||||
private final GatewayManageService gatewayManageService; |
//
|
||||||
private final DeviceManageService deviceManageService; |
// public DeviceManageController(DeviceDisplayService deviceDisplayService, GatewayManageService gatewayManageService, DeviceManageService deviceManageService, DeviceParamService deviceParamService) {
|
||||||
private final DeviceParamService deviceParamService; |
// this.deviceDisplayService = deviceDisplayService;
|
||||||
|
// this.gatewayManageService = gatewayManageService;
|
||||||
public DeviceManageController(DeviceDisplayService deviceDisplayService, GatewayManageService gatewayManageService, DeviceManageService deviceManageService, DeviceParamService deviceParamService) { |
// this.deviceManageService = deviceManageService;
|
||||||
this.deviceDisplayService = deviceDisplayService; |
// this.deviceParamService = deviceParamService;
|
||||||
this.gatewayManageService = gatewayManageService; |
// }
|
||||||
this.deviceManageService = deviceManageService; |
//
|
||||||
this.deviceParamService = deviceParamService; |
// @Resource
|
||||||
} |
// QuartzManager quartzManager;
|
||||||
|
//
|
||||||
@Resource |
// @Autowired
|
||||||
QuartzManager quartzManager; |
// private SocketMessage socketMessage;
|
||||||
|
//
|
||||||
@Autowired |
// // 查询设备信息状态
|
||||||
private SocketMessage socketMessage; |
// @GetMapping("/operation/getColdStation")
|
||||||
|
// public HttpResult getColdStation(@RequestParam(value = "deviceType", required = true) String deviceType) {
|
||||||
// 查询设备信息状态
|
// List<DeviceMessageDTO> deviceMessageList = deviceDisplayService.queryDeviceStatus(deviceType);
|
||||||
@GetMapping("/operation/getColdStation") |
// Map<String, Object> formValues = new HashMap<>();
|
||||||
public HttpResult getColdStation(@RequestParam(value = "deviceType", required = true) String deviceType) { |
// formValues.put("formValues",deviceMessageList);
|
||||||
List<DeviceMessageDTO> deviceMessageList = deviceDisplayService.queryDeviceStatus(deviceType); |
// return HttpResult.ok("success", formValues);
|
||||||
Map<String, Object> formValues = new HashMap<>(); |
// }
|
||||||
formValues.put("formValues",deviceMessageList); |
//
|
||||||
return HttpResult.ok("success", formValues); |
// // 对设备进行操作处理
|
||||||
} |
// @PostMapping("/operation/operationDevice")
|
||||||
|
// public HttpResult operationDevice(@RequestBody List<OrderEntity> changeValues) {
|
||||||
// 对设备进行操作处理
|
// String result;
|
||||||
@PostMapping("/operation/operationDevice") |
// try {
|
||||||
public HttpResult operationDevice(@RequestBody List<OrderEntity> changeValues) { |
// List<OrderMessageEntity> orderMessageEntityList;
|
||||||
String result; |
// // type值 0:修改频率, 1:修改开关状态, 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间,3: 群控手自动切换类型,4: 修改温度, 5: 修改压力
|
||||||
try { |
//// // 添加网页发送指令状态 update by ljf on 2020-08-07
|
||||||
List<OrderMessageEntity> orderMessageEntityList; |
// Constant.CONTROL_WEB_FLAG = true;
|
||||||
// type值 0:修改频率, 1:修改开关状态, 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间,3: 群控手自动切换类型,4: 修改温度, 5: 修改压力
|
// // 暂停采集
|
||||||
// // 添加网页发送指令状态 update by ljf on 2020-08-07
|
//// quartzManager.pauseJob("DDC","JobDDCGroup");
|
||||||
Constant.CONTROL_WEB_FLAG = true; |
//// Thread.sleep(2000);
|
||||||
// 暂停采集
|
// // 修改成不用暂停采集处理
|
||||||
// quartzManager.pauseJob("DDC","JobDDCGroup");
|
// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
||||||
// Thread.sleep(2000);
|
// // 判断是否是去关闭冷却泵,如果是,需要检查最近冷却塔有没有关闭并且关闭时间大于8分钟
|
||||||
// 修改成不用暂停采集处理
|
// // 判断changeValues大小
|
||||||
GetReadOrder485 getReadOrder485 = new GetReadOrder485(); |
// int size = changeValues.size();
|
||||||
// 判断是否是去关闭冷却泵,如果是,需要检查最近冷却塔有没有关闭并且关闭时间大于8分钟
|
// int type = changeValues.get(0).getType();
|
||||||
// 判断changeValues大小
|
// if (type == 3 && size == 1) {
|
||||||
int size = changeValues.size(); |
// // 生成指令
|
||||||
int type = changeValues.get(0).getType(); |
// orderMessageEntityList = getReadOrder485.createOrder(changeValues);
|
||||||
if (type == 3 && size == 1) { |
// if (orderMessageEntityList.size() != 0) {
|
||||||
// 生成指令
|
// // 开启发送指令
|
||||||
orderMessageEntityList = getReadOrder485.createOrder(changeValues); |
// NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient();
|
||||||
if (orderMessageEntityList.size() != 0) { |
//// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList);
|
||||||
// 开启发送指令
|
// nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList);
|
||||||
NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient(); |
// // 开启线程监测标志
|
||||||
// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList);
|
// QuerySendThread querySendThread = new QuerySendThread();
|
||||||
nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList); |
// querySendThread.start();
|
||||||
// 开启线程监测标志
|
// if (Constant.SEND_STATUS) {
|
||||||
QuerySendThread querySendThread = new QuerySendThread(); |
// result = "success";
|
||||||
querySendThread.start(); |
// } else {
|
||||||
if (Constant.SEND_STATUS) { |
// result = "fail";
|
||||||
result = "success"; |
// }
|
||||||
} else { |
// } else {
|
||||||
result = "fail"; |
// result = "fail";
|
||||||
} |
// }
|
||||||
} else { |
// } else if (type == 2 && size == 1) {
|
||||||
result = "fail"; |
// TimeDifferenceUtil timeDifferenceUtil = new TimeDifferenceUtil();
|
||||||
} |
// Boolean a = timeDifferenceUtil.timeDifference(socketMessage.getOverTime());
|
||||||
} else if (type == 2 && size == 1) { |
// if (a) {
|
||||||
TimeDifferenceUtil timeDifferenceUtil = new TimeDifferenceUtil(); |
// // 生成指令
|
||||||
Boolean a = timeDifferenceUtil.timeDifference(socketMessage.getOverTime()); |
// orderMessageEntityList = getReadOrder485.createOrder(changeValues);
|
||||||
if (a) { |
// if (orderMessageEntityList.size() != 0) {
|
||||||
// 生成指令
|
// // 开启发送指令
|
||||||
orderMessageEntityList = getReadOrder485.createOrder(changeValues); |
// NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient();
|
||||||
if (orderMessageEntityList.size() != 0) { |
//// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList);
|
||||||
// 开启发送指令
|
// nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList);
|
||||||
NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient(); |
// // 开启线程监测标志
|
||||||
// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList);
|
// QuerySendThread querySendThread = new QuerySendThread();
|
||||||
nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList); |
// querySendThread.start();
|
||||||
// 开启线程监测标志
|
// if (Constant.SEND_STATUS) {
|
||||||
QuerySendThread querySendThread = new QuerySendThread(); |
// result = "success";
|
||||||
querySendThread.start(); |
// } else {
|
||||||
if (Constant.SEND_STATUS) { |
// result = "fail";
|
||||||
result = "success"; |
// }
|
||||||
} else { |
// } else {
|
||||||
result = "fail"; |
// result = "fail";
|
||||||
} |
// }
|
||||||
} else { |
// } else {
|
||||||
result = "fail"; |
// result = "冷却塔关机还没有超过8分钟";
|
||||||
} |
// }
|
||||||
} else { |
// } else {
|
||||||
result = "冷却塔关机还没有超过8分钟"; |
// // 生成指令
|
||||||
} |
// orderMessageEntityList = getReadOrder485.createOrder(changeValues);
|
||||||
} else { |
// if (orderMessageEntityList.size() != 0) {
|
||||||
// 生成指令
|
// // 开启发送指令
|
||||||
orderMessageEntityList = getReadOrder485.createOrder(changeValues); |
// NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient();
|
||||||
if (orderMessageEntityList.size() != 0) { |
//// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList);
|
||||||
// 开启发送指令
|
// nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList);
|
||||||
NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient(); |
// // 开启线程监测标志
|
||||||
// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList);
|
// QuerySendThread querySendThread = new QuerySendThread();
|
||||||
nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList); |
// querySendThread.start();
|
||||||
// 开启线程监测标志
|
// if (Constant.SEND_STATUS) {
|
||||||
QuerySendThread querySendThread = new QuerySendThread(); |
// result = "success";
|
||||||
querySendThread.start(); |
// } else {
|
||||||
if (Constant.SEND_STATUS) { |
// result = "fail";
|
||||||
result = "success"; |
// }
|
||||||
} else { |
// } else {
|
||||||
result = "fail"; |
// result = "fail";
|
||||||
} |
// }
|
||||||
} else { |
// }
|
||||||
result = "fail"; |
// Constant.CONTROL_WEB_FLAG = false;
|
||||||
} |
// // 不需要停止采集
|
||||||
} |
//// Constant.WEB_FLAG = false;
|
||||||
Constant.CONTROL_WEB_FLAG = false; |
//// // 延迟5秒处理,等待线程处理数据
|
||||||
// 不需要停止采集
|
// Thread.sleep(500);
|
||||||
// Constant.WEB_FLAG = false;
|
//// // 重新开启定时采集
|
||||||
// // 延迟5秒处理,等待线程处理数据
|
//// quartzManager.resumeAllJob();
|
||||||
Thread.sleep(500); |
//// quartzManager.resumeJob("DDC","JobDDCGroup");
|
||||||
// // 重新开启定时采集
|
// } catch (InterruptedException | ParseException e) {
|
||||||
// quartzManager.resumeAllJob();
|
// e.printStackTrace();
|
||||||
// quartzManager.resumeJob("DDC","JobDDCGroup");
|
// result = "fail";
|
||||||
} catch (InterruptedException | ParseException e) { |
// }
|
||||||
e.printStackTrace(); |
// // 异常情况处理
|
||||||
result = "fail"; |
// return HttpResult.ok(result);
|
||||||
} |
// }
|
||||||
// 异常情况处理
|
//
|
||||||
return HttpResult.ok(result); |
// /**
|
||||||
} |
// * 查询网关信息
|
||||||
|
// * @param requestJson
|
||||||
/** |
// * @return
|
||||||
* 查询网关信息 |
// */
|
||||||
* @param requestJson |
// @PostMapping("/gateWay/getGateWayList")
|
||||||
* @return |
// public HttpResult gateWayList(@RequestBody String requestJson){
|
||||||
*/ |
// JSONObject jsonObject =JSONObject.parseObject(requestJson);
|
||||||
@PostMapping("/gateWay/getGateWayList") |
// Integer operator = null;
|
||||||
public HttpResult gateWayList(@RequestBody String requestJson){ |
// Integer grade = null;
|
||||||
JSONObject jsonObject =JSONObject.parseObject(requestJson); |
// if(jsonObject.get("operator") != null){
|
||||||
Integer operator = null; |
// if(jsonObject.get("operator").equals("中国移动")){
|
||||||
Integer grade = null; |
// operator = 0;
|
||||||
if(jsonObject.get("operator") != null){ |
// }else if(jsonObject.get("operator").equals("中国联通")){
|
||||||
if(jsonObject.get("operator").equals("中国移动")){ |
// operator = 1;
|
||||||
operator = 0; |
// }else if(jsonObject.get("operator").equals("中国电信")){
|
||||||
}else if(jsonObject.get("operator").equals("中国联通")){ |
// operator = 2;
|
||||||
operator = 1; |
// }
|
||||||
}else if(jsonObject.get("operator").equals("中国电信")){ |
// }
|
||||||
operator = 2; |
// if(jsonObject.get("grade") != null){
|
||||||
} |
// if(jsonObject.get("grade").equals("正常")){
|
||||||
} |
// grade = 0;
|
||||||
if(jsonObject.get("grade") != null){ |
// }else if(jsonObject.get("grade").equals("不在线")){
|
||||||
if(jsonObject.get("grade").equals("正常")){ |
// grade = 1;
|
||||||
grade = 0; |
// }else if(jsonObject.get("grade").equals("异常")){
|
||||||
}else if(jsonObject.get("grade").equals("不在线")){ |
// grade = 2;
|
||||||
grade = 1; |
// }
|
||||||
}else if(jsonObject.get("grade").equals("异常")){ |
// }
|
||||||
grade = 2; |
// List<GatewayManageEntity> gateWayList = gatewayManageService.queryByOther(grade,operator);
|
||||||
} |
// JSONObject tableData = new JSONObject();
|
||||||
} |
// tableData.put("tableData",gateWayList);
|
||||||
List<GatewayManageEntity> gateWayList = gatewayManageService.queryByOther(grade,operator); |
// return HttpResult.ok(tableData);
|
||||||
JSONObject tableData = new JSONObject(); |
//// System.out.println(requestJson);
|
||||||
tableData.put("tableData",gateWayList); |
//// return null;
|
||||||
return HttpResult.ok(tableData); |
// }
|
||||||
// System.out.println(requestJson);
|
//
|
||||||
// return null;
|
// /**
|
||||||
} |
// * 新增或更新网关信息
|
||||||
|
// * @param reqestJson
|
||||||
/** |
// * @return
|
||||||
* 新增或更新网关信息 |
// */
|
||||||
* @param reqestJson |
// @PostMapping("/gateWay/addOrUpdateGateWayInfo")
|
||||||
* @return |
// public HttpResult addOrUpdateGateWayInfo(@RequestBody GatewayManageEntity reqestJson){
|
||||||
*/ |
// try {
|
||||||
@PostMapping("/gateWay/addOrUpdateGateWayInfo") |
// System.out.println(reqestJson.toString());
|
||||||
public HttpResult addOrUpdateGateWayInfo(@RequestBody GatewayManageEntity reqestJson){ |
// gatewayManageService.addOrUpdateGateWayInfo(reqestJson);
|
||||||
try { |
// return HttpResult.ok();
|
||||||
System.out.println(reqestJson.toString()); |
// } catch (Exception e) {
|
||||||
gatewayManageService.addOrUpdateGateWayInfo(reqestJson); |
// e.printStackTrace();
|
||||||
return HttpResult.ok(); |
// return HttpResult.error(e.getMessage());
|
||||||
} catch (Exception e) { |
// }
|
||||||
e.printStackTrace(); |
// }
|
||||||
return HttpResult.error(e.getMessage()); |
//
|
||||||
} |
// /**
|
||||||
} |
// * 删除网关/基表/基表参数信息
|
||||||
|
// * @param requestJson
|
||||||
/** |
// * @return
|
||||||
* 删除网关/基表/基表参数信息 |
// */
|
||||||
* @param requestJson |
// @PostMapping("/device/deleteDeviceInfo")
|
||||||
* @return |
// public HttpResult deleteDeviceInfo(@RequestBody String requestJson){
|
||||||
*/ |
// JSONObject jsonObject =JSONObject.parseObject(requestJson);
|
||||||
@PostMapping("/device/deleteDeviceInfo") |
// System.out.println(jsonObject.get("deviceId"));
|
||||||
public HttpResult deleteDeviceInfo(@RequestBody String requestJson){ |
// try {
|
||||||
JSONObject jsonObject =JSONObject.parseObject(requestJson); |
// deviceManageService.deleteDeviceInfo((Integer)jsonObject.get("deviceId"),jsonObject.get("deviceType").toString());
|
||||||
System.out.println(jsonObject.get("deviceId")); |
// return HttpResult.ok();
|
||||||
try { |
// } catch (Exception e) {
|
||||||
deviceManageService.deleteDeviceInfo((Integer)jsonObject.get("deviceId"),jsonObject.get("deviceType").toString()); |
// e.printStackTrace();
|
||||||
return HttpResult.ok(); |
// return HttpResult.error(e.getMessage());
|
||||||
} catch (Exception e) { |
// }
|
||||||
e.printStackTrace(); |
// }
|
||||||
return HttpResult.error(e.getMessage()); |
//
|
||||||
} |
// /**
|
||||||
} |
// * 查询基表管理中的基表数据
|
||||||
|
// * @param requestJson
|
||||||
/** |
// * @return
|
||||||
* 查询基表管理中的基表数据 |
// */
|
||||||
* @param requestJson |
// @PostMapping("/baseMeter/getBaseMeterList")
|
||||||
* @return |
// public HttpResult getBaseMeterList(@RequestBody String requestJson){
|
||||||
*/ |
// JSONObject jsonObject =JSONObject.parseObject(requestJson);
|
||||||
@PostMapping("/baseMeter/getBaseMeterList") |
// List<DeviceManageEntity> list = deviceManageService.getDeviceByOther(jsonObject.get("deviceNum").toString());
|
||||||
public HttpResult getBaseMeterList(@RequestBody String requestJson){ |
// JSONObject tableData = new JSONObject();
|
||||||
JSONObject jsonObject =JSONObject.parseObject(requestJson); |
// tableData.put("tableData",list);
|
||||||
List<DeviceManageEntity> list = deviceManageService.getDeviceByOther(jsonObject.get("deviceNum").toString()); |
// return HttpResult.ok(tableData);
|
||||||
JSONObject tableData = new JSONObject(); |
// }
|
||||||
tableData.put("tableData",list); |
//
|
||||||
return HttpResult.ok(tableData); |
// /**
|
||||||
} |
// * 增加或更新基表信息数据
|
||||||
|
// * @param requestJson
|
||||||
/** |
// * @return
|
||||||
* 增加或更新基表信息数据 |
// */
|
||||||
* @param requestJson |
// @PostMapping("/baseMeter/addOrUpdateBaseMeter")
|
||||||
* @return |
// public HttpResult addOrUpdateBaseMeter(@RequestBody DeviceManageEntity requestJson){
|
||||||
*/ |
// try {
|
||||||
@PostMapping("/baseMeter/addOrUpdateBaseMeter") |
// deviceManageService.addOrUpdateBaseMeter(requestJson);
|
||||||
public HttpResult addOrUpdateBaseMeter(@RequestBody DeviceManageEntity requestJson){ |
// return HttpResult.ok();
|
||||||
try { |
// } catch (Exception e) {
|
||||||
deviceManageService.addOrUpdateBaseMeter(requestJson); |
// e.printStackTrace();
|
||||||
return HttpResult.ok(); |
// return HttpResult.error("检查输入的设备码是否有误!");
|
||||||
} catch (Exception e) { |
// }
|
||||||
e.printStackTrace(); |
// }
|
||||||
return HttpResult.error("检查输入的设备码是否有误!"); |
//
|
||||||
} |
// /**
|
||||||
} |
// * 查询基表参数管理中的基表参数数据
|
||||||
|
// * @param requestJson
|
||||||
/** |
// * @return
|
||||||
* 查询基表参数管理中的基表参数数据 |
// */
|
||||||
* @param requestJson |
// @PostMapping("/baseMeterParam/getBaseMeterParamList")
|
||||||
* @return |
// public HttpResult getBaseMeterParamList(@RequestBody String requestJson){
|
||||||
*/ |
// JSONObject jsonObject =JSONObject.parseObject(requestJson);
|
||||||
@PostMapping("/baseMeterParam/getBaseMeterParamList") |
// System.out.println(jsonObject.get("baseMeterType"));
|
||||||
public HttpResult getBaseMeterParamList(@RequestBody String requestJson){ |
// String baseMeterType = (String) jsonObject.get("baseMeterType");
|
||||||
JSONObject jsonObject =JSONObject.parseObject(requestJson); |
// List<DeviceParameterEntity> list = deviceParamService.getBaseMeterParamList(baseMeterType);
|
||||||
System.out.println(jsonObject.get("baseMeterType")); |
// JSONObject tableData = new JSONObject();
|
||||||
String baseMeterType = (String) jsonObject.get("baseMeterType"); |
// tableData.put("tableData",list);
|
||||||
List<DeviceParameterEntity> list = deviceParamService.getBaseMeterParamList(baseMeterType); |
// return HttpResult.ok(tableData);
|
||||||
JSONObject tableData = new JSONObject(); |
// }
|
||||||
tableData.put("tableData",list); |
//
|
||||||
return HttpResult.ok(tableData); |
// /**
|
||||||
} |
// * 添加或更新基表参数信息
|
||||||
|
// * @param requestJson
|
||||||
/** |
// * @return
|
||||||
* 添加或更新基表参数信息 |
// */
|
||||||
* @param requestJson |
// @PostMapping("/baseMeterParam/addOrUpdateBaseMeterParam")
|
||||||
* @return |
// public HttpResult addOrUpdateBaseMeterParam(@RequestBody DeviceParameterEntity requestJson){
|
||||||
*/ |
// try {
|
||||||
@PostMapping("/baseMeterParam/addOrUpdateBaseMeterParam") |
// deviceParamService.addOrUpdateBaseMeterParam(requestJson);
|
||||||
public HttpResult addOrUpdateBaseMeterParam(@RequestBody DeviceParameterEntity requestJson){ |
// return HttpResult.ok();
|
||||||
try { |
// } catch (Exception e) {
|
||||||
deviceParamService.addOrUpdateBaseMeterParam(requestJson); |
// e.printStackTrace();
|
||||||
return HttpResult.ok(); |
// return HttpResult.error(e.getMessage());
|
||||||
} catch (Exception e) { |
// }
|
||||||
e.printStackTrace(); |
// }
|
||||||
return HttpResult.error(e.getMessage()); |
//
|
||||||
} |
//
|
||||||
} |
//}
|
||||||
|
|
||||||
|
|
||||||
} |
|
||||||
|
@ -1,77 +1,77 @@ |
|||||||
package com.mh.user.dynamic.config; |
//package com.mh.user.dynamic.config;
|
||||||
|
//
|
||||||
import com.alibaba.druid.pool.DruidDataSource; |
//import com.alibaba.druid.pool.DruidDataSource;
|
||||||
import com.mh.user.dynamic.datasource.DynamicDataSource; |
//import com.mh.user.dynamic.datasource.DynamicDataSource;
|
||||||
import org.apache.ibatis.session.SqlSessionFactory; |
//import org.apache.ibatis.session.SqlSessionFactory;
|
||||||
import org.mybatis.spring.SqlSessionFactoryBean; |
//import org.mybatis.spring.SqlSessionFactoryBean;
|
||||||
import org.mybatis.spring.SqlSessionTemplate; |
//import org.mybatis.spring.SqlSessionTemplate;
|
||||||
import org.mybatis.spring.annotation.MapperScan; |
//import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier; |
//import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.beans.factory.annotation.Value; |
//import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Bean; |
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration; |
//import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; |
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||||
|
//
|
||||||
import javax.sql.DataSource; |
//import javax.sql.DataSource;
|
||||||
import java.util.HashMap; |
//import java.util.HashMap;
|
||||||
import java.util.Map; |
//import java.util.Map;
|
||||||
|
//
|
||||||
/** |
///**
|
||||||
* @author chison |
// * @author chison
|
||||||
* @date 2020-04-02 09:39 |
// * @date 2020-04-02 09:39
|
||||||
* @Description |
// * @Description
|
||||||
*/ |
// */
|
||||||
@Configuration |
//@Configuration
|
||||||
@MapperScan("com.mh.*.mapper") // 扫描DAO
|
//@MapperScan("com.mh.*.mapper") // 扫描DAO
|
||||||
public class DataSourceConfig { |
//public class DataSourceConfig {
|
||||||
|
//
|
||||||
@Value("${spring.datasource.druid.url}") |
// @Value("${spring.datasource.druid.url}")
|
||||||
private String defaultDBUrl; |
// private String defaultDBUrl;
|
||||||
@Value("${spring.datasource.druid.username}") |
// @Value("${spring.datasource.druid.username}")
|
||||||
private String defaultDBUser; |
// private String defaultDBUser;
|
||||||
@Value("${spring.datasource.druid.password}") |
// @Value("${spring.datasource.druid.password}")
|
||||||
private String defaultDBPassword; |
// private String defaultDBPassword;
|
||||||
@Value("${spring.datasource.druid.driver-class-name}") |
// @Value("${spring.datasource.druid.driver-class-name}")
|
||||||
private String defaultDBDreiverName; |
// private String defaultDBDreiverName;
|
||||||
|
//
|
||||||
|
//
|
||||||
@Bean |
// @Bean
|
||||||
public DynamicDataSource dynamicDataSource() { |
// public DynamicDataSource dynamicDataSource() {
|
||||||
DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance(); |
// DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance();
|
||||||
|
//
|
||||||
DruidDataSource defaultDataSource = new DruidDataSource(); |
// DruidDataSource defaultDataSource = new DruidDataSource();
|
||||||
defaultDataSource.setUrl(defaultDBUrl); |
// defaultDataSource.setUrl(defaultDBUrl);
|
||||||
defaultDataSource.setUsername(defaultDBUser); |
// defaultDataSource.setUsername(defaultDBUser);
|
||||||
defaultDataSource.setPassword(defaultDBPassword); |
// defaultDataSource.setPassword(defaultDBPassword);
|
||||||
defaultDataSource.setDriverClassName(defaultDBDreiverName); |
// defaultDataSource.setDriverClassName(defaultDBDreiverName);
|
||||||
|
//
|
||||||
Map<Object,Object> map = new HashMap<>(); |
// Map<Object,Object> map = new HashMap<>();
|
||||||
map.put("default", defaultDataSource); |
// map.put("default", defaultDataSource);
|
||||||
dynamicDataSource.setTargetDataSources(map); |
// dynamicDataSource.setTargetDataSources(map);
|
||||||
dynamicDataSource.setDefaultTargetDataSource(defaultDataSource); |
// dynamicDataSource.setDefaultTargetDataSource(defaultDataSource);
|
||||||
|
//
|
||||||
return dynamicDataSource; |
// return dynamicDataSource;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
@Bean |
// @Bean
|
||||||
public SqlSessionFactory sqlSessionFactory( |
// public SqlSessionFactory sqlSessionFactory(
|
||||||
@Qualifier("dynamicDataSource") DataSource dynamicDataSource) |
// @Qualifier("dynamicDataSource") DataSource dynamicDataSource)
|
||||||
throws Exception { |
// throws Exception {
|
||||||
SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); |
// SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
|
||||||
bean.setDataSource(dynamicDataSource); |
// bean.setDataSource(dynamicDataSource);
|
||||||
bean.setTypeAliasesPackage("com.mh.*.model"); // 扫描Model
|
// bean.setTypeAliasesPackage("com.mh.*.model"); // 扫描Model
|
||||||
|
//
|
||||||
bean.setMapperLocations(new PathMatchingResourcePatternResolver() |
// bean.setMapperLocations(new PathMatchingResourcePatternResolver()
|
||||||
.getResources("classpath*:**/sqlmapper/*.xml")); |
// .getResources("classpath*:**/sqlmapper/*.xml"));
|
||||||
return bean.getObject(); |
// return bean.getObject();
|
||||||
|
//
|
||||||
} |
// }
|
||||||
|
//
|
||||||
@Bean(name = "sqlSessionTemplate") |
// @Bean(name = "sqlSessionTemplate")
|
||||||
public SqlSessionTemplate sqlSessionTemplate( |
// public SqlSessionTemplate sqlSessionTemplate(
|
||||||
@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) |
// @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory)
|
||||||
throws Exception { |
// throws Exception {
|
||||||
return new SqlSessionTemplate(sqlSessionFactory); |
// return new SqlSessionTemplate(sqlSessionFactory);
|
||||||
} |
// }
|
||||||
|
//
|
||||||
} |
//}
|
||||||
|
@ -1,28 +1,28 @@ |
|||||||
package com.mh.user.dynamic.config; |
//package com.mh.user.dynamic.config;
|
||||||
|
//
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; |
//import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.context.annotation.Bean; |
//import org.springframework.context.annotation.Bean;
|
||||||
import tk.mybatis.spring.mapper.MapperScannerConfigurer; |
//import tk.mybatis.spring.mapper.MapperScannerConfigurer;
|
||||||
|
//
|
||||||
import java.util.Properties; |
//import java.util.Properties;
|
||||||
|
//
|
||||||
/** |
///**
|
||||||
* @author chison |
// * @author chison
|
||||||
* @date 2020-04-02 09:40 |
// * @date 2020-04-02 09:40
|
||||||
* @Description |
// * @Description
|
||||||
*/ |
// */
|
||||||
@EnableAutoConfiguration |
//@EnableAutoConfiguration
|
||||||
public class MyBatisMapperScannerConfig { |
//public class MyBatisMapperScannerConfig {
|
||||||
@Bean |
// @Bean
|
||||||
public MapperScannerConfigurer mapperScannerConfigurer() { |
// public MapperScannerConfigurer mapperScannerConfigurer() {
|
||||||
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); |
// MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
|
||||||
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); |
// mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
|
||||||
mapperScannerConfigurer.setBasePackage("com.mh.user.mapper"); |
// mapperScannerConfigurer.setBasePackage("com.mh.user.mapper");
|
||||||
Properties properties = new Properties(); |
// Properties properties = new Properties();
|
||||||
properties.setProperty("notEmpty", "false"); |
// properties.setProperty("notEmpty", "false");
|
||||||
properties.setProperty("IDENTITY", "MYSQL"); |
// properties.setProperty("IDENTITY", "MYSQL");
|
||||||
mapperScannerConfigurer.setProperties(properties); |
// mapperScannerConfigurer.setProperties(properties);
|
||||||
return mapperScannerConfigurer; |
// return mapperScannerConfigurer;
|
||||||
} |
// }
|
||||||
|
//
|
||||||
} |
//}
|
||||||
|
@ -1,71 +1,71 @@ |
|||||||
package com.mh.user.dynamic.datasource; |
//package com.mh.user.dynamic.datasource;
|
||||||
|
//
|
||||||
import com.alibaba.druid.pool.DruidDataSource; |
//import com.alibaba.druid.pool.DruidDataSource;
|
||||||
import com.mh.user.entity.DBEntity; |
//import com.mh.user.entity.DBEntity;
|
||||||
|
//
|
||||||
import java.util.HashMap; |
//import java.util.HashMap;
|
||||||
import java.util.Map; |
//import java.util.Map;
|
||||||
|
//
|
||||||
/** |
///**
|
||||||
* @author chison |
// * @author chison
|
||||||
* @date 2020-04-02 09:40 |
// * @date 2020-04-02 09:40
|
||||||
* @Description |
// * @Description
|
||||||
*/ |
// */
|
||||||
public class DataSourceObject { |
//public class DataSourceObject {
|
||||||
|
//
|
||||||
private Long MaxWait=6000L; |
// private Long MaxWait=6000L;
|
||||||
private Integer maxActive=10; |
// private Integer maxActive=10;
|
||||||
private Long timeBetweenEvictionRunsMillis=6000L; |
// private Long timeBetweenEvictionRunsMillis=6000L;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 切换sqlserver数据库,并动态赋值 |
// * 切换sqlserver数据库,并动态赋值
|
||||||
* @param dbInfo |
// * @param dbInfo
|
||||||
* @param SourceName |
// * @param SourceName
|
||||||
*/ |
// */
|
||||||
public void SwitchMySQLDataSource(DBEntity dbInfo, String SourceName) { |
// public void SwitchMySQLDataSource(DBEntity dbInfo, String SourceName) {
|
||||||
System.out.println("mysql进入数据源切换"); |
// System.out.println("mysql进入数据源切换");
|
||||||
System.out.println("MaxWait:"+MaxWait); |
// System.out.println("MaxWait:"+MaxWait);
|
||||||
DruidDataSource dynamicDataSource = new DruidDataSource(); |
// DruidDataSource dynamicDataSource = new DruidDataSource();
|
||||||
dynamicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); |
// dynamicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
|
||||||
dynamicDataSource.setUrl("jdbc:mysql://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+"/"+dbInfo.getDB_Names()+"?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&autoReconnect=true"); |
// dynamicDataSource.setUrl("jdbc:mysql://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+"/"+dbInfo.getDB_Names()+"?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&autoReconnect=true");
|
||||||
dynamicDataSource.setUsername(dbInfo.getDB_UserName()); |
// dynamicDataSource.setUsername(dbInfo.getDB_UserName());
|
||||||
dynamicDataSource.setPassword(dbInfo.getDB_Pwd()); |
// dynamicDataSource.setPassword(dbInfo.getDB_Pwd());
|
||||||
dynamicDataSource.setMaxWait(MaxWait); |
// dynamicDataSource.setMaxWait(MaxWait);
|
||||||
dynamicDataSource.setMaxActive(maxActive); |
// dynamicDataSource.setMaxActive(maxActive);
|
||||||
dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); |
// dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
|
||||||
|
//
|
||||||
DynamicDataSource dataSource = DynamicDataSource.getInstance(); |
// DynamicDataSource dataSource = DynamicDataSource.getInstance();
|
||||||
Map<Object, Object> map=new HashMap<Object, Object>(); |
// Map<Object, Object> map=new HashMap<Object, Object>();
|
||||||
map.put(SourceName, dynamicDataSource); |
// map.put(SourceName, dynamicDataSource);
|
||||||
dataSource.setTargetDataSources(map); |
// dataSource.setTargetDataSources(map);
|
||||||
System.out.println(dynamicDataSource.getUrl()); |
// System.out.println(dynamicDataSource.getUrl());
|
||||||
System.out.println(SourceName); |
// System.out.println(SourceName);
|
||||||
} |
// }
|
||||||
/** |
// /**
|
||||||
* 第二个sqlserver数据库 |
// * 第二个sqlserver数据库
|
||||||
* @param dbInfo |
// * @param dbInfo
|
||||||
* @param SourceName |
// * @param SourceName
|
||||||
*/ |
// */
|
||||||
public void SwitchSQLServerDataSource(DBEntity dbInfo,String SourceName) { |
// public void SwitchSQLServerDataSource(DBEntity dbInfo,String SourceName) {
|
||||||
System.out.println("进入数据源切换"); |
// System.out.println("进入数据源切换");
|
||||||
System.out.println("MaxWait:"+MaxWait); |
// System.out.println("MaxWait:"+MaxWait);
|
||||||
DruidDataSource dynamicDataSource = new DruidDataSource(); |
// DruidDataSource dynamicDataSource = new DruidDataSource();
|
||||||
dynamicDataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); |
// dynamicDataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
|
||||||
dynamicDataSource.setUrl("jdbc:sqlserver://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+";Databasename="+dbInfo.getDB_Names()); |
// dynamicDataSource.setUrl("jdbc:sqlserver://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+";Databasename="+dbInfo.getDB_Names());
|
||||||
dynamicDataSource.setUsername(dbInfo.getDB_UserName()); |
// dynamicDataSource.setUsername(dbInfo.getDB_UserName());
|
||||||
dynamicDataSource.setPassword(dbInfo.getDB_Pwd()); |
// dynamicDataSource.setPassword(dbInfo.getDB_Pwd());
|
||||||
System.out.println(dbInfo.getDB_UserName()); |
// System.out.println(dbInfo.getDB_UserName());
|
||||||
System.out.println(dbInfo.getDB_Pwd()); |
// System.out.println(dbInfo.getDB_Pwd());
|
||||||
dynamicDataSource.setMaxWait(MaxWait); |
// dynamicDataSource.setMaxWait(MaxWait);
|
||||||
dynamicDataSource.setMaxActive(maxActive); |
// dynamicDataSource.setMaxActive(maxActive);
|
||||||
dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); |
// dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
|
||||||
|
//
|
||||||
DynamicDataSource dataSource = DynamicDataSource.getInstance(); |
// DynamicDataSource dataSource = DynamicDataSource.getInstance();
|
||||||
Map<Object, Object> map=new HashMap<Object, Object>(); |
// Map<Object, Object> map=new HashMap<Object, Object>();
|
||||||
map.put(SourceName, dynamicDataSource); |
// map.put(SourceName, dynamicDataSource);
|
||||||
dataSource.setTargetDataSources(map); |
// dataSource.setTargetDataSources(map);
|
||||||
|
//
|
||||||
System.out.println(dynamicDataSource.getUrl()); |
// System.out.println(dynamicDataSource.getUrl());
|
||||||
System.out.println(SourceName); |
// System.out.println(SourceName);
|
||||||
} |
// }
|
||||||
} |
//}
|
||||||
|
@ -0,0 +1,34 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 数据结果集基本类 |
||||||
|
* @date 2024-07-10 16:49:24 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class BaseResultEntity { |
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
|
private Long id; |
||||||
|
private String deviceAddr; |
||||||
|
private String deviceType; |
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") |
||||||
|
private Date curDate; |
||||||
|
private String curValue; |
||||||
|
private String funCode; |
||||||
|
private String registerAddr; |
||||||
|
private String registerName; |
||||||
|
private int grade; |
||||||
|
private String projectId; |
||||||
|
private String projectName; |
||||||
|
|
||||||
|
} |
@ -1,24 +1,7 @@ |
|||||||
package com.mh.user.entity; |
package com.mh.user.entity; |
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat; |
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
import lombok.Data; |
|
||||||
|
|
||||||
import java.util.Date; |
@TableName("data_result_ch") |
||||||
|
public class DataResultChEntity extends BaseResultEntity { |
||||||
@Data |
|
||||||
public class DataResultChEntity { |
|
||||||
|
|
||||||
private Long id; |
|
||||||
private String deviceAddr; |
|
||||||
private String deviceType; |
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") |
|
||||||
private Date curDate; |
|
||||||
// private String curDate;
|
|
||||||
private String curValue; |
|
||||||
private String funCode; |
|
||||||
private String registerAddr; |
|
||||||
private String registerName; |
|
||||||
private int grade; |
|
||||||
private String projectID; |
|
||||||
private String projectName; |
|
||||||
} |
} |
||||||
|
@ -0,0 +1,7 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
|
@TableName("data_result_ch") |
||||||
|
public class DataResultChillerEntity extends BaseResultEntity { |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("data_result_cl") |
||||||
|
public class DataResultClBakEntity { |
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
|
private Long id; |
||||||
|
private String deviceAddr; |
||||||
|
private String deviceType; |
||||||
|
private Date curDate; |
||||||
|
private BigDecimal curValue; |
||||||
|
private BigDecimal lastValue; |
||||||
|
private Date lastDate; |
||||||
|
private BigDecimal ratio; |
||||||
|
private BigDecimal calcValue; |
||||||
|
private int grade; |
||||||
|
private String havedUpdate; |
||||||
|
private String registerAddr; |
||||||
|
private String registerName; |
||||||
|
private String projectName; |
||||||
|
private String projectId; |
||||||
|
|
||||||
|
} |
@ -1,23 +1,32 @@ |
|||||||
package com.mh.user.entity; |
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
import java.util.Date; |
import java.util.Date; |
||||||
|
|
||||||
@Data |
@Data |
||||||
|
@TableName("data_result_cl") |
||||||
public class DataResultClEntity { |
public class DataResultClEntity { |
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
private Long id; |
private Long id; |
||||||
private String deviceAddr; |
private String deviceAddr; |
||||||
private String deviceType; |
private String deviceType; |
||||||
private double lastValue; |
|
||||||
private Date lastDate; |
|
||||||
private double curValue; |
|
||||||
private Date curDate; |
private Date curDate; |
||||||
private double ratio; |
private BigDecimal curValue; |
||||||
private double calcValue; |
private BigDecimal lastValue; |
||||||
|
private Date lastDate; |
||||||
|
private BigDecimal ratio; |
||||||
|
private BigDecimal calcValue; |
||||||
private int grade; |
private int grade; |
||||||
|
private String havedUpdate; |
||||||
private String registerAddr; |
private String registerAddr; |
||||||
private String registerName; |
private String registerName; |
||||||
private String projectName; |
private String projectName; |
||||||
private String projectID; |
private String projectId; |
||||||
|
|
||||||
} |
} |
||||||
|
@ -1,22 +1,32 @@ |
|||||||
package com.mh.user.entity; |
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
import java.util.Date; |
import java.util.Date; |
||||||
|
|
||||||
|
@TableName("data_result") |
||||||
@Data |
@Data |
||||||
public class DataResultEntity { |
public class DataResultEntity { |
||||||
|
|
||||||
|
/** |
||||||
|
* 主键 |
||||||
|
*/ |
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
private Long id; |
private Long id; |
||||||
private String deviceAddr; |
private String deviceAddr; |
||||||
private String deviceType; |
private String deviceType; |
||||||
private double lastValue; |
private BigDecimal lastValue; |
||||||
private Date lastDate; |
private Date lastDate; |
||||||
private double curValue; |
private BigDecimal curValue; |
||||||
private Date curDate; |
private Date curDate; |
||||||
private double ratio; |
private BigDecimal ratio; |
||||||
private double calcValue; |
private BigDecimal calcValue; |
||||||
private int grade; |
private int grade; |
||||||
|
private String havedUpdate; |
||||||
private String projectName; |
private String projectName; |
||||||
private String projectID; |
private String projectID; |
||||||
} |
} |
||||||
|
@ -0,0 +1,7 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
|
@TableName("data_result_fifteen_mi") |
||||||
|
public class DataResultFifteenMiEntity extends BaseResultEntity { |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
|
@TableName("data_result_five_mi") |
||||||
|
public class DataResultFiveMiEntity extends BaseResultEntity { |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
|
@TableName("data_result_now") |
||||||
|
public class DataResultNowEntity extends BaseResultEntity { |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
|
@TableName("data_result_one_mi") |
||||||
|
public class DataResultOneMiEntity extends BaseResultEntity { |
||||||
|
} |
@ -0,0 +1,130 @@ |
|||||||
|
package com.mh.user.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 设备基表安装信息 |
||||||
|
* @date 2024-07-11 13:57:36 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@TableName("device_code") |
||||||
|
public class DeviceCodeEntity { |
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
|
private Long id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 通讯编号 |
||||||
|
*/ |
||||||
|
private String deviceAddr; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备类型 |
||||||
|
*/ |
||||||
|
private String deviceType; |
||||||
|
|
||||||
|
/** |
||||||
|
* 串口 |
||||||
|
*/ |
||||||
|
private String dataCom; |
||||||
|
|
||||||
|
/** |
||||||
|
* 端口 |
||||||
|
*/ |
||||||
|
private String dataPort; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备规格 |
||||||
|
*/ |
||||||
|
private String standard; |
||||||
|
|
||||||
|
/** |
||||||
|
* 安装位置 |
||||||
|
*/ |
||||||
|
private String installPosition; |
||||||
|
|
||||||
|
/** |
||||||
|
* 初始值 |
||||||
|
*/ |
||||||
|
private BigDecimal initValue; |
||||||
|
|
||||||
|
/** |
||||||
|
* 倍率 |
||||||
|
*/ |
||||||
|
private BigDecimal ratio; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否时总表 |
||||||
|
*/ |
||||||
|
private String isTotal; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否停用 |
||||||
|
*/ |
||||||
|
private String isForbid; |
||||||
|
|
||||||
|
/** |
||||||
|
* 停用时间 |
||||||
|
*/ |
||||||
|
private Date forbidDate; |
||||||
|
|
||||||
|
/** |
||||||
|
* 上次抄表读数 |
||||||
|
*/ |
||||||
|
private BigDecimal lastValue; |
||||||
|
|
||||||
|
/** |
||||||
|
* 上次抄表时间 |
||||||
|
*/ |
||||||
|
private Date lastDate; |
||||||
|
|
||||||
|
/** |
||||||
|
* 级别 |
||||||
|
*/ |
||||||
|
private int grade; |
||||||
|
|
||||||
|
/** |
||||||
|
* 波特率 |
||||||
|
*/ |
||||||
|
private int baudRate; |
||||||
|
|
||||||
|
/** |
||||||
|
* 项目ID |
||||||
|
*/ |
||||||
|
private String projectId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备名称 |
||||||
|
*/ |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 品牌 |
||||||
|
*/ |
||||||
|
private String brand; |
||||||
|
|
||||||
|
/** |
||||||
|
* 安装时间 |
||||||
|
*/ |
||||||
|
private Date installDate; |
||||||
|
|
||||||
|
/** |
||||||
|
* 奇偶校验 |
||||||
|
*/ |
||||||
|
private String parity; |
||||||
|
|
||||||
|
/** |
||||||
|
* 备注 |
||||||
|
*/ |
||||||
|
private String remarks; |
||||||
|
|
||||||
|
} |
@ -1,14 +1,77 @@ |
|||||||
package com.mh.user.entity; |
package com.mh.user.entity; |
||||||
|
|
||||||
import lombok.Data; |
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
@Data |
@TableName("strategy_info") |
||||||
public class StrategyInfoEntity { |
public class StrategyInfoEntity { |
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
private Long id; |
private Long id; |
||||||
private String dataAnalysis; |
private String dataAnalysis; |
||||||
private String operationOpt; |
private String operationOpt; |
||||||
private String controlOpt; |
private String controlOpt; |
||||||
private String projectID; |
private String projectId; |
||||||
private String systemID; |
private String systemId; |
||||||
|
|
||||||
|
public Long getId() { |
||||||
|
return id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setId(Long id) { |
||||||
|
this.id = id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDataAnalysis() { |
||||||
|
return dataAnalysis; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDataAnalysis(String dataAnalysis) { |
||||||
|
this.dataAnalysis = dataAnalysis; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOperationOpt() { |
||||||
|
return operationOpt; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOperationOpt(String operationOpt) { |
||||||
|
this.operationOpt = operationOpt; |
||||||
|
} |
||||||
|
|
||||||
|
public String getControlOpt() { |
||||||
|
return controlOpt; |
||||||
|
} |
||||||
|
|
||||||
|
public void setControlOpt(String controlOpt) { |
||||||
|
this.controlOpt = controlOpt; |
||||||
|
} |
||||||
|
|
||||||
|
public String getProjectId() { |
||||||
|
return projectId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setProjectId(String projectId) { |
||||||
|
this.projectId = projectId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSystemId() { |
||||||
|
return systemId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSystemId(String systemId) { |
||||||
|
this.systemId = systemId; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return "StrategyInfoEntity{" + |
||||||
|
"id=" + id + |
||||||
|
", dataAnalysis='" + dataAnalysis + '\'' + |
||||||
|
", operationOpt='" + operationOpt + '\'' + |
||||||
|
", controlOpt='" + controlOpt + '\'' + |
||||||
|
", projectId='" + projectId + '\'' + |
||||||
|
", systemId='" + systemId + '\'' + |
||||||
|
'}'; |
||||||
|
} |
||||||
} |
} |
||||||
|
@ -1,39 +0,0 @@ |
|||||||
package com.mh.user.job; |
|
||||||
|
|
||||||
import com.mh.user.constants.SocketMessage; |
|
||||||
import lombok.SneakyThrows; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.quartz.DisallowConcurrentExecution; |
|
||||||
import org.quartz.Job; |
|
||||||
import org.quartz.JobExecutionContext; |
|
||||||
import org.quartz.JobExecutionException; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :定时采集冷水机组参数 |
|
||||||
* @updateTime 2020-06-24 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
/** |
|
||||||
* :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. |
|
||||||
* :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 |
|
||||||
* :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, |
|
||||||
* 否则会在3秒时再启用新的线程执行 |
|
||||||
*/ |
|
||||||
@DisallowConcurrentExecution |
|
||||||
@Slf4j |
|
||||||
public class JobChillers implements Job { |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private SocketMessage socketMessage; |
|
||||||
|
|
||||||
@SneakyThrows |
|
||||||
@Override |
|
||||||
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { |
|
||||||
log.info("定时采集冷水机组"); |
|
||||||
// NettyChillerClient nettyChillerClient = new NettyChillerClient();
|
|
||||||
|
|
||||||
} |
|
||||||
} |
|
@ -1,41 +0,0 @@ |
|||||||
package com.mh.user.job; |
|
||||||
|
|
||||||
import com.mh.user.netty.NettyClient; |
|
||||||
import com.mh.user.constants.SocketMessage; |
|
||||||
import lombok.SneakyThrows; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.quartz.DisallowConcurrentExecution; |
|
||||||
import org.quartz.Job; |
|
||||||
import org.quartz.JobExecutionContext; |
|
||||||
import org.quartz.JobExecutionException; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description : 定时采集冷量计任务 |
|
||||||
* @updateTime 2020-05-18 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
/** |
|
||||||
* :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. |
|
||||||
* :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 |
|
||||||
* :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, |
|
||||||
* 否则会在3秒时再启用新的线程执行 |
|
||||||
*/ |
|
||||||
@DisallowConcurrentExecution |
|
||||||
@Slf4j |
|
||||||
public class JobCloud implements Job { |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private SocketMessage socketMessage; |
|
||||||
|
|
||||||
@SneakyThrows |
|
||||||
@Override |
|
||||||
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { |
|
||||||
// 定时采集冷量计
|
|
||||||
log.info("定时采集冷量计"); |
|
||||||
NettyClient nettyClient = new NettyClient(); |
|
||||||
nettyClient.connect(socketMessage.getPort(),socketMessage.getIP()); |
|
||||||
} |
|
||||||
} |
|
@ -1,39 +0,0 @@ |
|||||||
package com.mh.user.job; |
|
||||||
|
|
||||||
import com.mh.user.constants.SocketMessage; |
|
||||||
import com.mh.user.netty.NettyChillerDDCClient; |
|
||||||
import lombok.SneakyThrows; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.quartz.DisallowConcurrentExecution; |
|
||||||
import org.quartz.Job; |
|
||||||
import org.quartz.JobExecutionContext; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : 定时采集DDC设备 |
|
||||||
* @description : |
|
||||||
* @updateTime 2020-06-09 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
/** |
|
||||||
* :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. |
|
||||||
* :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 |
|
||||||
* :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, |
|
||||||
* 否则会在3秒时再启用新的线程执行 |
|
||||||
*/ |
|
||||||
@DisallowConcurrentExecution |
|
||||||
@Slf4j |
|
||||||
public class JobDDC implements Job { |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private SocketMessage socketMessage; |
|
||||||
|
|
||||||
@SneakyThrows |
|
||||||
@Override |
|
||||||
public void execute(JobExecutionContext jobExecutionContext) { |
|
||||||
log.info("定时采集DDC设备"); |
|
||||||
// NettyChillerDDCClient nettyChillerDDCClient = new NettyChillerDDCClient();
|
|
||||||
NettyChillerDDCClient.connect(socketMessage.getPort(), socketMessage.getIP()); |
|
||||||
} |
|
||||||
} |
|
@ -1,45 +0,0 @@ |
|||||||
package com.mh.user.job; |
|
||||||
|
|
||||||
import org.quartz.spi.TriggerFiredBundle; |
|
||||||
import org.springframework.beans.factory.config.AutowireCapableBeanFactory; |
|
||||||
import org.springframework.scheduling.quartz.AdaptableJobFactory; |
|
||||||
import org.springframework.stereotype.Component; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title :创建JobFactory实例 |
|
||||||
* @description : |
|
||||||
* @updateTime 2020-04-03 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Component |
|
||||||
public class JobFactory extends AdaptableJobFactory { |
|
||||||
|
|
||||||
/** |
|
||||||
* AutowireCapableBeanFactory接口是BeanFactory的子类 |
|
||||||
* 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 |
|
||||||
*/ |
|
||||||
private AutowireCapableBeanFactory factory; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author jinhaoxun |
|
||||||
* @description 构造器 |
|
||||||
* @param factory |
|
||||||
*/ |
|
||||||
public JobFactory(AutowireCapableBeanFactory factory) { |
|
||||||
this.factory = factory; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @author jinhaoxun |
|
||||||
* @description 创建Job实例 |
|
||||||
* @param bundle |
|
||||||
* @return Object |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { |
|
||||||
Object job = super.createJobInstance(bundle);// 实例化对象
|
|
||||||
factory.autowireBean(job);// 进行注入(Spring管理该Bean)
|
|
||||||
return job;//返回对象
|
|
||||||
} |
|
||||||
} |
|
@ -1,39 +0,0 @@ |
|||||||
package com.mh.user.job; |
|
||||||
|
|
||||||
import com.mh.user.netty.NettyMeterClient; |
|
||||||
import com.mh.user.constants.SocketMessage; |
|
||||||
import lombok.SneakyThrows; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.quartz.DisallowConcurrentExecution; |
|
||||||
import org.quartz.Job; |
|
||||||
import org.quartz.JobExecutionContext; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description : 定时采集电表数据任务 |
|
||||||
* @updateTime 2020-05-18 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
/** |
|
||||||
* :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. |
|
||||||
* :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 |
|
||||||
* :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, |
|
||||||
* 否则会在3秒时再启用新的线程执行 |
|
||||||
*/ |
|
||||||
@DisallowConcurrentExecution |
|
||||||
@Slf4j |
|
||||||
public class JobMeter implements Job { |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private SocketMessage socketMessage; |
|
||||||
|
|
||||||
@SneakyThrows |
|
||||||
@Override |
|
||||||
public void execute(JobExecutionContext jobExecutionContext) { |
|
||||||
log.info("定时采集电表数据任务开始"); |
|
||||||
NettyMeterClient nettyMeterClient = new NettyMeterClient(); |
|
||||||
nettyMeterClient.connect(socketMessage.getPort(), socketMessage.getIP()); |
|
||||||
} |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
package com.mh.user.job; |
|
||||||
|
|
||||||
import com.mh.user.constants.Constant; |
|
||||||
import lombok.SneakyThrows; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.quartz.DisallowConcurrentExecution; |
|
||||||
import org.quartz.Job; |
|
||||||
import org.quartz.JobExecutionContext; |
|
||||||
import org.quartz.JobExecutionException; |
|
||||||
|
|
||||||
/** |
|
||||||
* :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. |
|
||||||
* :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 |
|
||||||
* :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, |
|
||||||
* 否则会在3秒时再启用新的线程执行 |
|
||||||
*/ |
|
||||||
@DisallowConcurrentExecution |
|
||||||
@Slf4j |
|
||||||
public class JobTest implements Job { |
|
||||||
@SneakyThrows |
|
||||||
@Override |
|
||||||
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { |
|
||||||
for (int i = 0; i < 30; i++) { |
|
||||||
if (Constant.FLAG) { |
|
||||||
break; |
|
||||||
} |
|
||||||
Thread.sleep(1000); |
|
||||||
log.info("第" + i + "个," +jobExecutionContext.getJobDetail()+"---------------------定时任务测试----------------------"); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,73 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultClEntity; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 数据冷量计 |
||||||
|
* @date 2024-07-10 15:20:55 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultChMapper extends BaseMapper<DataResultChEntity> { |
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------
|
||||||
|
//保存冷量计数据
|
||||||
|
@Insert("insert into data_result_ch(device_addr,device_type,fun_code,register_addr,register_name,cur_value,cur_date,project_id,grade) values (" + |
||||||
|
" #{deviceAddr},#{deviceType},#{funCode},#{registerAddr},#{registerName},#{curValue},#{curDate},#{projectID},#{grade})") |
||||||
|
void saveDataResultCh(DataResultChEntity dataResultChEntity); |
||||||
|
|
||||||
|
@Update("<script>" + |
||||||
|
" update data_result_ch set " + |
||||||
|
" <if test='deviceAddr!=null'> device_addr = #{deviceAddr} </if>" + |
||||||
|
" <if test='deviceType!=null'> , device_type = #{deviceType} </if>" + |
||||||
|
" <if test='funCode!=null'> , fun_code = #{funCode} </if>" + |
||||||
|
" <if test='registerAddr!=null'> , register_addr = #{registerAddr} </if>" + |
||||||
|
" <if test='registerName!=null'> , register_name = #{registerName} </if>" + |
||||||
|
" <if test='curValue!=null'> , cur_value = #{curValue} </if>" + |
||||||
|
" <if test='projectID!=null'> , project_id = #{projectID} </if>" + |
||||||
|
" <if test='grade!=null'> , grade = #{grade} </if>" + |
||||||
|
" where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType}" + |
||||||
|
"</script>") |
||||||
|
void updateDataResultCh(DataResultChEntity dataResultChEntity); |
||||||
|
|
||||||
|
@Select("select count(*) from data_result_ch " + |
||||||
|
" where cur_date=#{curDate} " + |
||||||
|
" and device_addr=#{deviceAddr} " + |
||||||
|
" and register_addr=#{registerAddr} " + |
||||||
|
" and project_id=#{projectID} " + |
||||||
|
" and grade = #{grade} ") |
||||||
|
int selectDataResultChCount(@Param("curDate") String curDate, |
||||||
|
@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("registerAddr") String registerAddr, |
||||||
|
@Param("projectID") String projectID, |
||||||
|
@Param("grade") int grade); |
||||||
|
|
||||||
|
@Select("select " + |
||||||
|
" t1.project_id, " + |
||||||
|
" sum(cast (t1.curValue AS decimal(18, 2)))as cur_value, " + |
||||||
|
" t1.cur_date, " + |
||||||
|
" t2.project_name " + |
||||||
|
"from " + |
||||||
|
" data_result_ch t1 " + |
||||||
|
"join project_info t2 on " + |
||||||
|
" t1.project_id = t2.id " + |
||||||
|
"where " + |
||||||
|
" t1.project_id = #{projectID} " + |
||||||
|
" and t1.cur_date >= #{startDate} " + |
||||||
|
" and t1.cur_date <= #{curDate} " + |
||||||
|
"group by " + |
||||||
|
" t1.cur_date, " + |
||||||
|
" t1.project_id, " + |
||||||
|
" t2.project_name " + |
||||||
|
"order by " + |
||||||
|
" t1.cur_date ") |
||||||
|
List<DataResultChEntity> queryDataResultCh(@Param("projectID") String projectID, @Param("startDate") String startDate, @Param("curDate") String curDate); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,105 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultChillerEntity; |
||||||
|
import com.mh.user.mapper.provider.DataResultProvider; |
||||||
|
import com.mh.user.model.ChillerModel; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 主机参数保存 |
||||||
|
* @date 2024-07-10 15:41:15 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultChillerMapper extends BaseMapper<DataResultChillerEntity> { |
||||||
|
|
||||||
|
//保存冷水机数据
|
||||||
|
@Insert("insert into data_result_chiller(device_addr,device_type,fun_code,register_addr,register_name,cur_value,cur_date,project_id,grade) values (" + |
||||||
|
" #{deviceAddr},#{deviceType},#{funCode},#{registerAddr},#{registerName},#{curValue},#{curDate},#{projectID},#{grade})") |
||||||
|
void saveDataResultChiller(DataResultChEntity dataResultChEntity); |
||||||
|
|
||||||
|
@Update("<script>" + |
||||||
|
" update data_result_chiller set " + |
||||||
|
" <if test='deviceAddr!=null'> device_addr = #{deviceAddr} </if>" + |
||||||
|
" <if test='deviceType!=null'> , device_type = #{deviceType} </if>" + |
||||||
|
" <if test='funCode!=null'> , fun_code = #{funCode} </if>" + |
||||||
|
" <if test='registerAddr!=null'> , register_addr = #{registerAddr} </if>" + |
||||||
|
" <if test='registerName!=null'> , register_name = #{registerName} </if>" + |
||||||
|
" <if test='curValue!=null'> , cur_value = #{curValue} </if>" + |
||||||
|
" <if test='projectID!=null'> , project_id = #{projectID} </if>" + |
||||||
|
" <if test='grade!=null'> , grade = #{grade} </if>" + |
||||||
|
" where cur_date=#{curDate} and device_addr=#{deviceAddr} and register_addr=#{registerAddr} and project_id=#{projectID} " + |
||||||
|
"</script>") |
||||||
|
void updateDataResultChiller(DataResultChEntity dataResultChEntity); |
||||||
|
|
||||||
|
@Select("select count(*) from data_result_chiller where cur_date=#{curDate} " + |
||||||
|
" and device_addr=#{deviceAddr} " + |
||||||
|
" and register_addr=#{registerAddr} " + |
||||||
|
" and project_id=#{projectID} " + |
||||||
|
" and fun_code = #{funCode} ") |
||||||
|
int selectDataResultChillerCount(@Param("curDate") String curDate, |
||||||
|
@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("registerAddr") String registerAddr, |
||||||
|
@Param("projectID") String projectID, |
||||||
|
@Param("funCode") String funCode); |
||||||
|
|
||||||
|
@Results({ |
||||||
|
@Result(property="deviceAddr",column="deviceAddr"), |
||||||
|
@Result(property="deviceType",column="deviceType"), |
||||||
|
@Result(property="curDate",column="curDate"), |
||||||
|
@Result(property ="curValue",column ="curValue"), |
||||||
|
@Result(property="funCode",column="funCode"), |
||||||
|
@Result(property="registerAddr",column="registerAddr"), |
||||||
|
@Result(property="registerName",column="registerName"), |
||||||
|
@Result(property="grade",column="grade"), |
||||||
|
@Result(property="projectID",column="projectID"), |
||||||
|
@Result(property="projectName",column="project_name") |
||||||
|
}) |
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "queryDataResultChiller") |
||||||
|
List<DataResultChEntity> queryDataResultChiller(@Param("projectID") String projectID, |
||||||
|
@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("registerName") String registerName, |
||||||
|
@Param("startDate") String startDate, |
||||||
|
@Param("curDate") String curDate, |
||||||
|
@Param("page") int page, |
||||||
|
@Param("limit") int limit); |
||||||
|
|
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "dataResultChillerCount") |
||||||
|
int dataResultChillerCount(@Param("projectID") String projectID, |
||||||
|
@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("registerName") String registerName, |
||||||
|
@Param("startDate") String startDate, |
||||||
|
@Param("curDate") String curDate); |
||||||
|
|
||||||
|
|
||||||
|
//保存冷水机参数数据
|
||||||
|
@Insert("insert into data_chiller" + |
||||||
|
"(device_addr," + |
||||||
|
"device_name," + |
||||||
|
"run_state," + |
||||||
|
"set_soint," + |
||||||
|
"enter_chw," + |
||||||
|
"leave_chw," + |
||||||
|
"enter_cow," + |
||||||
|
"leave_cow," + |
||||||
|
"power," + |
||||||
|
"rated_power," + |
||||||
|
"chiller_amps," + |
||||||
|
"refrigeration," + |
||||||
|
"rated_ref," + |
||||||
|
"chw_flow," + |
||||||
|
"approach_cow," + |
||||||
|
"approach_chw," + |
||||||
|
"cop," + |
||||||
|
"rated_cop," + |
||||||
|
"copy_date) values (" + |
||||||
|
" #{deviceAddr},#{deviceName},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade})") |
||||||
|
void saveDataChiller(ChillerModel chillerModel); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultClBakEntity; |
||||||
|
import com.mh.user.entity.DataResultClEntity; |
||||||
|
import org.apache.ibatis.annotations.Insert; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
import org.apache.ibatis.annotations.Select; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 数据冷量计 |
||||||
|
* @date 2024-07-10 15:20:55 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultClBakMapper extends BaseMapper<DataResultClBakEntity> { |
||||||
|
|
||||||
|
@Insert("insert into data_result_cl_bak(device_addr,device_type,project_id,last_value,last_date,cur_value,cur_date,ratio,calc_value,grade,register_addr,register_name) values (" + |
||||||
|
" #{deviceAddr},#{deviceType},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade},#{registerAddr},#{registerName})") |
||||||
|
void saveDataResultCl_bak(DataResultClEntity dataResultClEntity); |
||||||
|
|
||||||
|
@Select("select count(1) from data_result_cl_bak " + |
||||||
|
" where cur_date = #{curDate} " + |
||||||
|
" and device_addr = #{deviceAddr} " + |
||||||
|
" and registerAddr = #{registerAddr} " + |
||||||
|
" and project_id = #{projectId} ") |
||||||
|
int selectDataResultChBakCount(@Param("curDate") String curDate, |
||||||
|
@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("registerAddr") String registerAddr, |
||||||
|
@Param("projectId") String projectId); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultClEntity; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 数据冷量计 |
||||||
|
* @date 2024-07-10 15:20:55 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultClMapper extends BaseMapper<DataResultClEntity> { |
||||||
|
//----------------------------------------------------------------------------------------------
|
||||||
|
//保存冷量计数据
|
||||||
|
@Insert("insert into data_result_cl(device_addr,device_type,project_id,last_value,last_date,cur_value,cur_date,ratio,calc_value,grade,register_addr,register_mame) values (" + |
||||||
|
" #{deviceAddr},#{deviceType},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade},#{registerAddr},#{registerName})") |
||||||
|
void saveDataResultCl(DataResultClEntity dataResultClEntity); |
||||||
|
|
||||||
|
@Update("<script>" + |
||||||
|
" update data_result_cl set " + |
||||||
|
" <if test='deviceAddr!=null'> device_addr = #{deviceAddr} </if>" + |
||||||
|
" <if test='deviceType!=null'> , device_type = #{deviceType} </if>" + |
||||||
|
" <if test='projectID!=null'> , project_id = #{projectID} </if>" + |
||||||
|
" <if test='lastValue!=null'> , last_value = #{lastValue} </if>" + |
||||||
|
" <if test='lastDate!=null'> , last_date = #{lastDate} </if>" + |
||||||
|
" <if test='curValue!=null'> , cur_value = #{curValue} </if>" + |
||||||
|
" <if test='ratio!=null'> , ratio = #{ratio} </if>" + |
||||||
|
" <if test='calcValue!=null'> , calc_value = #{calcValue} </if>" + |
||||||
|
" <if test='grade!=null'> , grade = #{grade} </if>" + |
||||||
|
" <if test='registerAddr!=null'> , register_addr = #{registerAddr} </if>" + |
||||||
|
" <if test='registerName!=null'> , register_name = #{registerName} </if>" + |
||||||
|
" where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType}" + |
||||||
|
"</script>") |
||||||
|
void updateDataResultCl(DataResultClEntity dataResultClEntity); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultFifteenMiEntity; |
||||||
|
import com.mh.user.entity.DataResultFiveMiEntity; |
||||||
|
import com.mh.user.mapper.provider.DataResultProvider; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
import org.apache.ibatis.annotations.ResultMap; |
||||||
|
import org.apache.ibatis.annotations.SelectProvider; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 每分钟保存数据 |
||||||
|
* @date 2024-07-10 17:34:30 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultFifteenMiMapper extends BaseMapper<DataResultFifteenMiEntity> { |
||||||
|
|
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "queryDataResultFifteenMi") |
||||||
|
List<DataResultChEntity> queryDataResultFifteenMi(@Param("projectID") String projectID, |
||||||
|
@Param("startDate") String startDate, |
||||||
|
@Param("curDate") String curDate, |
||||||
|
@Param("page") int page, |
||||||
|
@Param("limit") int limit); |
||||||
|
|
||||||
|
//@Select("select count(*) from data_result_fifteen_mi where projectID=#{projectID} and curDate>=#{startDate} and curDate<=#{curDate} ")
|
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "dataResultFifteenMiCount") |
||||||
|
int dataResultFifteenMiCount(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultFiveMiEntity; |
||||||
|
import com.mh.user.entity.DataResultOneMiEntity; |
||||||
|
import com.mh.user.mapper.provider.DataResultProvider; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 每分钟保存数据 |
||||||
|
* @date 2024-07-10 17:34:30 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultFiveMiMapper extends BaseMapper<DataResultFiveMiEntity> { |
||||||
|
|
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "queryDataResultFiveMi") |
||||||
|
List<DataResultChEntity> queryDataResultFiveMi(@Param("projectID") String projectID, |
||||||
|
@Param("startDate") String startDate, |
||||||
|
@Param("curDate") String curDate, |
||||||
|
@Param("page") int page, |
||||||
|
@Param("limit") int limit); |
||||||
|
|
||||||
|
|
||||||
|
// @Select("select count(*) from data_result_five_mi where projectID=#{projectID} and curDate>=#{startDate} and curDate<=#{curDate} ")
|
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "dataResultFiveMiCount") |
||||||
|
int dataResultFiveMiCount(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultNowEntity; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 当前记录 |
||||||
|
* @date 2024-07-11 13:41:04 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultNowMapper extends BaseMapper<DataResultNowEntity> { |
||||||
|
|
||||||
|
@Insert("insert into data_result_now(deviceAddr,deviceType,funCode,registerAddr,registerName,curValue,curDate,projectID,grade) values (" + |
||||||
|
" #{deviceAddr},#{deviceType},#{funCode},#{registerAddr},#{registerName},#{curValue},#{curDate},#{projectID},#{grade})") |
||||||
|
void saveDataResultNow(DataResultChEntity dataResultChEntity); |
||||||
|
|
||||||
|
@Delete("delete from data_result_now where deviceAddr=#{deviceAddr} and deviceType = #{deviceType} and registerAddr=#{registerAddr} and projectID=#{projectID}") |
||||||
|
void deleteDataResultNow(@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("deviceType") String deviceType, |
||||||
|
@Param("registerAddr") String registerAddr, |
||||||
|
@Param("projectID") String projectID); |
||||||
|
|
||||||
|
//实时参数读取
|
||||||
|
@Select("select * from data_result_now where deviceAddr=#{deviceAddr} and deviceType=#{deviceType} and projectID=#{projectID} ") |
||||||
|
List<DataResultChEntity> selectDataResultNow(@Param("deviceAddr") String deviceAddr, |
||||||
|
@Param("deviceType") String deviceType, |
||||||
|
@Param("projectID") String projectID); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DataResultChEntity; |
||||||
|
import com.mh.user.entity.DataResultOneMiEntity; |
||||||
|
import com.mh.user.mapper.provider.DataResultProvider; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 每分钟保存数据 |
||||||
|
* @date 2024-07-10 17:34:30 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DataResultOneMiMapper extends BaseMapper<DataResultOneMiEntity> { |
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
@Results(id="rsc", value = { |
||||||
|
@Result(property="deviceAddr",column="deviceAddr"), |
||||||
|
@Result(property="deviceType",column="deviceType"), |
||||||
|
@Result(property="curDate",column="curDate"), |
||||||
|
@Result(property ="curValue",column ="curValue"), |
||||||
|
@Result(property="funCode",column="funCode"), |
||||||
|
@Result(property="registerAddr",column="registerAddr"), |
||||||
|
@Result(property="registerName",column="registerName"), |
||||||
|
@Result(property="grade",column="grade"), |
||||||
|
@Result(property="projectID",column="projectID"), |
||||||
|
@Result(property="projectName",column="project_name") |
||||||
|
}) |
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "queryDataResultOneMi") |
||||||
|
List<DataResultChEntity> queryDataResultOneMi(@Param("projectID") String projectID, |
||||||
|
@Param("startDate") String startDate, |
||||||
|
@Param("curDate") String curDate, |
||||||
|
@Param("page") int page, |
||||||
|
@Param("limit") int limit); |
||||||
|
|
||||||
|
//查询记录数
|
||||||
|
// @Select("select count(*) from data_result_one_mi where projectID=#{projectID} and curDate>=#{startDate} and curDate<=#{curDate} ")
|
||||||
|
@SelectProvider(type = DataResultProvider.class,method = "dataResultOneMiCount") |
||||||
|
int dataResultOneMiCount(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.mh.user.entity.DeviceCodeEntity; |
||||||
|
import com.mh.user.model.ChillerModel; |
||||||
|
import com.mh.user.model.DeviceModel; |
||||||
|
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author LJF |
||||||
|
* @version 1.0 |
||||||
|
* @project mh_esi |
||||||
|
* @description 设备参数mapper |
||||||
|
* @date 2024-07-11 15:37:48 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface DeviceCodeMapper extends BaseMapper<DeviceCodeEntity> { |
||||||
|
|
||||||
|
//查询冷水机设备列表
|
||||||
|
@Results({ |
||||||
|
@Result(column = "device_addr",property = "deviceAddr" ), |
||||||
|
@Result(column = "device_name", property = "deviceName") |
||||||
|
}) |
||||||
|
@Select("select * from device_code where project_id=#{projectID} and device_type='冷水机'") |
||||||
|
List<DeviceModel> selectDevices(@Param("projectID") String projectID); |
||||||
|
|
||||||
|
|
||||||
|
//查询多个冷水机相关信息
|
||||||
|
@Results({ |
||||||
|
@Result(column = "device_addr",property = "deviceAddr" ), |
||||||
|
@Result(column = "device_name", property = "deviceName"), |
||||||
|
@Result(column = "runState", property = "runState"), |
||||||
|
@Result(column = "setPoint", property = "setPoint"), |
||||||
|
@Result(column = "enterChw", property = "enterChw"), |
||||||
|
@Result(column = "leaveChw", property = "leaveChw"), |
||||||
|
@Result(column = "enterCow", property = "enterCow"), |
||||||
|
@Result(column = "leaveCow", property = "leaveCow"), |
||||||
|
@Result(column = "power", property = "power"), |
||||||
|
@Result(column = "ratedPower", property = "ratedPower"), |
||||||
|
@Result(column = "chillerAmps", property = "chillerAmps"), |
||||||
|
@Result(column = "refrigeration", property = "refrigeration"), |
||||||
|
@Result(column = "ratedRef", property = "ratedRef"), |
||||||
|
@Result(column = "chwFlow", property = "chwFlow"), |
||||||
|
@Result(column = "ApproachCow", property = "ApproachCow"), |
||||||
|
@Result(column = "ApproachChw", property = "ApproachChw"), |
||||||
|
@Result(column = "cop", property = "cop"), |
||||||
|
@Result(column = "ratedCop", property = "ratedCop"), |
||||||
|
@Result(column = "copyDate", property = "copyDate") |
||||||
|
}) |
||||||
|
@Select("select * from device_code where project_id=#{projectID} and device_addr=#{deviceAddr} ") |
||||||
|
List<ChillerModel> queryChiller(@Param("projectID") String projectID, @Param("device_addr") String deviceAddr); |
||||||
|
|
||||||
|
} |
@ -1,24 +1,24 @@ |
|||||||
package com.mh.user.mapper; |
package com.mh.user.mapper; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
import com.mh.user.entity.StrategyInfoEntity; |
import com.mh.user.entity.StrategyInfoEntity; |
||||||
import com.mh.user.mapper.provider.DeviceInfoProvider; |
|
||||||
import com.mh.user.mapper.provider.StrategyInfoProvider; |
|
||||||
import org.apache.ibatis.annotations.*; |
import org.apache.ibatis.annotations.*; |
||||||
|
|
||||||
import java.util.List; |
import java.util.List; |
||||||
|
|
||||||
@Mapper |
@Mapper |
||||||
public interface StrategyInfoMapper { |
public interface StrategyInfoMapper extends BaseMapper<StrategyInfoEntity> { |
||||||
|
|
||||||
//查询仪表信息
|
//查询仪表信息
|
||||||
@SelectProvider(type = StrategyInfoProvider.class,method = "queryStrategyInfo") |
@Select("<script>" + |
||||||
@Results(value = { |
"select * from strategy_info where 1=1 " + |
||||||
@Result(property="id",column="id"), |
"<if test='systemID != null and systemID != \"\"'>" + |
||||||
@Result(property="dataAnalysis",column="dataAnalysis"), |
" and system_id = #{systemID} " + |
||||||
@Result(property="operationOpt",column="operation_opt"), |
"</if>" + |
||||||
@Result(property="controlOpt",column="control_opt"), |
"<if test='projectID != null and projectID != \"\"'>" + |
||||||
@Result(property="projectID",column="project_id"), |
" and project_id = #{projectID} " + |
||||||
@Result(property="systemID",column="system_id") |
"</if>" + |
||||||
}) |
" order by id " + |
||||||
|
"</script>") |
||||||
List<StrategyInfoEntity> queryStrategyInfo(@Param("systemID") String systemID,@Param("projectID") String projectID); |
List<StrategyInfoEntity> queryStrategyInfo(@Param("systemID") String systemID,@Param("projectID") String projectID); |
||||||
} |
} |
||||||
|
@ -1,21 +0,0 @@ |
|||||||
package com.mh.user.mapper.provider; |
|
||||||
|
|
||||||
|
|
||||||
public class StrategyInfoProvider { |
|
||||||
|
|
||||||
public String queryStrategyInfo(String systemID,String projectID){ |
|
||||||
StringBuffer sql = new StringBuffer(""); |
|
||||||
sql.append("select * from (" + |
|
||||||
" select *,ROW_NUMBER() over(order by id) as rn from strategy_info " + |
|
||||||
" where 1=1 "); |
|
||||||
if (systemID != null && !systemID.equals("")){ |
|
||||||
sql.append(" AND system_id = #{systemID} "); |
|
||||||
} |
|
||||||
if (projectID != null && !projectID.equals("")){ |
|
||||||
sql.append(" AND project_id = #{projectID} "); |
|
||||||
} |
|
||||||
sql.append(" ) T "); |
|
||||||
System.out.println(sql.toString()); |
|
||||||
return sql.toString(); |
|
||||||
} |
|
||||||
} |
|
@ -1,95 +0,0 @@ |
|||||||
//package com.mh.user.netty;
|
|
||||||
//
|
|
||||||
//import io.netty.bootstrap.Bootstrap;
|
|
||||||
//import io.netty.channel.*;
|
|
||||||
//import io.netty.channel.nio.NioEventLoopGroup;
|
|
||||||
//import io.netty.channel.socket.SocketChannel;
|
|
||||||
//import io.netty.channel.socket.nio.NioSocketChannel;
|
|
||||||
//import io.netty.handler.timeout.IdleStateHandler;
|
|
||||||
//import io.netty.handler.timeout.ReadTimeoutHandler;
|
|
||||||
//import io.netty.handler.timeout.WriteTimeoutHandler;
|
|
||||||
//import lombok.Getter;
|
|
||||||
//import lombok.Setter;
|
|
||||||
//import lombok.extern.slf4j.Slf4j;
|
|
||||||
//
|
|
||||||
//import java.util.concurrent.TimeUnit;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * @author ljf
|
|
||||||
// * @title :
|
|
||||||
// * @description :Netty冷水机组客户端
|
|
||||||
// * @updateTime 2020-05-13
|
|
||||||
// * @throws :
|
|
||||||
// */
|
|
||||||
//@Slf4j
|
|
||||||
//@Setter
|
|
||||||
//@Getter
|
|
||||||
//public class NettyChillerClient {
|
|
||||||
//
|
|
||||||
// private volatile static NettyChillerDDCClient nettyChillerDDCClient = new NettyChillerDDCClient();
|
|
||||||
//
|
|
||||||
// private int port;
|
|
||||||
// private String host;
|
|
||||||
//
|
|
||||||
// // 构造函数传递值 继承Thread时需要
|
|
||||||
//// public NettyClient(int port, String host) {
|
|
||||||
//// this.port = port;
|
|
||||||
//// this.host = host;
|
|
||||||
//// }
|
|
||||||
//
|
|
||||||
// public static void connect(int port, String host) throws InterruptedException {
|
|
||||||
// // 配置客户端NIO线程组
|
|
||||||
// EventLoopGroup group = new NioEventLoopGroup(1);
|
|
||||||
// try {
|
|
||||||
// Bootstrap bootstrap = new Bootstrap();
|
|
||||||
// bootstrap.group(group).channel(NioSocketChannel.class)
|
|
||||||
// .option(ChannelOption.TCP_NODELAY, true)
|
|
||||||
// .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
|
|
||||||
// .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024))
|
|
||||||
// .handler(new ChannelInitializer<SocketChannel>() {
|
|
||||||
// @Override
|
|
||||||
// protected void initChannel(SocketChannel socketChannel) {
|
|
||||||
// // 基于换行符号
|
|
||||||
//// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0));
|
|
||||||
//// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
//// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
|
|
||||||
//// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
//// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8));
|
|
||||||
//// socketChannel.pipeline().addLast(new LengthFieldPrepender(4));
|
|
||||||
// socketChannel.pipeline().addLast(new IdleStateHandler(10,10,10, TimeUnit.SECONDS));
|
|
||||||
// // 在管道中添加我们自己的接收数据实现方法
|
|
||||||
// socketChannel.pipeline().addLast(new NettyChillerClientHandler());
|
|
||||||
//// socketChannel.pipeline().addLast(new NettyMeterClientHandler());
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// // 发起异步连接操作
|
|
||||||
// ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
|
|
||||||
// if (channelFuture.isSuccess()) {
|
|
||||||
// log.info("connect server 成功---------");
|
|
||||||
// } else {
|
|
||||||
// log.info("连接失败!");
|
|
||||||
// log.info("准备重连!");
|
|
||||||
//// connect(port, host);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程
|
|
||||||
// channelFuture.channel().closeFuture().sync();
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// log.error("error>>>>>>" + e.getMessage());
|
|
||||||
// } finally {
|
|
||||||
// group.shutdownGracefully();
|
|
||||||
//// try {
|
|
||||||
//// TimeUnit.SECONDS.sleep(5);
|
|
||||||
//// connect(port, host); // 断线重连
|
|
||||||
//// } catch (InterruptedException e) {
|
|
||||||
//// e.printStackTrace();
|
|
||||||
//// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//// @SneakyThrows
|
|
||||||
//// @Override
|
|
||||||
//// public void run() {
|
|
||||||
//// connect(port, host);
|
|
||||||
//// }
|
|
||||||
//}
|
|
@ -1,315 +0,0 @@ |
|||||||
//package com.mh.user.netty;
|
|
||||||
//
|
|
||||||
//import com.mh.user.constants.Constant;
|
|
||||||
//import com.mh.user.entity.ChillersEntity;
|
|
||||||
//import com.mh.user.entity.DeviceCodeParamEntity;
|
|
||||||
//import com.mh.user.service.DeviceCodeParamService;
|
|
||||||
//import com.mh.user.service.chillers.ChillersService;
|
|
||||||
//import com.mh.user.service.chillers.GatewayManageService;
|
|
||||||
//import com.mh.user.utils.AnalysisReceiveOrder485;
|
|
||||||
//import com.mh.user.utils.ExchangeStringUtil;
|
|
||||||
//import com.mh.user.utils.GetReadOrder485;
|
|
||||||
//import com.mh.user.utils.SpringBeanUtil;
|
|
||||||
//import io.netty.buffer.ByteBuf;
|
|
||||||
//import io.netty.channel.Channel;
|
|
||||||
//import io.netty.channel.ChannelHandlerAdapter;
|
|
||||||
//import io.netty.channel.ChannelHandlerContext;
|
|
||||||
//import io.netty.handler.timeout.IdleState;
|
|
||||||
//import io.netty.handler.timeout.IdleStateEvent;
|
|
||||||
//import io.netty.util.ReferenceCountUtil;
|
|
||||||
//import lombok.extern.slf4j.Slf4j;
|
|
||||||
//import org.springframework.context.ApplicationContext;
|
|
||||||
//
|
|
||||||
//import java.text.SimpleDateFormat;
|
|
||||||
//import java.util.Date;
|
|
||||||
//import java.util.List;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * @author ljf
|
|
||||||
// * @title :
|
|
||||||
// * @description :客户端异步消息处理机制,采集冷水机组
|
|
||||||
// * @updateTime 2020-05-13
|
|
||||||
// * @throws :
|
|
||||||
// */
|
|
||||||
//@Slf4j
|
|
||||||
//public class NettyChillerClientHandler extends ChannelHandlerAdapter {
|
|
||||||
//
|
|
||||||
// private int num = 0;
|
|
||||||
// private int size = 0;
|
|
||||||
// private int idle_count = 0;
|
|
||||||
// private String receiveStr = "";
|
|
||||||
// List<DeviceCodeParamEntity> deviceCodeParamList;
|
|
||||||
//
|
|
||||||
// // 调用service
|
|
||||||
// ApplicationContext context = SpringBeanUtil.getApplicationContext();
|
|
||||||
// DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class);
|
|
||||||
// GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class);
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 超时处理
|
|
||||||
// * 如果120秒没有接受客户端的心跳,就触发;
|
|
||||||
// * 如果超过3次,则直接关闭;
|
|
||||||
// */
|
|
||||||
// @Override
|
|
||||||
// public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception {
|
|
||||||
// if (obj instanceof IdleStateEvent) {
|
|
||||||
// IdleStateEvent event = (IdleStateEvent) obj;
|
|
||||||
// if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令
|
|
||||||
// System.out.println("第" + idle_count + "已经10秒没有接收到服务器的信息了,发送第" + num + "条数据");
|
|
||||||
// if (deviceCodeParamList.get(num) == null) {
|
|
||||||
// System.out.println("关闭这个不活跃的channel");
|
|
||||||
// ctx.channel().close();
|
|
||||||
// } else {
|
|
||||||
// if ((num > size - 1) || (idle_count > 3)) {
|
|
||||||
// System.out.println("关闭这个不活跃的channel");
|
|
||||||
// ctx.channel().close();
|
|
||||||
// }
|
|
||||||
// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
// String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num));
|
|
||||||
// ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr));
|
|
||||||
// idle_count++;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// super.userEventTriggered(ctx, obj);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
|
|
||||||
// log.info("当前channel从EventLoop取消注册");
|
|
||||||
// ctx.close();
|
|
||||||
// super.channelUnregistered(ctx);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
|
||||||
//// super.exceptionCaught(ctx, cause);
|
|
||||||
// log.info("通信异常!!");
|
|
||||||
//// // 发送采集冷水机组指令
|
|
||||||
//// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
//// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num));
|
|
||||||
//// // 获取采集参数个数
|
|
||||||
//// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
//// // 2.发送数据
|
|
||||||
//// ctx.channel().writeAndFlush(buffer);
|
|
||||||
//// receiveStr = null;
|
|
||||||
// cause.printStackTrace();
|
|
||||||
// ctx.close();
|
|
||||||
//// Channel incoming = ctx.channel();
|
|
||||||
//// if (incoming.isActive()) {
|
|
||||||
//// log.info("SimpleClient: " + incoming.remoteAddress() + "异常");
|
|
||||||
//// cause.printStackTrace();
|
|
||||||
//// ctx.close();
|
|
||||||
//// receiveStr = null;
|
|
||||||
//// try {
|
|
||||||
//// TimeUnit.SECONDS.sleep(5);
|
|
||||||
//// SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
||||||
//// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":");
|
|
||||||
//// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":");
|
|
||||||
//// NettyClient nettyClient = new NettyClient();
|
|
||||||
//// nettyClient.connect(Integer.parseInt(port), host); // 断线重连
|
|
||||||
//// } catch (InterruptedException e) {
|
|
||||||
//// e.printStackTrace();
|
|
||||||
//// }
|
|
||||||
//// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
|
||||||
// super.channelActive(ctx);
|
|
||||||
// // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
// if (Constant.WEB_FLAG) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
// } else {
|
|
||||||
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
|
|
||||||
// Date date = new Date();
|
|
||||||
// log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!");
|
|
||||||
// // 截取IP地址
|
|
||||||
// String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":");
|
|
||||||
// // 截取端口号
|
|
||||||
// String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", "");
|
|
||||||
// log.info("IP: " + IP + ",端口号: " + port);
|
|
||||||
// // 更新对应的网关在线情况
|
|
||||||
// gatewayManageService.updateGatewayManage(IP, port);
|
|
||||||
// // 生成采集指令
|
|
||||||
// deviceCodeParamList = deviceCodeParamService.queryCodeParam(port);
|
|
||||||
// size = deviceCodeParamList.size();
|
|
||||||
//
|
|
||||||
// // 发送采集冷水机组指令
|
|
||||||
// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
// String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num));
|
|
||||||
// // 获取采集参数个数
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) {
|
|
||||||
// // byte类型的数据
|
|
||||||
//// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8"));
|
|
||||||
//// String sendStr = "5803004900021914"; // 冷量计
|
|
||||||
// // 申请一个数据结构存储信息
|
|
||||||
// ByteBuf buffer = ctx.alloc().buffer();
|
|
||||||
// // 将信息放入数据结构中
|
|
||||||
// buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制
|
|
||||||
// return buffer;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
|
||||||
// Thread.sleep(100);
|
|
||||||
// ctx.close();
|
|
||||||
// log.info(ctx.channel().localAddress() + "退出链接!!");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
|
||||||
// try {
|
|
||||||
// ByteBuf buf = (ByteBuf) msg;
|
|
||||||
// byte[] bytes = new byte[buf.readableBytes()];
|
|
||||||
// buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
// buf.clear();
|
|
||||||
// log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes));
|
|
||||||
// if (bytes.length <= 36) {
|
|
||||||
//// receiveStr = receiveStr.replace("null", "");
|
|
||||||
//// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
//// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
// receiveStr = receiveStr.replace("null", "");
|
|
||||||
// log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
// }
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// } finally {
|
|
||||||
// ReferenceCountUtil.release(msg);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
|
|
||||||
// log.info("冷水机组--数据读取接收完成: " + receiveStr);
|
|
||||||
// if (receiveStr.length() == 30) {
|
|
||||||
// log.info("采集完整的报文: " + receiveStr);
|
|
||||||
// // 解析采集的报文,并保存到数据库
|
|
||||||
// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
|
|
||||||
// analysisReceiveOrder485.analysisChillerOrder485(receiveStr,deviceCodeParamList.get(num));
|
|
||||||
// // 清空receiveStr
|
|
||||||
// receiveStr = "";
|
|
||||||
// // 判断发送的下标,如果不等于指令数组大小
|
|
||||||
// num = num + 1;
|
|
||||||
// if (num > size - 1) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
//// // 继续发送下一个采集冷水机设备指令
|
|
||||||
//// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
//// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num));
|
|
||||||
//// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
//// // 发送数据
|
|
||||||
//// ctx.channel().writeAndFlush(buffer);
|
|
||||||
//// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size);
|
|
||||||
// } else {
|
|
||||||
// // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
// if (Constant.WEB_FLAG) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
// } else {
|
|
||||||
// Thread.sleep(1000);
|
|
||||||
// // 继续发送下一个采集冷水机设备指令
|
|
||||||
// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
// String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num));
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else if (receiveStr.length() == 32) {
|
|
||||||
// log.info("采集完整的报文: " + receiveStr);
|
|
||||||
// // 解析采集的报文,并保存到数据库
|
|
||||||
// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
|
|
||||||
// analysisReceiveOrder485.analysisChillerOrder485(receiveStr,deviceCodeParamList.get(num));
|
|
||||||
// // 清空receiveStr
|
|
||||||
// receiveStr = "";
|
|
||||||
// // 判断发送的下标,如果不等于指令数组大小
|
|
||||||
// num = num + 1;
|
|
||||||
// if (num > size - 1) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
//// // 继续发送下一个采集冷水机设备指令
|
|
||||||
//// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
//// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num));
|
|
||||||
//// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
//// // 发送数据
|
|
||||||
//// ctx.channel().writeAndFlush(buffer);
|
|
||||||
//// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size);
|
|
||||||
// } else {
|
|
||||||
// // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
// if (Constant.WEB_FLAG) {
|
|
||||||
// log.info("有指令下发退出定时采集冷水机组参数");
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
// } else {
|
|
||||||
// Thread.sleep(1000);
|
|
||||||
// // 继续发送下一个采集冷水机设备指令
|
|
||||||
// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
// String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num));
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 2.发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else if (receiveStr.length() > 36) {
|
|
||||||
// // 清空receiveStr
|
|
||||||
// receiveStr = null;
|
|
||||||
// // 判断发送的下标,如果不等于指令数组大小
|
|
||||||
// num = num + 1;
|
|
||||||
// if (num > size - 1) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
//// // 继续发送下一个采集冷水机设备指令
|
|
||||||
//// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
//// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num));
|
|
||||||
//// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
//// // 发送数据
|
|
||||||
//// ctx.channel().writeAndFlush(buffer);
|
|
||||||
//// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size);
|
|
||||||
// } else {
|
|
||||||
// // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
// if (Constant.WEB_FLAG) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// ctx.close();
|
|
||||||
// } else {
|
|
||||||
// Thread.sleep(1000);
|
|
||||||
// // 继续发送下一个采集冷水机设备指令
|
|
||||||
// GetReadOrder485 getReadOrder485 = new GetReadOrder485();
|
|
||||||
// String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num));
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ctx.flush();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//}
|
|
@ -1,98 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import com.mh.user.entity.OrderMessageEntity; |
|
||||||
import io.netty.bootstrap.Bootstrap; |
|
||||||
import io.netty.channel.*; |
|
||||||
import io.netty.channel.nio.NioEventLoopGroup; |
|
||||||
import io.netty.channel.socket.SocketChannel; |
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel; |
|
||||||
import io.netty.handler.timeout.IdleStateHandler; |
|
||||||
import io.netty.handler.timeout.ReadTimeoutHandler; |
|
||||||
import lombok.Getter; |
|
||||||
import lombok.Setter; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
import java.util.concurrent.TimeUnit; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description : 控制冷水机组和其他设备 |
|
||||||
* @updateTime 2020-05-28 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Setter |
|
||||||
@Getter |
|
||||||
@Slf4j |
|
||||||
public class NettyChillerControlClient { |
|
||||||
|
|
||||||
// private int port;
|
|
||||||
// private String host;
|
|
||||||
// private List<OrderMessageEntity> orderMessageEntityList;
|
|
||||||
|
|
||||||
// 构造函数传递值 继承Thread时需要
|
|
||||||
// public NettyChillerControlClient(int port, String host) {
|
|
||||||
// this.port = port;
|
|
||||||
// this.host = host;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public void connect(int port, String host, List<OrderMessageEntity> orderMessageEntityList) throws InterruptedException { |
|
||||||
// 配置客户端NIO线程组
|
|
||||||
EventLoopGroup group = new NioEventLoopGroup(1); |
|
||||||
try { |
|
||||||
Bootstrap bootstrap = new Bootstrap(); |
|
||||||
bootstrap.group(group).channel(NioSocketChannel.class) |
|
||||||
.option(ChannelOption.TCP_NODELAY, true) |
|
||||||
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) |
|
||||||
.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) |
|
||||||
.handler(new ChannelInitializer<SocketChannel>() { |
|
||||||
@Override |
|
||||||
protected void initChannel(SocketChannel socketChannel) { |
|
||||||
// 基于换行符号
|
|
||||||
// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8));
|
|
||||||
// socketChannel.pipeline().addLast(new LengthFieldPrepender(4));
|
|
||||||
// 超过10秒钟没有数据读取自动断开连接
|
|
||||||
// socketChannel.pipeline().addLast(new ReadTimeoutHandler(30));
|
|
||||||
// 超过10秒没有返回触发心跳机制 update by ljf on 2021-01-30
|
|
||||||
socketChannel.pipeline().addLast(new IdleStateHandler(10,10,6, TimeUnit.SECONDS)); |
|
||||||
// 在管道中添加我们自己的接收数据实现方法
|
|
||||||
socketChannel.pipeline().addLast(new NettyChillerControlHandler(orderMessageEntityList)); |
|
||||||
// socketChannel.pipeline().addLast(new NettyMeterClientHandler());
|
|
||||||
} |
|
||||||
}); |
|
||||||
// 发起异步连接操作
|
|
||||||
ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); |
|
||||||
if (channelFuture.isSuccess()) { |
|
||||||
log.info("connect server 成功---------"); |
|
||||||
} else { |
|
||||||
log.info("连接失败!"); |
|
||||||
log.info("准备重连!"); |
|
||||||
// connect(port, host);
|
|
||||||
} |
|
||||||
|
|
||||||
// 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程
|
|
||||||
channelFuture.channel().closeFuture().sync(); |
|
||||||
} catch (Exception e) { |
|
||||||
log.error(e.getMessage()); |
|
||||||
} finally { |
|
||||||
group.shutdownGracefully(); |
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// connect(port, host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// @SneakyThrows
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
// connect(port, host);
|
|
||||||
// }
|
|
||||||
} |
|
@ -1,315 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import com.mh.user.entity.OrderMessageEntity; |
|
||||||
import com.mh.user.service.chillers.GatewayManageService; |
|
||||||
import com.mh.user.service.chillers.OrderMessageService; |
|
||||||
import com.mh.user.utils.AnalysisReceiveOrder485; |
|
||||||
import com.mh.user.constants.Constant; |
|
||||||
import com.mh.user.utils.ExchangeStringUtil; |
|
||||||
import com.mh.user.utils.GetReadOrder485; |
|
||||||
import com.mh.user.utils.SpringBeanUtil; |
|
||||||
import io.netty.buffer.ByteBuf; |
|
||||||
import io.netty.channel.Channel; |
|
||||||
import io.netty.channel.ChannelHandlerAdapter; |
|
||||||
import io.netty.channel.ChannelHandlerContext; |
|
||||||
import io.netty.handler.timeout.IdleState; |
|
||||||
import io.netty.handler.timeout.IdleStateEvent; |
|
||||||
import io.netty.util.ReferenceCountUtil; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.context.ApplicationContext; |
|
||||||
|
|
||||||
import java.text.SimpleDateFormat; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :客户端异步消息处理机制 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
public class NettyChillerControlHandler extends ChannelHandlerAdapter { |
|
||||||
|
|
||||||
private int num = 0; |
|
||||||
private int size = 0; |
|
||||||
private String receiveStr = ""; |
|
||||||
private int sendNum = 0; |
|
||||||
private int idle_count = 1; |
|
||||||
|
|
||||||
List<OrderMessageEntity> orderMessageEntityList; |
|
||||||
|
|
||||||
// 调用service
|
|
||||||
ApplicationContext context = SpringBeanUtil.getApplicationContext(); |
|
||||||
GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class); |
|
||||||
OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); |
|
||||||
|
|
||||||
public NettyChillerControlHandler(List<OrderMessageEntity> orderMessageEntityList) { |
|
||||||
this.orderMessageEntityList = orderMessageEntityList; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("当前channel从EventLoop取消注册"); |
|
||||||
// Constant.SEND_STATUS = false;
|
|
||||||
// super.channelUnregistered(ctx);
|
|
||||||
ctx.close(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 超时处理 |
|
||||||
* 如果120秒没有接受客户端的心跳,就触发; |
|
||||||
* 如果超过3次,则直接关闭; |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { |
|
||||||
if (obj instanceof IdleStateEvent) { |
|
||||||
IdleStateEvent event = (IdleStateEvent) obj; |
|
||||||
if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令
|
|
||||||
System.out.println("第" + idle_count + "已经10秒没有接收到服务器的信息了,发送第" + num + "条数据"); |
|
||||||
if (num > size - 1) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
Constant.SEND_STATUS = true; |
|
||||||
System.out.println("关闭这个不活跃的channel"); |
|
||||||
ctx.close(); |
|
||||||
} else if (idle_count > 3) { |
|
||||||
System.out.println("关闭这个不活跃的channel"); |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
Constant.SEND_STATUS = false; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
// 发送采集DDC指令
|
|
||||||
// 判断空值
|
|
||||||
if (orderMessageEntityList.get(num).getRegisterAddr() == null || |
|
||||||
orderMessageEntityList.get(num).getRegisterAddr().equalsIgnoreCase("")) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
Constant.SEND_STATUS = true; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
String sendStr = orderMessageEntityList.get(num).getOrderStr(); |
|
||||||
// // 获取采集参数个数
|
|
||||||
// size = orderMessageEntityList.size();
|
|
||||||
// 2.发送数据
|
|
||||||
ByteBuf buffer = getByteBuf(ctx, sendStr); |
|
||||||
ctx.channel().writeAndFlush(buffer); |
|
||||||
idle_count++; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} else { |
|
||||||
super.userEventTriggered(ctx, obj); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { |
|
||||||
// super.exceptionCaught(ctx, cause);
|
|
||||||
log.info("通信异常!!"); |
|
||||||
cause.printStackTrace(); |
|
||||||
// receiveStr = null;
|
|
||||||
// Channel incoming = ctx.channel();
|
|
||||||
// if (incoming.isActive()) {
|
|
||||||
// // 重新发送
|
|
||||||
// if (sendNum > 2) {
|
|
||||||
// // 通信异常,发送失败
|
|
||||||
// log.info("SimpleClient: " + incoming.remoteAddress() + "异常");
|
|
||||||
// cause.printStackTrace();
|
|
||||||
// Constant.SEND_STATUS = false;
|
|
||||||
// ctx.close();
|
|
||||||
// } else {
|
|
||||||
// // 发送采集DDC指令
|
|
||||||
// String sendStr = orderMessageEntityList.get(num).getOrderStr();
|
|
||||||
// // 获取采集参数个数
|
|
||||||
// size = orderMessageEntityList.size();
|
|
||||||
// // 2.发送数据
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx,sendStr);
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// sendNum += 1;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// // 判断发送的下标,如果不等于指令数组大小
|
|
||||||
// num = num + 1;
|
|
||||||
// if (num > size-1) {
|
|
||||||
// num = 0;
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// Constant.SEND_STATUS = true;
|
|
||||||
// ctx.close();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelActive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
super.channelActive(ctx); |
|
||||||
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); |
|
||||||
Date date=new Date(); |
|
||||||
log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); |
|
||||||
// 截取IP地址
|
|
||||||
String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress()+"","/", ":"); |
|
||||||
// 截取端口号
|
|
||||||
String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress()+"",":", ""); |
|
||||||
log.info("IP: " + IP + ",端口号: " + port); |
|
||||||
// 更新对应的网关在线情况
|
|
||||||
gatewayManageService.updateGatewayManage(IP, port); |
|
||||||
|
|
||||||
// 发送控制DDC指令
|
|
||||||
String sendStr = orderMessageEntityList.get(num).getOrderStr(); |
|
||||||
// 获取采集参数个数
|
|
||||||
size = orderMessageEntityList.size(); |
|
||||||
|
|
||||||
// 2.发送数据
|
|
||||||
ByteBuf buffer = getByteBuf(ctx,sendStr); |
|
||||||
ctx.channel().writeAndFlush(buffer); |
|
||||||
} |
|
||||||
|
|
||||||
private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { |
|
||||||
// 申请一个数据结构存储信息
|
|
||||||
ByteBuf buffer = ctx.alloc().buffer(); |
|
||||||
// 将信息放入数据结构中
|
|
||||||
buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制
|
|
||||||
return buffer; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
// Thread.sleep(100);
|
|
||||||
ctx.close(); |
|
||||||
log.info(ctx.channel().localAddress() + "退出链接!!"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
|
||||||
// super.channelRead(ctx, msg);
|
|
||||||
// ByteBuf buf = (ByteBuf)msg;
|
|
||||||
// byte[] req = new byte[buf.readableBytes()];
|
|
||||||
// buf.readBytes(req);
|
|
||||||
// String body = new String(req, "UTF-8");
|
|
||||||
try { |
|
||||||
ByteBuf buf = (ByteBuf)msg; |
|
||||||
byte [] bytes = new byte[buf.readableBytes()]; |
|
||||||
buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
buf.clear(); |
|
||||||
log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); |
|
||||||
// if (bytes.length <= 24) {
|
|
||||||
if (bytes.length != 0) { |
|
||||||
// receiveStr = receiveStr.replace("null", "");
|
|
||||||
// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
receiveStr = receiveStr.replace("null", ""); |
|
||||||
log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} finally { |
|
||||||
ReferenceCountUtil.release(msg); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("数据读取接收完成: " + receiveStr); |
|
||||||
if (receiveStr.length() == 24) { |
|
||||||
if (receiveStr.equalsIgnoreCase(orderMessageEntityList.get(num).getOrderStr())) { |
|
||||||
// 解析采集回来的数据
|
|
||||||
log.info("采集完整的报文: " + receiveStr + ",指令下标: " + size); |
|
||||||
// 解析采集的报文
|
|
||||||
// 更新发送后的指令
|
|
||||||
OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); |
|
||||||
orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); |
|
||||||
orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); |
|
||||||
orderMessageEntity.setGrade(1); |
|
||||||
orderMessageEntity.setSendNum(1); |
|
||||||
orderMessageEntity.setStatus(1); |
|
||||||
orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); |
|
||||||
orderMessageService.updateOrderMessage(orderMessageEntity); |
|
||||||
|
|
||||||
// // 关闭连接
|
|
||||||
// receiveStr = null;
|
|
||||||
// Constant.SEND_STATUS = true;
|
|
||||||
// ctx.close();
|
|
||||||
|
|
||||||
// 清空receiveStr
|
|
||||||
receiveStr = ""; |
|
||||||
// 判断发送的下标,如果不等于指令数组大小
|
|
||||||
num = num + 1; |
|
||||||
if (num > size - 1) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
Constant.SEND_STATUS = true; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
Thread.sleep(4000); |
|
||||||
// 继续发送下一个采集DDC设备指令
|
|
||||||
String sendStr = orderMessageEntityList.get(num).getOrderStr(); |
|
||||||
ByteBuf buffer = getByteBuf(ctx, sendStr); |
|
||||||
// 2.发送数据
|
|
||||||
ctx.channel().writeAndFlush(buffer); |
|
||||||
log.info("客户端再次往服务端发送数据" + num + ",报文: " + sendStr); |
|
||||||
} |
|
||||||
} |
|
||||||
} else if ((receiveStr.length() > 24) && (num == 0)) { |
|
||||||
// 发送采集DDC指令
|
|
||||||
String sendStr = orderMessageEntityList.get(num).getOrderStr(); |
|
||||||
// 获取采集参数个数
|
|
||||||
size = orderMessageEntityList.size(); |
|
||||||
// 2.发送数据
|
|
||||||
ByteBuf buffer = getByteBuf(ctx,sendStr); |
|
||||||
ctx.channel().writeAndFlush(buffer); |
|
||||||
// 清空receiveStr
|
|
||||||
receiveStr = ""; |
|
||||||
sendNum += 1; |
|
||||||
} else if (sendNum > 2){ |
|
||||||
// 更新发送后的指令
|
|
||||||
OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); |
|
||||||
orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); |
|
||||||
orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); |
|
||||||
orderMessageEntity.setGrade(1); |
|
||||||
orderMessageEntity.setSendNum(sendNum); |
|
||||||
orderMessageEntity.setStatus(0); |
|
||||||
orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); |
|
||||||
orderMessageService.updateOrderMessage(orderMessageEntity); |
|
||||||
Constant.SEND_STATUS = false; |
|
||||||
ctx.close(); |
|
||||||
} else if ((receiveStr.length() > 24)) { |
|
||||||
// 接收采集DDC的数据
|
|
||||||
// 解析采集的报文
|
|
||||||
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); |
|
||||||
analysisReceiveOrder485.analysisChillersDDC(receiveStr); |
|
||||||
|
|
||||||
// 清空receiveStr
|
|
||||||
receiveStr = ""; |
|
||||||
// 更新发送后的指令
|
|
||||||
OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); |
|
||||||
orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); |
|
||||||
orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); |
|
||||||
orderMessageEntity.setGrade(1); |
|
||||||
orderMessageEntity.setSendNum(1); |
|
||||||
orderMessageEntity.setStatus(1); |
|
||||||
orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); |
|
||||||
orderMessageService.updateOrderMessage(orderMessageEntity); |
|
||||||
|
|
||||||
// 判断发送的下标,如果不等于指令数组大小
|
|
||||||
num = num + 1; |
|
||||||
// Thread.sleep(500);
|
|
||||||
if (num > size-1) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
Constant.SEND_STATUS = true; |
|
||||||
ctx.close(); |
|
||||||
} |
|
||||||
} |
|
||||||
ctx.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,96 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import io.netty.bootstrap.Bootstrap; |
|
||||||
import io.netty.channel.*; |
|
||||||
import io.netty.channel.nio.NioEventLoopGroup; |
|
||||||
import io.netty.channel.socket.SocketChannel; |
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel; |
|
||||||
import io.netty.handler.timeout.IdleStateHandler; |
|
||||||
import io.netty.handler.timeout.ReadTimeoutHandler; |
|
||||||
import lombok.Getter; |
|
||||||
import lombok.Setter; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :Netty客户端,采集DDC设备数据 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
@Setter |
|
||||||
@Getter |
|
||||||
public class NettyChillerDDCClient { |
|
||||||
|
|
||||||
private volatile static NettyChillerDDCClient nettyChillerDDCClient = new NettyChillerDDCClient(); |
|
||||||
|
|
||||||
private int port; |
|
||||||
private String host; |
|
||||||
|
|
||||||
// 构造函数传递值 继承Thread时需要
|
|
||||||
// public NettyClient(int port, String host) {
|
|
||||||
// this.port = port;
|
|
||||||
// this.host = host;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public static void connect(int port, String host) throws InterruptedException { |
|
||||||
// 配置客户端NIO线程组
|
|
||||||
EventLoopGroup group = new NioEventLoopGroup(1); |
|
||||||
try { |
|
||||||
Bootstrap bootstrap = new Bootstrap(); |
|
||||||
bootstrap.group(group).channel(NioSocketChannel.class) |
|
||||||
.option(ChannelOption.TCP_NODELAY, true) |
|
||||||
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) |
|
||||||
.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) |
|
||||||
.handler(new ChannelInitializer<SocketChannel>() { |
|
||||||
@Override |
|
||||||
protected void initChannel(SocketChannel socketChannel) { |
|
||||||
// 基于换行符号
|
|
||||||
// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8));
|
|
||||||
// socketChannel.pipeline().addLast(new LengthFieldPrepender(4));
|
|
||||||
// 超过10秒钟没有数据读取自动断开连接
|
|
||||||
// socketChannel.pipeline().addLast(new ReadTimeoutHandler(40));
|
|
||||||
socketChannel.pipeline().addLast(new IdleStateHandler(20,20,20, TimeUnit.SECONDS)); |
|
||||||
// 在管道中添加我们自己的接收数据实现方法
|
|
||||||
socketChannel.pipeline().addLast(new NettyChillerDDCClientHandler()); |
|
||||||
// socketChannel.pipeline().addLast(new NettyMeterClientHandler());
|
|
||||||
} |
|
||||||
}); |
|
||||||
// 发起异步连接操作
|
|
||||||
ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); |
|
||||||
if (channelFuture.isSuccess()) { |
|
||||||
log.info("connect server 成功---------"); |
|
||||||
} else { |
|
||||||
log.info("连接失败!"); |
|
||||||
log.info("准备重连!"); |
|
||||||
// connect(port, host);
|
|
||||||
} |
|
||||||
|
|
||||||
// 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程
|
|
||||||
channelFuture.channel().closeFuture().sync(); |
|
||||||
} catch (Exception e) { |
|
||||||
log.error(e.getMessage()); |
|
||||||
} finally { |
|
||||||
group.shutdownGracefully(); |
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// connect(port, host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// @SneakyThrows
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
// connect(port, host);
|
|
||||||
// }
|
|
||||||
} |
|
@ -1,297 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import com.mh.user.constants.Constant; |
|
||||||
import com.mh.user.entity.ChillersEntity; |
|
||||||
import com.mh.user.service.chillers.ChillersService; |
|
||||||
import com.mh.user.service.chillers.GatewayManageService; |
|
||||||
import com.mh.user.utils.AnalysisReceiveOrder485; |
|
||||||
import com.mh.user.utils.ExchangeStringUtil; |
|
||||||
import com.mh.user.utils.GetReadOrder485; |
|
||||||
import com.mh.user.utils.SpringBeanUtil; |
|
||||||
import io.netty.buffer.ByteBuf; |
|
||||||
import io.netty.channel.Channel; |
|
||||||
import io.netty.channel.ChannelHandlerAdapter; |
|
||||||
import io.netty.channel.ChannelHandlerContext; |
|
||||||
import io.netty.handler.timeout.IdleState; |
|
||||||
import io.netty.handler.timeout.IdleStateEvent; |
|
||||||
import io.netty.util.ReferenceCountUtil; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
import org.springframework.context.ApplicationContext; |
|
||||||
|
|
||||||
import java.text.SimpleDateFormat; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :客户端异步消息处理机制 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
public class NettyChillerDDCClientHandler extends ChannelHandlerAdapter { |
|
||||||
|
|
||||||
private int num = 0; |
|
||||||
private int size = 0; |
|
||||||
private int collectionSize = 0; |
|
||||||
private String receiveStr = null; |
|
||||||
private int idle_count = 0; |
|
||||||
List<ChillersEntity> chillersEntityList; |
|
||||||
List<ChillersEntity> chillersEntityList1; |
|
||||||
|
|
||||||
// 调用service
|
|
||||||
ApplicationContext context = SpringBeanUtil.getApplicationContext(); |
|
||||||
ChillersService chillersService = context.getBean(ChillersService.class); |
|
||||||
GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class); |
|
||||||
|
|
||||||
/** |
|
||||||
* 超时处理 |
|
||||||
* 如果120秒没有接受客户端的心跳,就触发; |
|
||||||
* 如果超过3次,则直接关闭; |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { |
|
||||||
if (obj instanceof IdleStateEvent) { |
|
||||||
IdleStateEvent event = (IdleStateEvent) obj; |
|
||||||
if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令
|
|
||||||
System.out.println("第" + idle_count + "已经20秒没有接收到服务器的信息了,发送的第" + num + "条数据"); |
|
||||||
if (chillersEntityList.get(num) == null) { |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
String sendStr = GetReadOrder485.createDDCOrder(chillersEntityList.get(num)); |
|
||||||
ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr)); |
|
||||||
if ((num > size - 1) || (idle_count > 3)) { |
|
||||||
//System.out.println("关闭这个不活跃的channel");
|
|
||||||
//ctx.close();
|
|
||||||
//继续发送下一个ddc采集指令
|
|
||||||
log.info("当前DDC无返回数据超过三次,DDC为:"+chillersEntityList.get(num).getDdcAddr()); |
|
||||||
if (num >= size - 1){ |
|
||||||
log.info("结束DDC采集,当前DDC=====>>>"+chillersEntityList.get(num).getDdcAddr()); |
|
||||||
ctx.close(); |
|
||||||
}else { |
|
||||||
//下发下一个ddc指令之前清除前面的数据
|
|
||||||
receiveStr = null; |
|
||||||
//String sendStr1 = GetReadOrder485.createDDCOrder(chillersEntityList.get(++num));
|
|
||||||
//ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr1));
|
|
||||||
num++; |
|
||||||
sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num); |
|
||||||
} |
|
||||||
idle_count = 0; |
|
||||||
} |
|
||||||
idle_count++; |
|
||||||
} |
|
||||||
} |
|
||||||
} else { |
|
||||||
super.userEventTriggered(ctx, obj); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("当前channel从EventLoop取消注册"); |
|
||||||
super.channelUnregistered(ctx); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { |
|
||||||
// super.exceptionCaught(ctx, cause);
|
|
||||||
log.info("通信异常!!"); |
|
||||||
receiveStr = null; |
|
||||||
cause.printStackTrace(); |
|
||||||
ctx.close(); |
|
||||||
// Channel incoming = ctx.channel();
|
|
||||||
// if (incoming.isActive()) {
|
|
||||||
// log.info("SimpleClient: " + incoming.remoteAddress() + "异常");
|
|
||||||
// cause.printStackTrace();
|
|
||||||
// ctx.close();
|
|
||||||
// receiveStr = null;
|
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
||||||
// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":");
|
|
||||||
// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":");
|
|
||||||
// NettyClient nettyClient = new NettyClient();
|
|
||||||
// nettyClient.connect(Integer.parseInt(port), host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelActive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
super.channelActive(ctx); |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.CONTROL_WEB_FLAG) { |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); |
|
||||||
Date date = new Date(); |
|
||||||
log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); |
|
||||||
// 截取IP地址
|
|
||||||
String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); |
|
||||||
// 截取端口号
|
|
||||||
String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); |
|
||||||
log.info("IP: " + IP + ",端口号: " + port); |
|
||||||
// 更新对应的网关在线情况
|
|
||||||
gatewayManageService.updateGatewayManage(IP, port); |
|
||||||
// 生成采集指令
|
|
||||||
chillersEntityList = chillersService.queryChillersDDC(2); |
|
||||||
size = chillersEntityList.size(); |
|
||||||
|
|
||||||
// 发送采集DDC指令
|
|
||||||
String sendStr = GetReadOrder485.createDDCOrder(chillersEntityList.get(num)); |
|
||||||
// 获取采集参数个数,grade=2,代表采集DDC设备所对应的参数
|
|
||||||
chillersEntityList1 = chillersService.queryChillersByOther(2, chillersEntityList.get(num).getDdcAddr()); |
|
||||||
StringBuffer getStr = new StringBuffer(); |
|
||||||
for (int i = 0; i < chillersEntityList1.size(); i++) { |
|
||||||
getStr.append(chillersEntityList1.get(i).getRegisterAddress()); |
|
||||||
// getStr = getStr + chillersEntityList1.get(i).getRegisterAddress();
|
|
||||||
} |
|
||||||
collectionSize = getStr.length() / 2; |
|
||||||
log.info("发送的数据: " + sendStr + ",报文大小: " + collectionSize); |
|
||||||
ByteBuf buffer = getByteBuf(ctx, sendStr); |
|
||||||
// 2.发送数据
|
|
||||||
ctx.channel().writeAndFlush(buffer); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { |
|
||||||
// byte类型的数据
|
|
||||||
// 申请一个数据结构存储信息
|
|
||||||
ByteBuf buffer = ctx.alloc().buffer(); |
|
||||||
// 将信息放入数据结构中
|
|
||||||
buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制
|
|
||||||
return buffer; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
Thread.sleep(100); |
|
||||||
ctx.close(); |
|
||||||
log.info(ctx.channel().localAddress() + "退出链接!!"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
|
||||||
try { |
|
||||||
ByteBuf buf = (ByteBuf) msg; |
|
||||||
byte[] bytes = new byte[buf.readableBytes()]; |
|
||||||
buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
buf.clear(); |
|
||||||
log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); |
|
||||||
if (bytes.length <= (11 + collectionSize * 3) * 2) { |
|
||||||
// if (bytes.length <= 142) {
|
|
||||||
// receiveStr = receiveStr.replace("null", "");
|
|
||||||
// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
receiveStr = receiveStr.replace("null", ""); |
|
||||||
log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} finally { |
|
||||||
ReferenceCountUtil.release(msg); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("接收的数据: " + receiveStr + ",报文大小: " + collectionSize); |
|
||||||
if (receiveStr.length() == (11 + 3 * collectionSize) * 2) { |
|
||||||
// if (receiveStr.length() == 142) {
|
|
||||||
// 解析采集回来的数据
|
|
||||||
log.info("采集完整的报文: " + receiveStr); |
|
||||||
|
|
||||||
if (!Constant.CONTROL_WEB_FLAG) { |
|
||||||
// 解析采集的报文
|
|
||||||
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); |
|
||||||
analysisReceiveOrder485.analysisChillersDDC(receiveStr); |
|
||||||
} |
|
||||||
// 清空receiveStr
|
|
||||||
receiveStr = ""; |
|
||||||
// 判断发送的下标,如果不等于指令数组大小
|
|
||||||
num = num + 1; |
|
||||||
if (num > size - 1) { |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
// // 设置长连接,封装发送 update by ljf on 2021-01-26
|
|
||||||
// sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num);
|
|
||||||
} else { |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.CONTROL_WEB_FLAG) { |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
// 设置长连接,封装发送 update by ljf on 2021-01-26
|
|
||||||
sendDDCOrder(chillersEntityList, chillersEntityList.get(num), ctx, num); |
|
||||||
} |
|
||||||
} |
|
||||||
} else if (receiveStr.length() == 20) { |
|
||||||
// if (receiveStr.length() == 142) {
|
|
||||||
// 解析采集回来的数据
|
|
||||||
log.info("采集完整的报文: " + receiveStr); |
|
||||||
// 清空receiveStr
|
|
||||||
receiveStr = ""; |
|
||||||
// 判断发送的下标,如果不等于指令数组大小
|
|
||||||
num = num + 1; |
|
||||||
if (num > size - 1) { |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
// // 设置长连接,封装发送 update by ljf on 2021-01-26
|
|
||||||
// sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num);
|
|
||||||
} else { |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.CONTROL_WEB_FLAG) { |
|
||||||
log.info("有指令下发退出定时采集DDC参数"); |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
// 封装发送
|
|
||||||
sendDDCOrder(chillersEntityList, chillersEntityList.get(num), ctx, num); |
|
||||||
} |
|
||||||
} |
|
||||||
}else if (receiveStr.length() > (11 + 3 * collectionSize) * 2){ |
|
||||||
log.info("当前DDC: "+chillersEntityList.get(num).getDdcAddr()+"长度为: "+receiveStr.length()); |
|
||||||
receiveStr = null; |
|
||||||
//继续后面的DDC采集
|
|
||||||
//String sendStr1 = GetReadOrder485.createDDCOrder(chillersEntityList.get(++num));
|
|
||||||
//ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr1));
|
|
||||||
num++; |
|
||||||
sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num); |
|
||||||
} |
|
||||||
ctx.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
public void sendDDCOrder(List<ChillersEntity> chillersEntityList, |
|
||||||
ChillersEntity chillersEntity, |
|
||||||
ChannelHandlerContext ctx, |
|
||||||
int num) throws InterruptedException { |
|
||||||
Thread.sleep(800); |
|
||||||
// 继续发送下一个采集DDC设备指令
|
|
||||||
String sendStr = GetReadOrder485.createDDCOrder(chillersEntity); |
|
||||||
// 获取采集参数个数,grade=2,代表采集DDC设备所对应的参数
|
|
||||||
chillersEntityList1 = chillersService.queryChillersByOther(2, chillersEntityList.get(num).getDdcAddr()); |
|
||||||
StringBuilder getStr = new StringBuilder(); |
|
||||||
for (ChillersEntity entity : chillersEntityList1) { |
|
||||||
getStr.append(entity.getRegisterAddress()); |
|
||||||
} |
|
||||||
collectionSize = getStr.length() / 2; |
|
||||||
log.info("发送的数据: " + sendStr + ",报文大小: " + collectionSize); |
|
||||||
log.info("客户端再次往服务端发送数据 " + num + "," + sendStr); |
|
||||||
ByteBuf buffer = getByteBuf(ctx, sendStr); |
|
||||||
// 2.发送数据
|
|
||||||
ctx.channel().writeAndFlush(buffer); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,90 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import io.netty.bootstrap.Bootstrap; |
|
||||||
import io.netty.channel.*; |
|
||||||
import io.netty.channel.nio.NioEventLoopGroup; |
|
||||||
import io.netty.channel.socket.SocketChannel; |
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel; |
|
||||||
import io.netty.handler.timeout.ReadTimeoutHandler; |
|
||||||
import lombok.Getter; |
|
||||||
import lombok.Setter; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :Netty客户端,采集冷量计 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
@Setter |
|
||||||
@Getter |
|
||||||
public class NettyClient { |
|
||||||
|
|
||||||
private int port; |
|
||||||
private String host; |
|
||||||
|
|
||||||
// 构造函数传递值 继承Thread时需要
|
|
||||||
// public NettyClient(int port, String host) {
|
|
||||||
// this.port = port;
|
|
||||||
// this.host = host;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public void connect(int port, String host) throws InterruptedException { |
|
||||||
// 配置客户端NIO线程组
|
|
||||||
EventLoopGroup group = new NioEventLoopGroup(1); |
|
||||||
try { |
|
||||||
Bootstrap bootstrap = new Bootstrap(); |
|
||||||
bootstrap.group(group).channel(NioSocketChannel.class) |
|
||||||
.option(ChannelOption.TCP_NODELAY, true) |
|
||||||
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) |
|
||||||
.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) |
|
||||||
.handler(new ChannelInitializer<SocketChannel>() { |
|
||||||
@Override |
|
||||||
protected void initChannel(SocketChannel socketChannel) { |
|
||||||
// 基于换行符号
|
|
||||||
// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8));
|
|
||||||
// socketChannel.pipeline().addLast(new LengthFieldPrepender(4));
|
|
||||||
// 超过10秒钟没有数据读取自动断开连接
|
|
||||||
socketChannel.pipeline().addLast(new ReadTimeoutHandler(10)); |
|
||||||
// 在管道中添加我们自己的接收数据实现方法
|
|
||||||
socketChannel.pipeline().addLast(new NettyClientHandler()); |
|
||||||
// socketChannel.pipeline().addLast(new NettyMeterClientHandler());
|
|
||||||
} |
|
||||||
}); |
|
||||||
// 发起异步连接操作
|
|
||||||
ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); |
|
||||||
if (channelFuture.isSuccess()) { |
|
||||||
log.info("connect server 成功---------"); |
|
||||||
} else { |
|
||||||
log.info("连接失败!"); |
|
||||||
log.info("准备重连!"); |
|
||||||
// connect(port, host);
|
|
||||||
} |
|
||||||
|
|
||||||
// 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程
|
|
||||||
channelFuture.channel().closeFuture().sync(); |
|
||||||
} catch (Exception e) { |
|
||||||
log.error(e.getMessage()); |
|
||||||
} finally { |
|
||||||
group.shutdownGracefully(); |
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// connect(port, host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// @SneakyThrows
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
// connect(port, host);
|
|
||||||
// }
|
|
||||||
} |
|
@ -1,190 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import com.mh.user.constants.Constant; |
|
||||||
import com.mh.user.entity.DeviceCodeParamEntity; |
|
||||||
import com.mh.user.entity.DeviceManageEntity; |
|
||||||
import com.mh.user.service.DeviceCodeParamService; |
|
||||||
import com.mh.user.service.chillers.DeviceManageService; |
|
||||||
import com.mh.user.utils.*; |
|
||||||
import io.netty.buffer.ByteBuf; |
|
||||||
import io.netty.channel.Channel; |
|
||||||
import io.netty.channel.ChannelHandlerAdapter; |
|
||||||
import io.netty.channel.ChannelHandlerContext; |
|
||||||
import io.netty.util.ReferenceCountUtil; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.context.ApplicationContext; |
|
||||||
|
|
||||||
import java.text.SimpleDateFormat; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :客户端异步消息处理机制 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
public class NettyClientHandler extends ChannelHandlerAdapter { |
|
||||||
|
|
||||||
private int num = 0; |
|
||||||
private int size = 0; |
|
||||||
private String receiveStr = null; |
|
||||||
private String IP = null; |
|
||||||
private String port = null; |
|
||||||
List<DeviceCodeParamEntity> deviceManageEntityList; |
|
||||||
|
|
||||||
// 调用service
|
|
||||||
ApplicationContext context = SpringBeanUtil.getApplicationContext(); |
|
||||||
DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("当前channel从EventLoop取消注册"); |
|
||||||
super.channelUnregistered(ctx); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { |
|
||||||
// super.exceptionCaught(ctx, cause);
|
|
||||||
log.info("通信异常!!"); |
|
||||||
receiveStr = null; |
|
||||||
Channel incoming = ctx.channel(); |
|
||||||
if (incoming.isActive()){ |
|
||||||
log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); |
|
||||||
cause.printStackTrace(); |
|
||||||
ctx.close(); |
|
||||||
// receiveStr = null;
|
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
||||||
// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":");
|
|
||||||
// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":");
|
|
||||||
// NettyClient nettyClient = new NettyClient();
|
|
||||||
// nettyClient.connect(Integer.parseInt(port), host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelActive(ChannelHandlerContext ctx) { |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.WEB_FLAG) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
ctx.channel().read(); |
|
||||||
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); |
|
||||||
Date date = new Date(); |
|
||||||
log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); |
|
||||||
// 截取IP地址
|
|
||||||
IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); |
|
||||||
// 截取端口号
|
|
||||||
port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); |
|
||||||
log.info("IP: " + IP + ",端口号: " + port); |
|
||||||
// 生成对应采集冷量计的命令
|
|
||||||
deviceManageEntityList = deviceCodeParamService.queryCodeParam(port); |
|
||||||
size = deviceManageEntityList.size(); |
|
||||||
|
|
||||||
// 封装工具类进行采集,update by ljf on 2021-01-26
|
|
||||||
SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(0),ctx,num,size); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { |
|
||||||
// byte类型的数据
|
|
||||||
// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8"));
|
|
||||||
// String sendStr = "5803004900021914"; // 冷量计
|
|
||||||
// 申请一个数据结构存储信息
|
|
||||||
ByteBuf buffer = ctx.alloc().buffer(); |
|
||||||
// 将信息放入数据结构中
|
|
||||||
buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制
|
|
||||||
return buffer; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
Thread.sleep(100); |
|
||||||
ctx.close(); |
|
||||||
log.info(ctx.channel().localAddress() + "退出链接!!"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
|
||||||
try { |
|
||||||
ByteBuf buf = (ByteBuf)msg; |
|
||||||
byte [] bytes = new byte[buf.readableBytes()]; |
|
||||||
buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
buf.clear(); |
|
||||||
log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); |
|
||||||
if (bytes.length <= 36) { |
|
||||||
// receiveStr = receiveStr.replace("null", "");
|
|
||||||
// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
receiveStr = receiveStr.replace("null", ""); |
|
||||||
log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} finally { |
|
||||||
ReferenceCountUtil.release(msg); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("采集冷量计-数据读取接收完成: " + receiveStr); |
|
||||||
// A9 FE C2 C7 1F 90 01 58 03 04 4A 30 00 53 65 1C C4 06
|
|
||||||
if (receiveStr.length() == 36) { |
|
||||||
// 接收到的报文
|
|
||||||
log.info("接收完整报文: " + receiveStr); |
|
||||||
// 解析报文
|
|
||||||
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); |
|
||||||
analysisReceiveOrder485.analysisCloudOrder485(receiveStr,deviceManageEntityList.get(num)); // 解析冷量计
|
|
||||||
receiveStr = ""; |
|
||||||
// 1.创建将要写出的数据
|
|
||||||
// String sendStr = "5803004900021914";
|
|
||||||
num = num + 1; |
|
||||||
Thread.sleep(500); |
|
||||||
if (num > size-1) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
// 保持长连接
|
|
||||||
// // 封装工具类进行采集,update by ljf on 2021-01-26
|
|
||||||
// SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(num),num,IP,port,ctx);
|
|
||||||
} else { |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.WEB_FLAG) { |
|
||||||
log.info("有指令下发退出定时采集参数"); |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
// 封装工具类进行采集,update by ljf on 2021-01-26
|
|
||||||
SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(num),ctx,num,size); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} else { |
|
||||||
log.info(receiveStr); |
|
||||||
receiveStr = null; |
|
||||||
ctx.flush(); |
|
||||||
ctx.close(); |
|
||||||
} |
|
||||||
|
|
||||||
ctx.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,180 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import com.mh.user.utils.ExchangeStringUtil; |
|
||||||
import io.netty.bootstrap.ServerBootstrap; |
|
||||||
import io.netty.buffer.ByteBuf; |
|
||||||
import io.netty.buffer.Unpooled; |
|
||||||
import io.netty.channel.*; |
|
||||||
import io.netty.channel.nio.NioEventLoopGroup; |
|
||||||
import io.netty.channel.socket.SocketChannel; |
|
||||||
import io.netty.channel.socket.nio.NioServerSocketChannel; |
|
||||||
import io.netty.handler.logging.LogLevel; |
|
||||||
import io.netty.handler.logging.LoggingHandler; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.util.StringUtils; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.net.InetSocketAddress; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title :Netty |
|
||||||
* @description :netty 使用 |
|
||||||
* @updateTime 2020-04-21 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
public class NettyEchoServer { |
|
||||||
|
|
||||||
public void bind(int port) throws Exception { |
|
||||||
// accept线程组,用来接收连接
|
|
||||||
EventLoopGroup bossGroup = new NioEventLoopGroup(1); |
|
||||||
// IO 线程组,用来处理业务逻辑
|
|
||||||
EventLoopGroup workerGroup = new NioEventLoopGroup(1); |
|
||||||
|
|
||||||
try { |
|
||||||
// 服务端启动引导
|
|
||||||
ServerBootstrap serverBootstrap = new ServerBootstrap(); |
|
||||||
serverBootstrap.group(bossGroup,workerGroup) // 绑定两个线程
|
|
||||||
.channel(NioServerSocketChannel.class) // 指定通道类型
|
|
||||||
.option(ChannelOption.SO_BACKLOG, 1024) // 设置TCP连接的缓冲区
|
|
||||||
.handler(new LoggingHandler(LogLevel.INFO)) // 设置日志级别
|
|
||||||
.childHandler(new ChannelInitializer<SocketChannel>() { |
|
||||||
@Override |
|
||||||
protected void initChannel(SocketChannel socketChannel) throws Exception { |
|
||||||
ChannelPipeline pipeline = socketChannel.pipeline(); // 获取处理器链
|
|
||||||
pipeline.addLast(new EchoServerHandler()); // 添加新的事件处理器
|
|
||||||
} |
|
||||||
}); |
|
||||||
// 通过bind启动服务
|
|
||||||
ChannelFuture f = serverBootstrap.bind(port).sync(); |
|
||||||
// 阻塞主线程,知道网络服务被关闭
|
|
||||||
f.channel().closeFuture().sync(); |
|
||||||
} catch (Exception e){ |
|
||||||
e.printStackTrace(); |
|
||||||
} finally { |
|
||||||
workerGroup.shutdownGracefully(); |
|
||||||
bossGroup.shutdownGracefully(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
static class EchoServerHandler extends ChannelHandlerAdapter { |
|
||||||
|
|
||||||
// 每当从客户端收到新的数据时,这个方法会在收到消息时被调用
|
|
||||||
@Override |
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
|
||||||
try { |
|
||||||
ByteBuf buf = (ByteBuf)msg; |
|
||||||
byte [] bytes = new byte[buf.readableBytes()]; |
|
||||||
buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
String receiveStr = ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
log.info("接收到的数据: "+ receiveStr); |
|
||||||
|
|
||||||
//返回16进制到客户端
|
|
||||||
writeToClient(receiveStr,ctx,"测试"); |
|
||||||
} catch (Exception e) { |
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace(); |
|
||||||
} |
|
||||||
// ctx.write(Unpooled.wrappedBuffer("Server message".getBytes()));
|
|
||||||
// ctx.fireChannelRead(msg);
|
|
||||||
} |
|
||||||
|
|
||||||
// 数据读取完后被调用
|
|
||||||
@Override |
|
||||||
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { |
|
||||||
ctx.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
// 当Netty由于IO错误或者处理器在处理事件时抛出的异常时被调用
|
|
||||||
@Override |
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { |
|
||||||
cause.printStackTrace(); |
|
||||||
ctx.close(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 客户端与服务端第一次建立连接时 执行 |
|
||||||
* |
|
||||||
* @param ctx |
|
||||||
* @throws Exception |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void channelActive(ChannelHandlerContext ctx) throws Exception, IOException |
|
||||||
{ |
|
||||||
super.channelActive(ctx); |
|
||||||
ctx.channel().read(); |
|
||||||
InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); |
|
||||||
String clientIp = ifsock.getAddress().getHostAddress(); |
|
||||||
//此处不能使用ctx.close(),否则客户端始终无法与服务端建立连接
|
|
||||||
log.info("channelActive: "+clientIp + ctx.name()); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 客户端与服务端 断连时 执行 |
|
||||||
* |
|
||||||
* @param ctx |
|
||||||
* @throws Exception |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception, IOException |
|
||||||
{ |
|
||||||
super.channelInactive(ctx); |
|
||||||
InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); |
|
||||||
String clientIp = ifsock.getAddress().getHostAddress(); |
|
||||||
ctx.close(); //断开连接时,必须关闭,否则造成资源浪费,并发量很大情况下可能造成宕机
|
|
||||||
System.out.println("channelInactive:"+clientIp); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 服务端当read超时, 会调用这个方法 |
|
||||||
* |
|
||||||
* @param ctx |
|
||||||
* @param evt |
|
||||||
* @throws Exception |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception, IOException |
|
||||||
{ |
|
||||||
super.userEventTriggered(ctx, evt); |
|
||||||
InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); |
|
||||||
String clientIp = ifsock.getAddress().getHostAddress(); |
|
||||||
ctx.close();//超时时断开连接
|
|
||||||
System.out.println("userEventTriggered:"+clientIp); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 公用回写数据到客户端的方法 |
|
||||||
* @param channel |
|
||||||
* @param mark 用于打印/log的输出 |
|
||||||
* <br>//channel.writeAndFlush(msg);//不行
|
|
||||||
* <br>//channel.writeAndFlush(receiveStr.getBytes());//不行
|
|
||||||
* <br>在netty里,进出的都是ByteBuf,楼主应确定服务端是否有对应的编码器,将字符串转化为ByteBuf |
|
||||||
*/ |
|
||||||
private void writeToClient(final String receiveStr, ChannelHandlerContext channel, final String mark) { |
|
||||||
try { |
|
||||||
ByteBuf buff = Unpooled.buffer();//netty需要用ByteBuf传输
|
|
||||||
buff.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(receiveStr));//对接需要16进制
|
|
||||||
channel.writeAndFlush(buff).addListener((ChannelFutureListener) future -> { |
|
||||||
StringBuilder sb = new StringBuilder(""); |
|
||||||
if(!StringUtils.isEmpty(mark)){ |
|
||||||
sb.append("【").append(mark).append("】"); |
|
||||||
} |
|
||||||
if (future.isSuccess()) { |
|
||||||
System.out.println(sb.toString()+"回写成功"+receiveStr); |
|
||||||
log.info(sb.toString()+"回写成功"+receiveStr); |
|
||||||
} else { |
|
||||||
System.out.println(sb.toString()+"回写失败"+receiveStr); |
|
||||||
log.error(sb.toString()+"回写失败"+receiveStr); |
|
||||||
} |
|
||||||
}); |
|
||||||
} catch (Exception e) { |
|
||||||
e.printStackTrace(); |
|
||||||
System.out.println("调用通用writeToClient()异常"+e.getMessage()); |
|
||||||
log.error("调用通用writeToClient()异常:",e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,95 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import io.netty.bootstrap.Bootstrap; |
|
||||||
import io.netty.channel.*; |
|
||||||
import io.netty.channel.nio.NioEventLoopGroup; |
|
||||||
import io.netty.channel.socket.SocketChannel; |
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel; |
|
||||||
import io.netty.handler.timeout.ReadTimeoutHandler; |
|
||||||
import lombok.Getter; |
|
||||||
import lombok.Setter; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :Netty客户端,采集电表 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
@Setter |
|
||||||
@Getter |
|
||||||
public class NettyMeterClient { |
|
||||||
// implements Runnable {
|
|
||||||
|
|
||||||
private int port; |
|
||||||
private String host; |
|
||||||
|
|
||||||
// 构造函数传递值 继承Thread时需要
|
|
||||||
public NettyMeterClient(int port, String host) { |
|
||||||
this.port = port; |
|
||||||
this.host = host; |
|
||||||
} |
|
||||||
|
|
||||||
public NettyMeterClient() { |
|
||||||
super(); |
|
||||||
} |
|
||||||
|
|
||||||
public void connect(int port, String host) throws InterruptedException { |
|
||||||
// 配置客户端NIO线程组
|
|
||||||
// 配置客户端NIO线程组
|
|
||||||
EventLoopGroup group = new NioEventLoopGroup(1); |
|
||||||
try { |
|
||||||
Bootstrap bootstrap = new Bootstrap(); |
|
||||||
bootstrap.group(group).channel(NioSocketChannel.class) |
|
||||||
.option(ChannelOption.TCP_NODELAY, true) |
|
||||||
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) |
|
||||||
.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) |
|
||||||
.handler(new ChannelInitializer<SocketChannel>() { |
|
||||||
@Override |
|
||||||
protected void initChannel(SocketChannel socketChannel) { |
|
||||||
// 基于换行符号
|
|
||||||
// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
|
|
||||||
// // 解码转String,注意调整自己的编码格式GBK、UTF-8
|
|
||||||
// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8));
|
|
||||||
// 超过10秒钟没有数据读取自动断开连接
|
|
||||||
socketChannel.pipeline().addLast(new ReadTimeoutHandler(20)); |
|
||||||
// 在管道中添加我们自己的接收数据实现方法
|
|
||||||
// socketChannel.pipeline().addLast(new NettyClientHandler());
|
|
||||||
socketChannel.pipeline().addLast(new NettyMeterClientHandler()); |
|
||||||
} |
|
||||||
}); |
|
||||||
// 发起异步连接操作
|
|
||||||
ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); |
|
||||||
if (channelFuture.isSuccess()) { |
|
||||||
log.info("connect server 成功---------"); |
|
||||||
} else { |
|
||||||
log.info("连接失败!"); |
|
||||||
log.info("准备重连!"); |
|
||||||
// connect(port, host);
|
|
||||||
} |
|
||||||
|
|
||||||
// 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程
|
|
||||||
channelFuture.channel().closeFuture().sync(); |
|
||||||
} catch (Exception e) { |
|
||||||
log.error(e.getMessage()); |
|
||||||
} finally { |
|
||||||
group.shutdownGracefully(); |
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// connect(port, host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
} |
|
||||||
//
|
|
||||||
// @SneakyThrows
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
// connect(port, host);
|
|
||||||
// }
|
|
||||||
} |
|
@ -1,261 +0,0 @@ |
|||||||
package com.mh.user.netty; |
|
||||||
|
|
||||||
import com.mh.user.constants.Constant; |
|
||||||
import com.mh.user.entity.DeviceCodeParamEntity; |
|
||||||
import com.mh.user.entity.DeviceManageEntity; |
|
||||||
import com.mh.user.service.DeviceCodeParamService; |
|
||||||
import com.mh.user.service.chillers.DeviceManageService; |
|
||||||
import com.mh.user.utils.*; |
|
||||||
import io.netty.buffer.ByteBuf; |
|
||||||
import io.netty.channel.Channel; |
|
||||||
import io.netty.channel.ChannelHandlerAdapter; |
|
||||||
import io.netty.channel.ChannelHandlerContext; |
|
||||||
import io.netty.util.ReferenceCountUtil; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.context.ApplicationContext; |
|
||||||
|
|
||||||
import java.text.SimpleDateFormat; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author ljf |
|
||||||
* @title : |
|
||||||
* @description :客户端异步消息处理机制 |
|
||||||
* @updateTime 2020-05-13 |
|
||||||
* @throws : |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
public class NettyMeterClientHandler extends ChannelHandlerAdapter { |
|
||||||
|
|
||||||
|
|
||||||
private int num = 0; |
|
||||||
private int size = 0; |
|
||||||
private String receiveStr = null; |
|
||||||
private String IP = ""; |
|
||||||
private String port = ""; |
|
||||||
List<DeviceCodeParamEntity> deviceManageEntityList; |
|
||||||
|
|
||||||
// 调用service
|
|
||||||
ApplicationContext context = SpringBeanUtil.getApplicationContext(); |
|
||||||
DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); |
|
||||||
|
|
||||||
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("当前channel从EventLoop取消注册"); |
|
||||||
super.channelUnregistered(ctx); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { |
|
||||||
// super.exceptionCaught(ctx, cause);
|
|
||||||
log.info("通信异常!!"); |
|
||||||
// receiveStr = null;
|
|
||||||
Channel incoming = ctx.channel(); |
|
||||||
if (incoming.isActive()) { |
|
||||||
log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); |
|
||||||
receiveStr = null; |
|
||||||
cause.printStackTrace(); |
|
||||||
ctx.close(); |
|
||||||
// receiveStr = null;
|
|
||||||
// try {
|
|
||||||
// TimeUnit.SECONDS.sleep(5);
|
|
||||||
// SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
||||||
// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":");
|
|
||||||
// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":");
|
|
||||||
// NettyClient nettyClient = new NettyClient();
|
|
||||||
// nettyClient.connect(Integer.parseInt(port), host); // 断线重连
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelActive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
// super.channelActive(ctx);
|
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.WEB_FLAG) { |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
ctx.channel().read(); |
|
||||||
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); |
|
||||||
Date date = new Date(); |
|
||||||
log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); |
|
||||||
|
|
||||||
// 截取IP地址
|
|
||||||
IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); |
|
||||||
// 截取端口号
|
|
||||||
port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); |
|
||||||
log.info("IP: " + IP + ",端口号: " + port); |
|
||||||
|
|
||||||
// 生成对应的采集指令
|
|
||||||
// 修改生成指令(冷量计和电量一起采集) update by ljf on 2021-01-27
|
|
||||||
deviceManageEntityList = deviceCodeParamService.queryCodeParam(port); |
|
||||||
size = deviceManageEntityList.size(); |
|
||||||
|
|
||||||
log.info("初始连接报文: " + receiveStr); |
|
||||||
receiveStr = ""; |
|
||||||
// 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26
|
|
||||||
SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(0),ctx,num,size); |
|
||||||
// 1.创建将要写出的数据
|
|
||||||
// String sendStr = "6830043080000068110432326536C816"; // 网络单相电表
|
|
||||||
// String sendStr = "FEFEFEFE6880025007000068010243C3B216"; // 广仪三相电表
|
|
||||||
// String collectionNum = deviceManageEntityList.get(0).getCollectionNum();
|
|
||||||
// String sendStr = GetReadOrder485.createMeterOrder(IP, port,
|
|
||||||
// deviceManageEntityList.get(0).getDataCom(), collectionNum, "1");
|
|
||||||
//// FileUtils.createFileAndWrite(sendStr, 0);
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 2.发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { |
|
||||||
// byte类型的数据
|
|
||||||
// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8"));
|
|
||||||
// String sendStr = "5803004900021914"; // 冷量计
|
|
||||||
// 申请一个数据结构存储信息
|
|
||||||
ByteBuf buffer = ctx.alloc().buffer(); |
|
||||||
// 将信息放入数据结构中
|
|
||||||
buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制
|
|
||||||
return buffer; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception { |
|
||||||
Thread.sleep(500); |
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
log.info(ctx.channel().localAddress() + "退出链接!!"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
|
||||||
try { |
|
||||||
ByteBuf buf = (ByteBuf) msg; |
|
||||||
byte[] bytes = new byte[buf.readableBytes()]; |
|
||||||
buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
buf.clear(); |
|
||||||
log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); |
|
||||||
if (bytes.length <= 62) { |
|
||||||
// if (bytes.length <= 142) {
|
|
||||||
// receiveStr = receiveStr.replace("null", "");
|
|
||||||
// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
receiveStr = receiveStr.replace("null", ""); |
|
||||||
log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} finally { |
|
||||||
ReferenceCountUtil.release(msg); |
|
||||||
} |
|
||||||
// super.channelRead(ctx, msg);
|
|
||||||
// ByteBuf buf = (ByteBuf)msg;
|
|
||||||
// byte[] req = new byte[buf.readableBytes()];
|
|
||||||
// buf.readBytes(req);
|
|
||||||
// String body = new String(req, "UTF-8");
|
|
||||||
// ByteBuf buf = (ByteBuf)msg;
|
|
||||||
// byte [] bytes = new byte[buf.readableBytes()];
|
|
||||||
// buf.readBytes(bytes);//复制内容到字节数组bytes
|
|
||||||
// log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes));
|
|
||||||
// if (bytes.length != 0) {
|
|
||||||
//// receiveStr = receiveStr.replace("null", "");
|
|
||||||
//// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
//// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串
|
|
||||||
// receiveStr = receiveStr.replace("null", "");
|
|
||||||
// log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length());
|
|
||||||
// }
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { |
|
||||||
log.info("采集电表-数据读取接收完成: " + receiveStr); |
|
||||||
// 把receiveStr的"null"值去掉
|
|
||||||
// a9fec2c71f9002fefefefe6839025007000068810643c3bb446c338d16c2b8
|
|
||||||
// A9 FE C2 C7 1F 90 02 FE FE FE FE 68 39 02 50 07 00 00 68 81 06 43 C3 5B 38 6C 33 21 16 F8 12
|
|
||||||
if ((receiveStr.length() == 62)) { |
|
||||||
// log.info(receiveStr);
|
|
||||||
analysisReceiveOrder485.analysisMeterOrder485(receiveStr,deviceManageEntityList.get(num)); // 解析电表
|
|
||||||
receiveStr = ""; |
|
||||||
num = num + 1; |
|
||||||
Thread.sleep(600); |
|
||||||
if (num > size - 1) { |
|
||||||
num = 0; |
|
||||||
receiveStr = null; |
|
||||||
// 关闭连接
|
|
||||||
ctx.close(); |
|
||||||
// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26
|
|
||||||
// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx);
|
|
||||||
} else { |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.WEB_FLAG) { |
|
||||||
log.info("有指令下发退出定时采集DDC参数"); |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
// 封装发送电表工具方法 update by ljf on 2021-01-26
|
|
||||||
SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),ctx,num,size); |
|
||||||
// 1.创建将要写出的数据
|
|
||||||
// fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16
|
|
||||||
// String sendStr = "FEFEFE6880025007000068010243C3B216";
|
|
||||||
// String collectionNum = deviceManageEntityList.get(num).getCollectionNum();
|
|
||||||
// String sendStr = GetReadOrder485.createMeterOrder(IP, port,
|
|
||||||
// deviceManageEntityList.get(num).getDataCom(), collectionNum, "1");
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 2.发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// log.info("客户端再次往服务端发送数据" + num);
|
|
||||||
} |
|
||||||
} |
|
||||||
} else if ((receiveStr.length() > 62)) { |
|
||||||
receiveStr = null; |
|
||||||
num = num + 1; |
|
||||||
Thread.sleep(500); |
|
||||||
if (num > size - 1) { |
|
||||||
num = 0; |
|
||||||
receiveStr = null; |
|
||||||
// 关闭连接
|
|
||||||
ctx.close(); |
|
||||||
// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26
|
|
||||||
// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx);
|
|
||||||
} else { |
|
||||||
// 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07
|
|
||||||
if (Constant.WEB_FLAG) { |
|
||||||
log.info("有指令下发退出定时采集DDC参数"); |
|
||||||
num = 0; |
|
||||||
// 关闭连接
|
|
||||||
receiveStr = null; |
|
||||||
ctx.close(); |
|
||||||
} else { |
|
||||||
// 封装发送电表工具方法 update by ljf on 2021-01-26
|
|
||||||
SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),ctx,num,size); |
|
||||||
// 1.创建将要写出的数据
|
|
||||||
// fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16
|
|
||||||
// String sendStr = "FEFEFE6880025007000068010243C3B216";
|
|
||||||
// String collectionNum = deviceManageEntityList.get(num).getCollectionNum();
|
|
||||||
// String sendStr = GetReadOrder485.createMeterOrder(IP, port,
|
|
||||||
// deviceManageEntityList.get(num).getDataCom(), collectionNum, "1");
|
|
||||||
// ByteBuf buffer = getByteBuf(ctx, sendStr);
|
|
||||||
// // 2.发送数据
|
|
||||||
// ctx.channel().writeAndFlush(buffer);
|
|
||||||
// log.info("客户端再次往服务端发送数据" + num);
|
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
ctx.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue