Kaynağa Gözat

Add hj212 模块

Yue 2 yıl önce
ebeveyn
işleme
688e7f9a5f
47 değiştirilmiş dosya ile 1619 ekleme ve 43 silme
  1. 5 5
      VB_DSM_V2.0/vbdsm-data-upload/pom.xml
  2. 5 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-datacollect/pom.xml
  3. 24 24
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-datacollect/src/main/resources/logback.xml
  4. 2 2
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-datacollect/src/test/java/cn/vbdsm/datacollect/DataTest.java
  5. 65 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/pom.xml
  6. 21 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/pom.xml
  7. 14 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/Constants.java
  8. 60 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/Hj212Body.java
  9. 24 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/Hj212TerminalRecord.java
  10. 18 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/Hj212TerminalStatus.java
  11. 20 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/OnlineTerminal.java
  12. 16 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/utils/KeyUtils.java
  13. 51 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/pom.xml
  14. 73 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/message/DataUploadRequest.java
  15. 84 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/message/Hj212Codec.java
  16. 93 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/message/RPCRemoteStruct.java
  17. 68 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/utils/ByteUtil.java
  18. 16 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/utils/Constants.java
  19. 54 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/pom.xml
  20. 37 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/EppSocketServerAutoConfiguration.java
  21. 39 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/ExecutorRegistar.java
  22. 35 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/config/ClientProperties.java
  23. 29 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/config/ServerProperties.java
  24. 7 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/IExecutor.java
  25. 5 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/IMessage.java
  26. 15 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/IRequest.java
  27. 98 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/MessageDriverLoop.java
  28. 12 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/OneByOneMessage.java
  29. 17 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/exception/RequestExecuteException.java
  30. 126 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/EppCloseableClient.java
  31. 99 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/EppSocketServer.java
  32. 11 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/ICodec.java
  33. 20 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/InvaildDataMessage.java
  34. 20 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NeedMoreByteMessage.java
  35. 37 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyClientHandler.java
  36. 47 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyCodecAdapter.java
  37. 62 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyServerHandler.java
  38. 9 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyUtils.java
  39. 135 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/OneByOneClient.java
  40. 32 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/OneByOneNettyClientHandler.java
  41. 2 0
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/resources/META-INF/spring.factories
  42. 3 2
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-rpc/pom.xml
  43. 4 4
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-rpc/src/main/java/cn/vbdsm/rpc/NXCodec.java
  44. 1 1
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-rpc/src/main/java/cn/vbdsm/rpc/RpcRemoterStruct.java
  45. 1 1
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-server/src/main/java/cn/vbdsm/server/ServerApplication.java
  46. 1 1
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-server/src/main/java/cn/vbdsm/server/config/SocketServerConfig.java
  47. 2 3
      VB_DSM_V2.0/vbdsm-data-upload/vbdsm-server/src/main/java/cn/vbdsm/server/executor/ReaTimeExector.java

+ 5 - 5
VB_DSM_V2.0/vbdsm-data-upload/pom.xml

@@ -9,6 +9,7 @@
     <packaging>pom</packaging>
     <version>2.0.0</version>
     <modules>
+        <module>vbdsm-hj212</module>
         <module>vbdsm-modle</module>
         <module>vbdsm-datacollect</module>
         <module>vbdsm-rpc</module>
@@ -18,7 +19,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.0.5.RELEASE</version>
+        <version>2.7.9</version>
         <relativePath/>
     </parent>
     <properties>
@@ -50,7 +51,6 @@
         <m2e.apt.activation>jdt_apt</m2e.apt.activation>
         <org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
         <lombok.version>1.16.20</lombok.version>
-        <epp.version>1.0</epp.version>
         <netty.version>4.1.58.Final</netty.version>
     </properties>
     <dependencyManagement>
@@ -71,9 +71,9 @@
             </dependency>
 
             <dependency>
-                <groupId>com.tg.epp.hj212</groupId>
-                <artifactId>epp-hj212-socket</artifactId>
-                <version>${epp.version}</version>
+                <groupId>cn.vbdsm</groupId>
+                <artifactId>vbdsm-hj212-socket</artifactId>
+                <version>2.0.0</version>
             </dependency>
 
             <dependency>

+ 5 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-datacollect/pom.xml

@@ -58,5 +58,10 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

+ 24 - 24
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-datacollect/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
-    <property name="rootLevel" value="DEBUG" />
-    <property name="appName" value="epp-hj212-service" />
+    <property name="rootLevel" value="DEBUG"/>
+    <property name="appName" value="vbdsm-hj212-service"/>
     <contextName>${appName}</contextName>
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
@@ -9,7 +9,7 @@
             <charset>UTF-8</charset>
         </encoder>
     </appender>
-    
+
     <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <FileNamePattern>${catalina.home:-.}/logs/${appName}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
@@ -22,12 +22,12 @@
             <charset>UTF-8</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>INFO</level>  
-            <onMatch>ACCEPT</onMatch>  
-            <onMismatch>DENY</onMismatch>  
-        </filter> 
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
     </appender>
-    
+
     <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <FileNamePattern>${catalina.home:-.}/logs/${appName}.%d{yyyy-MM-dd}.%i.error.log</FileNamePattern>
@@ -40,25 +40,25 @@
             <charset>UTF-8</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>  
-            <onMatch>ACCEPT</onMatch>  
-            <onMismatch>DENY</onMismatch>  
-        </filter> 
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
     </appender>
-    
- 	<logger name="org.springframework" level="warn"/>
- 	<logger name="org.apache.http" level="warn"/>
- 	<logger name="org.mybatis" level="warn"/>
- 	<logger name="org.hibernate" level="warn"/>
- 	<logger name="org.apache.ibatis" level="warn"/>
- 	<logger name="io.netty" level="info"/>
- 	<logger name="com.ctrip" level="warn"/>
- 	<logger name="org.eclipse.jetty" level="warn"/>
+
+    <logger name="org.springframework" level="warn"/>
+    <logger name="org.apache.http" level="warn"/>
+    <logger name="org.mybatis" level="warn"/>
+    <logger name="org.hibernate" level="warn"/>
+    <logger name="org.apache.ibatis" level="warn"/>
+    <logger name="io.netty" level="info"/>
+    <logger name="com.ctrip" level="warn"/>
+    <logger name="org.eclipse.jetty" level="warn"/>
     <logger name="org.apache.ibatis" level="warn"/>
     <logger name="java.sql" level="warn"/>
     <root level="${rootLevel}">
-        <appender-ref ref="STDOUT" />
-        <appender-ref ref="INFO" />
-        <appender-ref ref="ERROR" />
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="ERROR"/>
     </root>
 </configuration>

+ 2 - 2
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-datacollect/src/test/java/cn/vbdsm/datacollect/DataTest.java

@@ -2,8 +2,8 @@ package cn.vbdsm.datacollect;
 
 import cn.vbdsm.datacollect.biz.IMonitorBiz;
 import cn.vbdsm.datacollect.biz.IOnlineDataEnergyBiz;
-import org.junit.Ignore;
-import org.junit.Test;
+import jdk.nashorn.internal.ir.annotations.Ignore;
+import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;

+ 65 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/pom.xml

@@ -0,0 +1,65 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>vbdsm-hj212</artifactId>
+    <version>2.0.0</version>
+    <packaging>pom</packaging>
+
+    <parent>
+        <artifactId>vbdsm-data-upload</artifactId>
+        <groupId>cn.vbdsm</groupId>
+        <version>2.0.0</version>
+    </parent>
+    <properties>
+        <netty.version>4.1.58.Final</netty.version>
+        <springboot.skip>false</springboot.skip>
+        <lombok.version>1.16.20</lombok.version>
+        <spring-boot.version>2.7.9</spring-boot.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter</artifactId>
+                <version>${spring-boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.netty</groupId>
+                <artifactId>netty-all</artifactId>
+                <version>${netty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.vbdsm</groupId>
+                <artifactId>vbdsm-hj212-socket</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.vbdsm</groupId>
+                <artifactId>vbdsm-hj212-rpc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.vbdsm</groupId>
+                <artifactId>vbdsm-hj212-common</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>1.2.83</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <modules>
+        <module>vbdsm-hj212-socket</module>
+        <module>vbdsm-hj212-rpc</module>
+        <module>vbdsm-hj212-common</module>
+    </modules>
+</project>

+ 21 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/pom.xml

@@ -0,0 +1,21 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.vbdsm</groupId>
+        <artifactId>vbdsm-hj212</artifactId>
+        <version>2.0.0</version>
+    </parent>
+    <artifactId>vbdsm-hj212-common</artifactId>
+
+    <properties>
+        <springboot.skip>true</springboot.skip>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 14 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/Constants.java

@@ -0,0 +1,14 @@
+package cn.vbdsm.hj212.common;
+
+public class Constants {
+    public static final String REDIS_TERMIANL_BASE_KEY_PRIFIX = "hj212:online:terminal:base";
+
+    public static final String REDIS_TERMIANL_ONLINE_KEY_PRIFIX = "hj212:online:terminal:online";
+
+    public static final String REDIS_TERMIANL_SYNC2DB_KEY_PRIFIX = "hj212:online:terminal:sync2db";
+
+    public static final String REDIS_TERMIANL_STATUS_KEY_PRIFIX = "hj212:online:terminal:status";
+
+    public static final String REDIS_KEY_SPLIT = ":";
+
+}

+ 60 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/Hj212Body.java

@@ -0,0 +1,60 @@
+package cn.vbdsm.hj212.common.model;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class Hj212Body {
+    private String terminal_id;
+
+    private Long upload_date;
+
+    private Integer rs;
+
+    private BigDecimal qv;
+
+    private BigDecimal pv;
+
+    private BigDecimal p;
+
+    private BigDecimal pa;
+
+    private BigDecimal pb;
+
+    private BigDecimal pc;
+
+    private BigDecimal q;
+
+    private BigDecimal ua;
+
+    private BigDecimal ub;
+
+    private BigDecimal uc;
+
+    private BigDecimal uab;
+
+    private BigDecimal ubc;
+
+    private BigDecimal uac;
+
+    private BigDecimal ia;
+
+    private BigDecimal ib;
+
+    private BigDecimal ic;
+
+    private BigDecimal in;
+
+    private BigDecimal the;
+
+    private BigDecimal thea;
+
+    private BigDecimal theb;
+
+    private BigDecimal thec;
+
+    private String flag;
+
+    private Long insert_time;
+}

+ 24 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/Hj212TerminalRecord.java

@@ -0,0 +1,24 @@
+package cn.vbdsm.hj212.common.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class Hj212TerminalRecord {
+    private String terminal_id;
+
+    private BigDecimal ta;
+
+    private int ct_enable;
+
+    private BigDecimal tv;
+
+    private int pt_enable;
+
+    private String mn;
+
+    private String factor;
+}

+ 18 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/Hj212TerminalStatus.java

@@ -0,0 +1,18 @@
+package cn.vbdsm.hj212.common.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class Hj212TerminalStatus {
+    private String terminalId;
+
+    private BigDecimal tpe;
+
+    private BigDecimal lastNum;
+
+    private Long lastTime;
+}

+ 20 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/model/OnlineTerminal.java

@@ -0,0 +1,20 @@
+package cn.vbdsm.hj212.common.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class OnlineTerminal {
+    private String terminal_id;
+    private Long upload_date;
+    private BigDecimal power;
+    private BigDecimal energy;
+    private BigDecimal tpe;
+    private BigDecimal tps;
+    private Integer type; // 工况类型; 0:生产; 1:未生产
+    private Long insert_time;
+    private Hj212Body body;
+}

+ 16 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-common/src/main/java/cn/vbdsm/hj212/common/utils/KeyUtils.java

@@ -0,0 +1,16 @@
+package cn.vbdsm.hj212.common.utils;
+
+import cn.vbdsm.hj212.common.Constants;
+
+public class KeyUtils {
+    public static String mergeRedisKey(String... args) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < args.length; i++) {
+            sb.append(args[i]);
+            if (i != args.length - 1) {
+                sb.append(Constants.REDIS_KEY_SPLIT);
+            }
+        }
+        return sb.toString();
+    }
+}

+ 51 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/pom.xml

@@ -0,0 +1,51 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.vbdsm</groupId>
+        <artifactId>vbdsm-hj212</artifactId>
+        <version>2.0.0</version>
+    </parent>
+    <artifactId>vbdsm-hj212-rpc</artifactId>
+
+    <properties>
+        <springboot.skip>true</springboot.skip>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.parent.groupId}</groupId>
+            <artifactId>vbdsm-hj212-socket</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j-to-slf4j</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>${project.parent.groupId}</groupId>
+            <artifactId>vbdsm-hj212-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>7</source>
+                    <target>7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 73 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/message/DataUploadRequest.java

@@ -0,0 +1,73 @@
+package cn.vbdsm.hj212.rpc.message;
+
+import cn.vbdsm.hj212.common.model.Hj212Body;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import static cn.vbdsm.hj212.rpc.utils.Constants.*;
+
+/**
+ * 上传数据msg
+ *
+ * @author liyu
+ */
+@Getter
+@Setter
+public class DataUploadRequest {
+    private Long dateTime;
+
+    private Map<String, JSONObject> factors = new HashMap<>();
+
+    private JSONObject others = new JSONObject();
+
+    public static DataUploadRequest parse(String cp) {
+        DataUploadRequest request = new DataUploadRequest();
+        String[] params = cp.split(PARAM_OUTER_SPLITCHAR);
+        for (String param : params) {
+            String[] groups = param.split(PARAM_INNER_SPLITCHAR);
+            for (String group : groups) {
+                String[] tmp = group.split(PARAM_KEY_VALUE_SPLITCHAR);
+                if (tmp[0].equals(PARAM_KEY_DATETIME)) {
+                    request.setDateTime(Long.parseLong(tmp[1]));
+                } else if (tmp[0].contains(PARAM_KEY_SPLITCHAR))//带监测因子的数据
+                {
+                    String[] splitArray = tmp[0].split(PARAM_KEY_SPLITCHAR);
+                    JSONObject factor = request.getFactors().get(splitArray[0]);
+                    if (factor == null) {
+                        factor = new JSONObject();
+                        request.getFactors().put(splitArray[0], factor);
+                    }
+                    factor.put(splitArray[1], tmp[1]);
+                }
+            }
+        }
+        return request;
+    }
+
+    public Hj212Body getBody(String factor) {
+        String jsonString = factors.get(factor).toJSONString();
+        Hj212Body body = JSONObject.parseObject(jsonString.toLowerCase(), Hj212Body.class);
+        return body;
+    }
+
+    public BigDecimal getPower(String factor) {
+        String p = factors.get(factor).getString("P");
+        if (null == p) {
+            return null;
+        }
+        return new BigDecimal(p);
+    }
+
+    public BigDecimal getEnergy(String factor) {
+        String pv = factors.get(factor).getString("Pv");
+        if (null == pv) {
+            return null;
+        }
+        return new BigDecimal(pv);
+    }
+}

+ 84 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/message/Hj212Codec.java

@@ -0,0 +1,84 @@
+package cn.vbdsm.hj212.rpc.message;
+
+import cn.vbdsm.hj212.rpc.utils.ByteUtil;
+import cn.vbdsm.hj212.rpc.utils.Constants;
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import cn.vbdsm.hj212.socket.transport.ICodec;
+import cn.vbdsm.hj212.socket.transport.InvaildDataMessage;
+import cn.vbdsm.hj212.socket.transport.NeedMoreByteMessage;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.util.CharsetUtil;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class Hj212Codec implements ICodec {
+
+    @Override
+    public IMessage decode(ChannelHandlerContext ctx, ByteBuf input) {
+        int length = input.readableBytes();
+        if (length < Constants.minLength) {
+            return NeedMoreByteMessage.getInstance();
+        }
+        //判断包头
+        byte[] headBytes = new byte[2];
+        input.readBytes(headBytes);
+        if (!new String(headBytes).equals(Constants.HEADER)) {
+            return InvaildDataMessage.getInstance();
+        }
+        int bodyLength = Integer.parseInt(input.readCharSequence(4, CharsetUtil.UTF_8).toString());
+		/*if (bodyLength > Constants.bodyMaxLength)//超过最大长度,需要跳出
+		{
+			in.readerIndex(in.writerIndex());//readindex skip到末尾,这样这段字节会被跳过不做解析
+			return;
+		}*/
+        if (input.readableBytes() < bodyLength + Constants.tailLength) {
+            return NeedMoreByteMessage.getInstance();
+        }
+        byte[] bodyBytes = new byte[bodyLength];
+        input.readBytes(bodyBytes);
+        String body = new String(bodyBytes);
+
+        //check crc
+        byte[] crcBytes = new byte[4];
+        input.readBytes(crcBytes);
+        String readCrcValue = new String(crcBytes).toLowerCase();
+        //check tail
+        byte[] tailBytes = new byte[2];
+        input.readBytes(tailBytes);
+        String tail = new String(tailBytes).toLowerCase();
+        if (!"\r\n".equals(tail)) {
+            return InvaildDataMessage.getInstance();
+        }
+
+        String crcValue = ByteUtil.crc16(body.toCharArray());
+        if (!readCrcValue.equals(crcValue)) {
+            return InvaildDataMessage.getInstance();
+        }
+
+        try {
+            RPCRemoteStruct struct = RPCRemoteStruct.newRPCRemoteSturct(body);
+            return struct;
+        } catch (Exception ex) {
+            log.error("decode fail,body:" + body, ex);
+            return InvaildDataMessage.getInstance();
+        }
+    }
+
+    @Override
+    public void encode(IMessage msg, ByteBuf out) {
+        String body = msg.toString();
+        String crc16 = ByteUtil.crc16(body.toCharArray());
+        out.writeBytes(Constants.HEADER.getBytes());
+        byte[] bodyBytes = body.getBytes();
+        String length = String.valueOf(bodyBytes.length);
+        while (length.length() < 4) {
+            length = "0" + length;
+        }
+        out.writeBytes(length.getBytes());
+        out.writeBytes(bodyBytes);
+        out.writeBytes(crc16.getBytes());
+        out.writeBytes(Constants.TAIL.getBytes());
+    }
+
+}

+ 93 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/message/RPCRemoteStruct.java

@@ -0,0 +1,93 @@
+package cn.vbdsm.hj212.rpc.message;
+
+
+import cn.vbdsm.hj212.rpc.utils.ByteUtil;
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static cn.vbdsm.hj212.rpc.utils.Constants.PARAM_KEY_VALUE_SPLITCHAR;
+import static cn.vbdsm.hj212.rpc.utils.Constants.PARAM_OUTER_SPLITCHAR;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class RPCRemoteStruct implements IMessage {
+
+    private String qn;
+
+    private String st;
+
+    private String cn;
+
+    private String pw;
+
+    private String mn;
+
+    private String version;
+
+    private boolean oneway;
+
+    private boolean mutiPack;
+
+    private int pnum;
+
+    private int pno;
+
+    private String cp;
+
+    public static RPCRemoteStruct newRPCRemoteSturct(String body) {
+        int cpIndex = body.indexOf("CP=&&");
+        Map<String, String> keyValueMap = new HashMap<>();
+        String cp = body.substring(cpIndex);
+
+        String[] keyAndValues = body.substring(0, cpIndex).split(PARAM_OUTER_SPLITCHAR);
+        for (String keyAndValue : keyAndValues) {
+            String[] tmp = keyAndValue.split(PARAM_KEY_VALUE_SPLITCHAR);
+            keyValueMap.put(tmp[0], tmp[1]);
+        }
+
+        String qn = keyValueMap.get("QN");
+        String st = keyValueMap.get("ST");
+        String cn = keyValueMap.get("CN");
+        String pw = keyValueMap.get("PW");
+        String mn = keyValueMap.get("MN");
+        int flag = Integer.parseInt(keyValueMap.get("Flag"));
+        String version = ByteUtil.getBits(flag, 0, 6);
+        boolean mutiPack = ByteUtil.getBit(flag, 6) == 1;
+        boolean oneway = ByteUtil.getBit(flag, 7) == 1;
+        String pnum = "0";
+        String pno = "0";
+        if (mutiPack) {
+            pnum = keyValueMap.get("PNUM");
+            pno = keyValueMap.get("PNO");
+        }
+        cp = cp.replace("CP=", "").replace("&&", "");//去除&&
+        return new RPCRemoteStruct(qn, st, cn, pw, mn, version, oneway, mutiPack, Integer.parseInt(pnum), Integer.parseInt(pno), cp);
+    }
+
+    @Override
+    public String interestKey() {
+        return this.cn;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("QN").append(PARAM_KEY_VALUE_SPLITCHAR).append(qn).append(PARAM_OUTER_SPLITCHAR)
+                .append("ST").append(PARAM_KEY_VALUE_SPLITCHAR).append(st).append(PARAM_OUTER_SPLITCHAR)
+                .append("CN").append(PARAM_KEY_VALUE_SPLITCHAR).append(cn).append(PARAM_OUTER_SPLITCHAR)
+                .append("PW").append(PARAM_KEY_VALUE_SPLITCHAR).append(pw).append(PARAM_OUTER_SPLITCHAR)
+                .append("MN").append(PARAM_KEY_VALUE_SPLITCHAR).append(mn).append(PARAM_OUTER_SPLITCHAR)
+                .append("Flag").append(PARAM_KEY_VALUE_SPLITCHAR).append(ByteUtil.getFlag(version, mutiPack, oneway)).append(PARAM_OUTER_SPLITCHAR);
+        if (mutiPack) {
+            sb.append("PNUM").append(PARAM_KEY_VALUE_SPLITCHAR).append(pnum).append(PARAM_OUTER_SPLITCHAR)
+                    .append("PNO").append(PARAM_KEY_VALUE_SPLITCHAR).append(pno).append(PARAM_OUTER_SPLITCHAR);
+        }
+        sb.append("CP").append(PARAM_KEY_VALUE_SPLITCHAR).append("&&").append(cp).append("&&");
+        return sb.toString();
+    }
+}

+ 68 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/utils/ByteUtil.java

@@ -0,0 +1,68 @@
+package cn.vbdsm.hj212.rpc.utils;
+
+import java.math.BigInteger;
+
+public class ByteUtil {
+    public static int getBit(int num, int offset) {
+        return (num >> (7 - offset)) & 1;
+    }
+
+    public static String getBits(int num, int offset, int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = offset; i < length + offset; i++) {
+            sb.append(getBit(num, i));
+        }
+        return sb.toString();
+    }
+
+    public static String crc16(char[] contents) {
+        int crc16 = 0xFFFF;
+        for (char one : contents) {
+            crc16 = (crc16 >> 8) ^ one;
+            for (int i = 0; i < 8; i++) {
+                int check = crc16 & 0x0001;
+                crc16 = crc16 >> 1;
+                if (check == 0x0001) {
+                    crc16 = crc16 ^ 0xA001;
+                }
+            }
+        }
+        String result = Integer.toHexString(crc16).toLowerCase();
+        while (result.length() < 4) {
+            result = "0" + result;
+        }
+        return result;
+    }
+
+    public static String getFlag(String version, boolean mutilpack, boolean ack) {
+        String flag = version + (mutilpack ? "1" : "0") + (ack ? "1" : "0");
+        String result = new BigInteger(flag, 2).toString(10);
+        return result;
+    }
+
+    public static String getHj212CRC16(byte[] contents) {
+        int crc16 = 0xFFFF;
+        for (byte one : contents) {
+            crc16 = (crc16 >> 8) ^ one;
+            for (int i = 0; i < 8; i++) {
+                int check = crc16 & 0x0001;
+                crc16 = crc16 >> 1;
+                if (check == 0x0001) {
+                    crc16 = crc16 ^ 0xA001;
+                }
+            }
+        }
+        String result = Integer.toHexString(crc16).toLowerCase();
+        while (result.length() < 4) {
+            result = "0" + result;
+        }
+        return result.toUpperCase();
+    }
+	
+	/*public static void main(String[] args)
+	{
+		String content = "QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=005;CP=&&RtdInterval=30&&";
+		RPCRemoteStruct remoteStruct = RPCRemoteStruct.newRPCRemoteSturct(content.toCharArray());
+		System.out.println(remoteStruct);
+	}*/
+}

+ 16 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-rpc/src/main/java/cn/vbdsm/hj212/rpc/utils/Constants.java

@@ -0,0 +1,16 @@
+package cn.vbdsm.hj212.rpc.utils;
+
+public class Constants {
+    public static final String PARAM_OUTER_SPLITCHAR = ";";
+    public static final String PARAM_KEY_VALUE_SPLITCHAR = "=";
+    public static final String PARAM_KEY_SPLITCHAR = "-";
+    public static final String PARAM_INNER_SPLITCHAR = ",";
+    public static final String PARAM_KEY_DATETIME = "DataTime";
+    public static int headLength = 6;
+    public static int tailLength = 6;
+    public static int minLength = 12;
+    public static int bodyMaxLength = 1024;
+    public static int maxLength = bodyMaxLength + minLength;
+    public static String HEADER = "##";
+    public static String TAIL = "\r\n";
+}

+ 54 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/pom.xml

@@ -0,0 +1,54 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.vbdsm</groupId>
+        <artifactId>vbdsm-hj212</artifactId>
+        <version>2.0.0</version>
+    </parent>
+    <artifactId>vbdsm-hj212-socket</artifactId>
+
+    <properties>
+        <springboot.skip>true</springboot.skip>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>${springboot.skip}</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <compilerVersion>${java.version}</compilerVersion>
+                    <encoding>UTF-8</encoding>
+                    <compilerArgument>-Xlint:unchecked</compilerArgument>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 37 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/EppSocketServerAutoConfiguration.java

@@ -0,0 +1,37 @@
+package cn.vbdsm.hj212.socket;
+
+import cn.vbdsm.hj212.socket.config.ClientProperties;
+import cn.vbdsm.hj212.socket.config.ServerProperties;
+import cn.vbdsm.hj212.socket.driver.MessageDriverLoop;
+import cn.vbdsm.hj212.socket.transport.EppCloseableClient;
+import cn.vbdsm.hj212.socket.transport.EppSocketServer;
+import cn.vbdsm.hj212.socket.transport.ICodec;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+@Configuration
+@Import(value = {ExecutorRegistar.class, ServerProperties.class, ClientProperties.class})
+public class EppSocketServerAutoConfiguration {
+    @Bean
+    @ConditionalOnMissingBean
+    public MessageDriverLoop messageDriverLoop() {
+        return new MessageDriverLoop();
+    }
+
+    @Bean
+    @ConditionalOnProperty(prefix = "tg.socket.server", value = "enable", havingValue = "true", matchIfMissing = false)
+    @ConditionalOnMissingBean
+    public EppSocketServer eppSocketServer(ServerProperties s_properties, MessageDriverLoop messageDriverLoop, ICodec codec) {
+        return new EppSocketServer(s_properties, messageDriverLoop, codec);
+    }
+
+    @Bean
+    @ConditionalOnProperty(prefix = "tg.socket.client", value = "enable", havingValue = "true", matchIfMissing = false)
+    @ConditionalOnMissingBean
+    public EppCloseableClient eppCloseableClient(ClientProperties c_properties, MessageDriverLoop messageDriverLoop, ICodec codec) {
+        return new EppCloseableClient(c_properties, messageDriverLoop, codec);
+    }
+}

+ 39 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/ExecutorRegistar.java

@@ -0,0 +1,39 @@
+package cn.vbdsm.hj212.socket;
+
+import cn.vbdsm.hj212.socket.driver.IExecutor;
+import cn.vbdsm.hj212.socket.driver.MessageDriverLoop;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+import java.util.Map;
+
+@Slf4j
+public class ExecutorRegistar implements ApplicationContextAware, InitializingBean {
+    private ApplicationContext applicationContext;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        //注册所有消息驱动
+        Map<String, IExecutor> beanMap = applicationContext.getBeansOfType(IExecutor.class);
+        if (beanMap.isEmpty()) {
+            return;
+        }
+        MessageDriverLoop loop = applicationContext.getBean(MessageDriverLoop.class);
+        if (loop != null) {
+            loop.start();
+            for (IExecutor executor : beanMap.values()) {
+                log.info("注册消息:" + executor.registerKey());
+                loop.register(executor);
+            }
+        }
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+}

+ 35 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/config/ClientProperties.java

@@ -0,0 +1,35 @@
+package cn.vbdsm.hj212.socket.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@Component
+@ConfigurationProperties(prefix = "tg.socket.client")
+public class ClientProperties {
+    private int bindPort = -1;
+
+    private String bindIp = "0.0.0.0";
+
+    private String remoteIp = null;
+
+    private Integer remotePort = null;
+
+    private Integer timeout = 3000;
+
+    private Integer readoutTimeout = 5000;
+
+    public static ClientProperties defaultProperties(String remoteIp, int remotePort) {
+        ClientProperties properties = new ClientProperties();
+        properties.bindPort = -1;
+        properties.bindIp = "0.0.0.0";
+        properties.remoteIp = remoteIp;
+        properties.remotePort = remotePort;
+        properties.timeout = 3000;
+        properties.readoutTimeout = 5000;
+        return properties;
+    }
+}

+ 29 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/config/ServerProperties.java

@@ -0,0 +1,29 @@
+package cn.vbdsm.hj212.socket.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@Component
+@ConfigurationProperties(prefix = "tg.socket.server")
+public class ServerProperties {
+    private Integer bindPort = 19999;
+
+    private String bindIp = "0.0.0.0";
+
+    private Integer bossThreadNum = 1;
+
+    private Integer workThreadNum = 4;
+
+    public static ServerProperties defaultProperties() {
+        ServerProperties properties = new ServerProperties();
+        properties.bindPort = 19999;
+        properties.bindIp = "0.0.0.0";
+        properties.bossThreadNum = 1;
+        properties.workThreadNum = 4;
+        return properties;
+    }
+}

+ 7 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/IExecutor.java

@@ -0,0 +1,7 @@
+package cn.vbdsm.hj212.socket.driver;
+
+public interface IExecutor {
+    String registerKey();
+
+    void execute(IRequest request) throws Exception;
+}

+ 5 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/IMessage.java

@@ -0,0 +1,5 @@
+package cn.vbdsm.hj212.socket.driver;
+
+public interface IMessage {
+    String interestKey();
+}

+ 15 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/IRequest.java

@@ -0,0 +1,15 @@
+package cn.vbdsm.hj212.socket.driver;
+
+import io.netty.channel.ChannelHandlerContext;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class IRequest {
+    private IMessage msg;
+
+    private ChannelHandlerContext ctx;
+}

+ 98 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/MessageDriverLoop.java

@@ -0,0 +1,98 @@
+package cn.vbdsm.hj212.socket.driver;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.LinkedBlockingQueue;
+
+@Slf4j
+public class MessageDriverLoop {
+    private final LinkedBlockingQueue<IRequest> loop = new LinkedBlockingQueue<>();
+
+    private final Map<String, IExecutor> executorMap = new ConcurrentHashMap<>();
+
+    private final Thread[] threads;
+
+    private Boolean startFlag = false;
+
+    public MessageDriverLoop() {
+        this(1);
+    }
+
+    public MessageDriverLoop(int threadNum) {
+        ThreadGroup group = new ThreadGroup("message-driver-thread");
+        threads = new Thread[threadNum];
+        for (int i = 1; i <= threadNum; i++) {
+            Thread thread = new Thread(group, new ExcutorTask(), "message-driver-thread-" + i);
+            threads[i - 1] = thread;
+        }
+    }
+
+    public boolean putMessage(IRequest msg) {
+        return loop.add(msg);
+    }
+
+    public synchronized void start() {
+        if (startFlag) {
+            return;
+        }
+        for (Thread thread : threads) {
+            thread.start();
+        }
+        startFlag = true;
+    }
+
+    public synchronized void stop() {
+        if (!startFlag) {
+            return;
+        }
+        for (Thread thread : threads) {
+            thread.interrupt();
+        }
+        startFlag = false;
+    }
+
+    /**
+     * 注册处理器,线程不安全,单线程调用
+     *
+     * @param executor
+     * @return true:成功,false:失败
+     */
+    public boolean register(IExecutor executor) {
+        if (executorMap.containsKey(executor.registerKey())) {
+            return false;
+        }
+        executorMap.put(executor.registerKey(), executor);
+        return true;
+    }
+
+    /**
+     * 卸载处理器,暂时不做调用
+     *
+     * @param register
+     */
+    public void unRegister(String register) {
+        executorMap.remove(register);
+    }
+
+    class ExcutorTask implements Runnable {
+        @Override
+        public void run() {
+            while (true) {
+                try {
+                    IRequest request = loop.take();
+                    IExecutor executor = executorMap.get(request.getMsg().interestKey());
+                    if (executor == null) {
+                        throw new RuntimeException("unkown cmd");
+                    }
+                    executor.execute(request);
+                } catch (Exception ex) {
+                    log.error("main loop error", ex);
+                }
+            }
+        }
+    }
+}
+	
+	

+ 12 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/driver/OneByOneMessage.java

@@ -0,0 +1,12 @@
+package cn.vbdsm.hj212.socket.driver;
+
+import lombok.Data;
+
+import java.util.concurrent.CountDownLatch;
+
+@Data
+public class OneByOneMessage {
+    private IMessage response;
+
+    private CountDownLatch latch = new CountDownLatch(1);
+}

+ 17 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/exception/RequestExecuteException.java

@@ -0,0 +1,17 @@
+package cn.vbdsm.hj212.socket.exception;
+
+public class RequestExecuteException extends RuntimeException {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    public RequestExecuteException(String message) {
+        super(message);
+    }
+
+    public RequestExecuteException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 126 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/EppCloseableClient.java

@@ -0,0 +1,126 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.config.ClientProperties;
+import cn.vbdsm.hj212.socket.driver.MessageDriverLoop;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.concurrent.DefaultThreadFactory;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+public class EppCloseableClient {
+    private static final int DEFAULT_IO_THREADS = Math.min(Runtime.getRuntime().availableProcessors() + 1, 32);
+    private static final NioEventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(DEFAULT_IO_THREADS,
+            new DefaultThreadFactory("NettyClientWorker", true));
+    private final ClientProperties properties;
+    private final MessageDriverLoop loop;
+    private final ICodec codec;
+    @Getter
+    private Bootstrap bootstrap;
+    @Getter
+    private Channel channel;
+
+    public EppCloseableClient(ICodec codec, MessageDriverLoop loop, String remoteIp, int remotePort) {
+        this.properties = ClientProperties.defaultProperties(remoteIp, remotePort);
+        this.codec = codec;
+        this.loop = loop;
+    }
+
+    public EppCloseableClient(ClientProperties properties, MessageDriverLoop loop, ICodec codec) {
+        this.properties = properties;
+        this.codec = codec;
+        this.loop = loop;
+    }
+
+    public boolean run() {
+        bootstrap = new Bootstrap();
+        bootstrap.group(nioEventLoopGroup)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
+                .channel(NioSocketChannel.class);
+
+        if (properties.getTimeout() < 3000) {
+            bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000);
+        } else {
+            bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, properties.getTimeout());
+        }
+
+        NettyClientHandler clientHandler = new NettyClientHandler(loop);
+
+        bootstrap.handler(new ChannelInitializer<NioSocketChannel>() {
+            @Override
+            protected void initChannel(NioSocketChannel ch) throws Exception {
+                NettyCodecAdapter adapter = new NettyCodecAdapter(codec);
+                ch.pipeline()//.addLast("logging",new LoggingHandler(LogLevel.INFO))//for debug
+                        .addLast("decoder", adapter.getInternalDecoder())
+                        .addLast("encoder", adapter.getInternalEncoder())
+                        .addLast("handler", clientHandler);
+            }
+        });
+
+        // bind
+        if (!"0.0.0.0".equals(properties.getBindIp()) && properties.getBindPort() != -1) {
+            bootstrap.bind(properties.getBindIp(), properties.getBindPort());
+        }
+        ChannelFuture channelFuture = bootstrap.connect(properties.getRemoteIp(), properties.getRemotePort());
+        log.info("client starting ....");
+        channelFuture.awaitUninterruptibly(properties.getTimeout(), TimeUnit.MILLISECONDS);
+        if (channelFuture.isSuccess() && channelFuture.cause() == null) {
+            channel = channelFuture.channel();
+            log.info("client has started, remote:" + properties.getRemoteIp() + "," + "port:" + properties.getRemotePort());
+            return true;
+        }
+        channelFuture.cancel(true);
+        if (channelFuture.channel() != null) {
+            channelFuture.channel().close().syncUninterruptibly();
+        }
+        return false;
+    }
+
+    public boolean restart() {
+        if (!"0.0.0.0".equals(properties.getBindIp()) && properties.getBindPort() != -1) {
+            bootstrap.bind(properties.getBindIp(), properties.getBindPort());
+        }
+        ChannelFuture channelFuture = bootstrap.connect(properties.getRemoteIp(), properties.getRemotePort());
+        log.info("client starting ....");
+        channelFuture.awaitUninterruptibly(properties.getTimeout(), TimeUnit.MILLISECONDS);
+        if (channelFuture.isSuccess() && channelFuture.cause() == null) {
+            channel = channelFuture.channel();
+            log.info("client has started, remote:" + properties.getRemoteIp() + "," + "port:" + properties.getRemotePort());
+            return true;
+        }
+        channelFuture.cancel(true);
+        if (channelFuture.channel() != null) {
+            channelFuture.channel().close().syncUninterruptibly();
+        }
+        return false;
+    }
+
+    public boolean test() {
+        try {
+            boolean flag = run();
+            return flag;
+        } catch (Exception ex) {
+            log.error("connect error !", ex);
+            return false;
+        } finally {
+            stop();
+        }
+    }
+
+    public void stop() {
+        if (channel != null && channel.isActive()) {
+            channel.close().syncUninterruptibly();
+        }
+    }
+}

+ 99 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/EppSocketServer.java

@@ -0,0 +1,99 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.config.ServerProperties;
+import cn.vbdsm.hj212.socket.driver.MessageDriverLoop;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.concurrent.DefaultThreadFactory;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+public class EppSocketServer {
+    private final ServerProperties properties;
+
+    private final MessageDriverLoop loop;
+
+    private final ICodec codec;
+    @Getter
+    private ServerBootstrap bootstrap;
+    private Map<String, Channel> channels = new ConcurrentHashMap<String, Channel>(); // <ip:port, channel>
+    @Getter
+    private Channel channel;
+
+    public EppSocketServer(MessageDriverLoop loop, ICodec codec) {
+        super();
+        this.properties = ServerProperties.defaultProperties();
+        this.loop = loop;
+        this.codec = codec;
+    }
+
+    public EppSocketServer(ServerProperties properties, MessageDriverLoop loop, ICodec codec) {
+        super();
+        this.properties = properties;
+        this.loop = loop;
+        this.codec = codec;
+    }
+
+    public void run() {
+        NioEventLoopGroup bossGroup = new NioEventLoopGroup(properties.getBossThreadNum(), new DefaultThreadFactory("NettyServerBoss", true));
+        NioEventLoopGroup workerGroup = new NioEventLoopGroup(properties.getWorkThreadNum(), new DefaultThreadFactory("NettyServerWorker", true));
+        ServerBootstrap bootstrap = new ServerBootstrap();
+
+        final NettyServerHandler serverHandler = new NettyServerHandler(loop);
+        channels = serverHandler.getChannels();
+        bootstrap.group(bossGroup, workerGroup)
+                .channel(NioServerSocketChannel.class)
+                .childOption(ChannelOption.TCP_NODELAY, Boolean.TRUE)
+                .childOption(ChannelOption.SO_REUSEADDR, Boolean.TRUE)
+                .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
+                .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
+                .childHandler(new ChannelInitializer<NioSocketChannel>() {
+
+                    @Override
+                    protected void initChannel(NioSocketChannel ch) throws Exception {
+                        NettyCodecAdapter adapter = new NettyCodecAdapter(codec);
+                        ch.pipeline()//.addLast("logging",new LoggingHandler(LogLevel.INFO))//for debug
+                                .addLast("decoder", adapter.getInternalDecoder())
+                                .addLast("encoder", adapter.getInternalEncoder())
+                                .addLast("handler", serverHandler);
+                    }
+                });
+        // bind
+        ChannelFuture channelFuture = bootstrap.bind(properties.getBindIp(), properties.getBindPort());
+        log.info("sever starting ....");
+        channelFuture.syncUninterruptibly();
+        channel = channelFuture.channel();
+        log.info("sever has started, ip:" + properties.getBindIp() + "," + "port:" + properties.getBindPort());
+    }
+
+    public void stop() throws InterruptedException {
+        loop.stop();
+        channel.close().await();
+    }
+
+    public Collection<Channel> getChannels() {
+        Collection<Channel> chs = new HashSet<Channel>();
+        for (Channel channel : this.channels.values()) {
+            if (channel.isActive()) {
+                chs.add(channel);
+            } else {
+                channels.remove(NettyUtils.toAddressString((InetSocketAddress) channel.remoteAddress()));
+            }
+        }
+        return chs;
+    }
+}

+ 11 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/ICodec.java

@@ -0,0 +1,11 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+
+public interface ICodec {
+    IMessage decode(ChannelHandlerContext ctx, ByteBuf input);
+
+    void encode(IMessage msg, ByteBuf out);
+}

+ 20 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/InvaildDataMessage.java

@@ -0,0 +1,20 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+
+public class InvaildDataMessage implements IMessage {
+    private static final InvaildDataMessage _instance = new InvaildDataMessage();
+
+    private InvaildDataMessage() {
+    }
+
+    public static InvaildDataMessage getInstance() {
+        return _instance;
+    }
+
+    @Override
+    public String interestKey() {
+        throw new UnsupportedOperationException("不支持的操作");
+    }
+
+}

+ 20 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NeedMoreByteMessage.java

@@ -0,0 +1,20 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+
+public class NeedMoreByteMessage implements IMessage {
+    private static final NeedMoreByteMessage _instance = new NeedMoreByteMessage();
+
+    private NeedMoreByteMessage() {
+    }
+
+    public static NeedMoreByteMessage getInstance() {
+        return _instance;
+    }
+
+    @Override
+    public String interestKey() {
+        throw new UnsupportedOperationException("不支持的操作");
+    }
+
+}

+ 37 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyClientHandler.java

@@ -0,0 +1,37 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import cn.vbdsm.hj212.socket.driver.IRequest;
+import cn.vbdsm.hj212.socket.driver.MessageDriverLoop;
+import io.netty.channel.ChannelDuplexHandler;
+import io.netty.channel.ChannelHandler.Sharable;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Sharable
+@AllArgsConstructor
+@Slf4j
+public class NettyClientHandler extends ChannelDuplexHandler {
+    private MessageDriverLoop loop;
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+        IMessage message = (IMessage) msg;
+        loop.putMessage(new IRequest(message, ctx));
+    }
+
+    @Override
+    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
+        ctx.write(msg, promise);
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
+            throws Exception {
+        log.error("io exception!", cause);
+        ctx.channel().close();
+    }
+
+}

+ 47 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyCodecAdapter.java

@@ -0,0 +1,47 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.ByteToMessageDecoder;
+import io.netty.handler.codec.MessageToByteEncoder;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class NettyCodecAdapter {
+    private final InternalEncoder internalEncoder = new InternalEncoder();
+    @Getter
+    private final InternalDecoder internalDecoder = new InternalDecoder();
+
+    private final ICodec codec;
+
+    public NettyCodecAdapter(ICodec codec) {
+        this.codec = codec;
+    }
+
+    private class InternalEncoder extends MessageToByteEncoder<IMessage> {
+        @Override
+        protected void encode(ChannelHandlerContext ctx, IMessage msg, ByteBuf out) throws Exception {
+            codec.encode(msg, out);
+        }
+    }
+
+    private class InternalDecoder extends ByteToMessageDecoder {
+
+        @Override
+        protected void decode(ChannelHandlerContext ctx, ByteBuf input, List<Object> out) throws Exception {
+            do {
+                input.markReaderIndex();
+                IMessage msg = codec.decode(ctx, input);
+                if (msg == NeedMoreByteMessage.getInstance()) {
+                    input.resetReaderIndex();
+                    break;
+                } else if (msg != InvaildDataMessage.getInstance()) {
+                    out.add(msg);
+                }
+            } while (input.isReadable());
+        }
+    }
+}

+ 62 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyServerHandler.java

@@ -0,0 +1,62 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import cn.vbdsm.hj212.socket.driver.IRequest;
+import cn.vbdsm.hj212.socket.driver.MessageDriverLoop;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelDuplexHandler;
+import io.netty.channel.ChannelHandler.Sharable;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Sharable
+@AllArgsConstructor
+public class NettyServerHandler extends ChannelDuplexHandler {
+    @Getter
+    private final Map<String, Channel> channels = new ConcurrentHashMap<String, Channel>(); // <ip:port, channel>
+
+    private MessageDriverLoop loop;
+
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();
+        log.info("新的客户端连接:" + address.getAddress().getHostAddress() + ":" + address.getPort());
+        channels.put(NettyUtils.toAddressString(address), ctx.channel());
+        super.channelActive(ctx);
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();
+        log.info("客户端失去连接:" + address.getAddress().getHostAddress() + ":" + address.getPort());
+        channels.remove(NettyUtils.toAddressString(address));
+        super.channelActive(ctx);
+    }
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+        IMessage message = (IMessage) msg;
+        loop.putMessage(new IRequest(message, ctx));
+    }
+
+
+    @Override
+    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
+        ctx.write(msg, promise);
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
+            throws Exception {
+        log.error("io exception!", cause);
+        ctx.channel().close();
+    }
+}

+ 9 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/NettyUtils.java

@@ -0,0 +1,9 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import java.net.InetSocketAddress;
+
+public class NettyUtils {
+    public static String toAddressString(InetSocketAddress address) {
+        return address.getAddress().getHostAddress() + ":" + address.getPort();
+    }
+}

+ 135 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/OneByOneClient.java

@@ -0,0 +1,135 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.config.ClientProperties;
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import cn.vbdsm.hj212.socket.driver.OneByOneMessage;
+import cn.vbdsm.hj212.socket.exception.RequestExecuteException;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.concurrent.DefaultThreadFactory;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+public class OneByOneClient {
+    private static final int DEFAULT_IO_THREADS = Math.min(Runtime.getRuntime().availableProcessors() + 1, 32);
+    private static final NioEventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(DEFAULT_IO_THREADS,
+            new DefaultThreadFactory("NettyClientWorker", true));
+    private final ClientProperties properties;
+    private final ICodec codec;
+    @Getter
+    private Bootstrap bootstrap;
+    @Getter
+    private Channel channel;
+
+    public OneByOneClient(ICodec codec, String remoteIp, int remotePort) {
+        this.properties = ClientProperties.defaultProperties(remoteIp, remotePort);
+        this.codec = codec;
+    }
+
+    public OneByOneClient(ClientProperties properties, ICodec codec) {
+        this.properties = properties;
+        this.codec = codec;
+    }
+
+    private boolean run() {
+        bootstrap = new Bootstrap();
+        bootstrap.group(nioEventLoopGroup)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
+                .channel(NioSocketChannel.class);
+
+        if (properties.getTimeout() < 3000) {
+            bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000);
+        } else {
+            bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, properties.getTimeout());
+        }
+
+        OneByOneNettyClientHandler clientHandler = new OneByOneNettyClientHandler();
+
+        bootstrap.handler(new ChannelInitializer<NioSocketChannel>() {
+            @Override
+            protected void initChannel(NioSocketChannel ch) throws Exception {
+                NettyCodecAdapter adapter = new NettyCodecAdapter(codec);
+                ch.pipeline()//.addLast("logging",new LoggingHandler(LogLevel.INFO))//for debug
+                        .addLast("decoder", adapter.getInternalDecoder())
+                        .addLast("encoder", adapter.getInternalEncoder())
+                        .addLast("handler", clientHandler);
+            }
+        });
+
+        // bind
+        ChannelFuture channelFuture = null;
+        if (!"0.0.0.0".equals(properties.getBindIp()) && properties.getBindPort() != -1) {
+            bootstrap.bind(properties.getBindIp(), properties.getBindPort());
+        }
+        channelFuture = bootstrap.connect(properties.getRemoteIp(), properties.getRemotePort());
+        log.info("client starting ....");
+        channelFuture.awaitUninterruptibly(properties.getTimeout(), TimeUnit.MILLISECONDS);
+        if (channelFuture.isSuccess() && channelFuture.cause() == null) {
+            channel = channelFuture.channel();
+            log.info("client has started, remote:" + properties.getRemoteIp() + "," + "port:" + properties.getRemotePort());
+            return true;
+        }
+        channelFuture.cancel(true);
+        if (channelFuture.channel() != null) {
+            channelFuture.channel().close().syncUninterruptibly();
+        }
+        return false;
+    }
+
+    public boolean test() {
+        try {
+            boolean flag = run();
+            return flag;
+        } catch (Exception ex) {
+            log.error("connect error !", ex);
+            return false;
+        } finally {
+            stop();
+        }
+    }
+
+    public IMessage sendMessage(IMessage request) {
+        try {
+            if (run()) {
+                if (channel != null && channel.isActive()) {
+                    ChannelFuture channelFuture = channel.writeAndFlush(request).syncUninterruptibly();
+                    if (channelFuture.cause() == null) {
+                        OneByOneMessage response = new OneByOneMessage();
+                        channel.attr(OneByOneNettyClientHandler.key).set(response);
+                        response.getLatch().await(properties.getReadoutTimeout(), TimeUnit.MILLISECONDS);
+                        if (response.getResponse() == null) {
+                            throw new RequestExecuteException("请求超时");
+                        }
+                        return response.getResponse();
+                    }
+                }
+            }
+            throw new RequestExecuteException("无法打开连接");
+        } catch (Exception ex) {
+            log.error("send request error", ex);
+            if (ex instanceof RequestExecuteException) {
+                throw (RequestExecuteException) ex;
+            }
+            throw new RequestExecuteException("request error", ex);
+        } finally {
+            stop();
+        }
+    }
+
+    private void stop() {
+        if (channel != null && channel.isActive()) {
+            channel.close().awaitUninterruptibly();
+        }
+    }
+}

+ 32 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/java/cn/vbdsm/hj212/socket/transport/OneByOneNettyClientHandler.java

@@ -0,0 +1,32 @@
+package cn.vbdsm.hj212.socket.transport;
+
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import cn.vbdsm.hj212.socket.driver.OneByOneMessage;
+import io.netty.channel.ChannelDuplexHandler;
+import io.netty.channel.ChannelHandler.Sharable;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
+import io.netty.util.AttributeKey;
+import lombok.AllArgsConstructor;
+
+@Sharable
+@AllArgsConstructor
+public class OneByOneNettyClientHandler extends ChannelDuplexHandler {
+    public static final AttributeKey<OneByOneMessage> key = AttributeKey.valueOf("oneByOne");
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+        IMessage message = (IMessage) msg;
+        OneByOneMessage oneByOneMessage = ctx.channel().attr(key).getAndSet(null);
+        if (oneByOneMessage != null) {
+            oneByOneMessage.setResponse(message);
+            oneByOneMessage.getLatch().countDown();
+        }
+    }
+
+    @Override
+    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
+        ctx.write(msg, promise);
+    }
+
+}

+ 2 - 0
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-socket/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+cn.vbdsm.hj212.socket.EppSocketServerAutoConfiguration

+ 3 - 2
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-rpc/pom.xml

@@ -16,8 +16,9 @@
     <artifactId>vbdsm-rpc</artifactId>
     <dependencies>
         <dependency>
-            <groupId>com.tg.epp.hj212</groupId>
-            <artifactId>epp-hj212-socket</artifactId>
+            <groupId>cn.vbdsm</groupId>
+            <artifactId>vbdsm-hj212-socket</artifactId>
+            <version>2.0.0</version>
         </dependency>
         <dependency>
             <groupId>${project.parent.groupId}</groupId>

+ 4 - 4
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-rpc/src/main/java/cn/vbdsm/rpc/NXCodec.java

@@ -1,11 +1,11 @@
 package cn.vbdsm.rpc;
 
+import cn.vbdsm.hj212.socket.driver.IMessage;
+import cn.vbdsm.hj212.socket.transport.ICodec;
+import cn.vbdsm.hj212.socket.transport.InvaildDataMessage;
+import cn.vbdsm.hj212.socket.transport.NeedMoreByteMessage;
 import cn.vbdsm.utils.ByteUtil;
 import cn.vbdsm.utils.Constants;
-import com.tg.epp.hj212.socket.driver.IMessage;
-import com.tg.epp.hj212.socket.transport.ICodec;
-import com.tg.epp.hj212.socket.transport.InvaildDataMessage;
-import com.tg.epp.hj212.socket.transport.NeedMoreByteMessage;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.util.CharsetUtil;

+ 1 - 1
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-rpc/src/main/java/cn/vbdsm/rpc/RpcRemoterStruct.java

@@ -1,8 +1,8 @@
 package cn.vbdsm.rpc;
 
 
+import cn.vbdsm.hj212.socket.driver.IMessage;
 import cn.vbdsm.utils.Constants;
-import com.tg.epp.hj212.socket.driver.IMessage;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;

+ 1 - 1
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-server/src/main/java/cn/vbdsm/server/ServerApplication.java

@@ -1,7 +1,7 @@
 package cn.vbdsm.server;
 
 
-import com.tg.epp.hj212.socket.transport.EppSocketServer;
+import cn.vbdsm.hj212.socket.transport.EppSocketServer;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;

+ 1 - 1
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-server/src/main/java/cn/vbdsm/server/config/SocketServerConfig.java

@@ -1,7 +1,7 @@
 package cn.vbdsm.server.config;
 
+import cn.vbdsm.hj212.socket.transport.ICodec;
 import cn.vbdsm.rpc.NXCodec;
-import com.tg.epp.hj212.socket.transport.ICodec;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 

+ 2 - 3
VB_DSM_V2.0/vbdsm-data-upload/vbdsm-server/src/main/java/cn/vbdsm/server/executor/ReaTimeExector.java

@@ -1,13 +1,12 @@
 package cn.vbdsm.server.executor;
 
+import cn.vbdsm.hj212.socket.driver.IExecutor;
+import cn.vbdsm.hj212.socket.driver.IRequest;
 import cn.vbdsm.modle.*;
 import cn.vbdsm.rpc.DataUploadRequest;
 import cn.vbdsm.rpc.RpcRemoterStruct;
 import cn.vbdsm.server.biz.IOnlineDataBiz;
 import com.alibaba.fastjson.JSONObject;
-import com.tg.epp.hj212.socket.driver.IExecutor;
-import com.tg.epp.hj212.socket.driver.IRequest;
-import com.tg.nx.modle.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;