diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
index 1bb6664..4f6f591 100644
--- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
@@ -53,7 +53,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
(softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") +
(simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") +
(rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") +
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
index 1bb6664..4f6f591 100644
--- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
@@ -53,7 +53,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
(softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") +
(simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") +
(rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") +
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
index 199fa25..e6e541c 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -16,19 +17,9 @@
@Slf4j
public class DataFrameMHK extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemMHK dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -54,16 +45,16 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemMHK dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(String.valueOf(dataItem.getGasval()));
- data.setVbat(String.valueOf(dataItem.getVbat()));
- data.setSin(String.valueOf(dataItem.getSin()));
- data.setRsrp(String.valueOf(dataItem.getRsrp()));
- data.setSinr(String.valueOf(dataItem.getSinr()));
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(String.valueOf(((DataItemMHK) dataItem).getGasval()));
+ data.setVbat(String.valueOf(((DataItemMHK) dataItem).getVbat()));
+ data.setSin(String.valueOf(((DataItemMHK) dataItem).getSin()));
+ data.setRsrp(String.valueOf(((DataItemMHK) dataItem).getRsrp()));
+ data.setSinr(String.valueOf(((DataItemMHK) dataItem).getSinr()));
+ data.setUptime(LocalDateTime.parse(((DataItemMHK) dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
index 1bb6664..4f6f591 100644
--- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
@@ -53,7 +53,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
(softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") +
(simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") +
(rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") +
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
index 199fa25..e6e541c 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -16,19 +17,9 @@
@Slf4j
public class DataFrameMHK extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemMHK dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -54,16 +45,16 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemMHK dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(String.valueOf(dataItem.getGasval()));
- data.setVbat(String.valueOf(dataItem.getVbat()));
- data.setSin(String.valueOf(dataItem.getSin()));
- data.setRsrp(String.valueOf(dataItem.getRsrp()));
- data.setSinr(String.valueOf(dataItem.getSinr()));
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(String.valueOf(((DataItemMHK) dataItem).getGasval()));
+ data.setVbat(String.valueOf(((DataItemMHK) dataItem).getVbat()));
+ data.setSin(String.valueOf(((DataItemMHK) dataItem).getSin()));
+ data.setRsrp(String.valueOf(((DataItemMHK) dataItem).getRsrp()));
+ data.setSinr(String.valueOf(((DataItemMHK) dataItem).getSinr()));
+ data.setUptime(LocalDateTime.parse(((DataItemMHK) dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
index a6e25e2..0aa9bab 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
@@ -1,9 +1,10 @@
package com.casic.tube.frame.mhk;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemMHK {
+public class DataItemMHK extends DataItem {
double gasval;
int vbat;
String batsta;
@@ -14,9 +15,8 @@
@Override
public String toString() {
- return "气体浓度值: " + gasval + "; " +
- "电池电压值: " + vbat + " 毫伏; " +
- "电池状态: " + batsta + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gasval + "%LEL;" +
+ "电池电压值:" + vbat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
index 1bb6664..4f6f591 100644
--- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
@@ -53,7 +53,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
(softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") +
(simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") +
(rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") +
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
index 199fa25..e6e541c 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -16,19 +17,9 @@
@Slf4j
public class DataFrameMHK extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemMHK dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -54,16 +45,16 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemMHK dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(String.valueOf(dataItem.getGasval()));
- data.setVbat(String.valueOf(dataItem.getVbat()));
- data.setSin(String.valueOf(dataItem.getSin()));
- data.setRsrp(String.valueOf(dataItem.getRsrp()));
- data.setSinr(String.valueOf(dataItem.getSinr()));
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(String.valueOf(((DataItemMHK) dataItem).getGasval()));
+ data.setVbat(String.valueOf(((DataItemMHK) dataItem).getVbat()));
+ data.setSin(String.valueOf(((DataItemMHK) dataItem).getSin()));
+ data.setRsrp(String.valueOf(((DataItemMHK) dataItem).getRsrp()));
+ data.setSinr(String.valueOf(((DataItemMHK) dataItem).getSinr()));
+ data.setUptime(LocalDateTime.parse(((DataItemMHK) dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
index a6e25e2..0aa9bab 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
@@ -1,9 +1,10 @@
package com.casic.tube.frame.mhk;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemMHK {
+public class DataItemMHK extends DataItem {
double gasval;
int vbat;
String batsta;
@@ -14,9 +15,8 @@
@Override
public String toString() {
- return "气体浓度值: " + gasval + "; " +
- "电池电压值: " + vbat + " 毫伏; " +
- "电池状态: " + batsta + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gasval + "%LEL;" +
+ "电池电压值:" + vbat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
index 793ffc0..9aea120 100644
--- a/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +12,11 @@
@Data
@Slf4j
-public class EventFrameMHK extends CasicFrame {
-
- List eventItemList;
+public class EventFrameMHK extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemMHK eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
index 1bb6664..4f6f591 100644
--- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
@@ -53,7 +53,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
(softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") +
(simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") +
(rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") +
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
index 199fa25..e6e541c 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -16,19 +17,9 @@
@Slf4j
public class DataFrameMHK extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemMHK dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -54,16 +45,16 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemMHK dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(String.valueOf(dataItem.getGasval()));
- data.setVbat(String.valueOf(dataItem.getVbat()));
- data.setSin(String.valueOf(dataItem.getSin()));
- data.setRsrp(String.valueOf(dataItem.getRsrp()));
- data.setSinr(String.valueOf(dataItem.getSinr()));
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(String.valueOf(((DataItemMHK) dataItem).getGasval()));
+ data.setVbat(String.valueOf(((DataItemMHK) dataItem).getVbat()));
+ data.setSin(String.valueOf(((DataItemMHK) dataItem).getSin()));
+ data.setRsrp(String.valueOf(((DataItemMHK) dataItem).getRsrp()));
+ data.setSinr(String.valueOf(((DataItemMHK) dataItem).getSinr()));
+ data.setUptime(LocalDateTime.parse(((DataItemMHK) dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
index a6e25e2..0aa9bab 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
@@ -1,9 +1,10 @@
package com.casic.tube.frame.mhk;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemMHK {
+public class DataItemMHK extends DataItem {
double gasval;
int vbat;
String batsta;
@@ -14,9 +15,8 @@
@Override
public String toString() {
- return "气体浓度值: " + gasval + "; " +
- "电池电压值: " + vbat + " 毫伏; " +
- "电池状态: " + batsta + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gasval + "%LEL;" +
+ "电池电压值:" + vbat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
index 793ffc0..9aea120 100644
--- a/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +12,11 @@
@Data
@Slf4j
-public class EventFrameMHK extends CasicFrame {
-
- List eventItemList;
+public class EventFrameMHK extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemMHK eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java b/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java
index de2751f..8f6a536 100644
--- a/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java
@@ -1,9 +1,10 @@
package com.casic.tube.frame.mhk;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemMHK {
+public class EventItemMHK extends EventItem {
String type;
String value;
double lon;
@@ -12,9 +13,9 @@
@Override
public String toString() {
- return "报警类型: " + type + "; " +
- "报警数值: " + value + "; " +
- "报警位置: " + lon + ", " + lat + "; " +
- "报警时间: " + time;
+ return "报警类型:" + type + ";" +
+ "报警数值:" + value + ";" +
+ "报警位置:" + lon + ", " + lat + ";" +
+ "报警时间:" + time;
}
}
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 0.0.0
+
+
+
\ No newline at end of file
diff --git a/lib/ctg-ag-sdk-core-2.8.0.jar b/lib/ctg-ag-sdk-core-2.8.0.jar
new file mode 100644
index 0000000..7c67925
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.jar
Binary files differ
diff --git a/lib/ctg-ag-sdk-core-2.8.0.pom.xml b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
new file mode 100644
index 0000000..ae36b03
--- /dev/null
+++ b/lib/ctg-ag-sdk-core-2.8.0.pom.xml
@@ -0,0 +1 @@
+No available sdk core pom.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 279de1c..d7aa232 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
mysql
mysql-connector-java
- 8.0.16
+ 8.0.28
compile
@@ -58,15 +58,9 @@
- org.postgresql
- postgresql
- 42.2.19
-
-
-
org.apache.httpcomponents
httpclient
- 4.5.12
+ 4.5.13
@@ -75,12 +69,6 @@
1.18.20
-
- io.netty
- netty-all
- 4.1.100.Final
-
-
com.alibaba
@@ -94,6 +82,29 @@
2.0.12
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+
+
+ com.ctg.ag
+ ctg-ag-sdk-core
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ctg-ag-sdk-core-2.8.0.jar
+
+
+
+ com.ctg.ag
+ ag-sdk-biz
+ 2.8.0-SNAPSHOT
+ system
+ ${pom.basedir}\lib\ag-sdk-biz.jar
+
+
@@ -107,6 +118,7 @@
com.casic.CasicApplication
exec
+ true
diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java
index 02e704b..43d34a2 100644
--- a/src/main/java/com/casic/common/CasicFrame.java
+++ b/src/main/java/com/casic/common/CasicFrame.java
@@ -8,10 +8,10 @@
final String HEADER = "AA";
final String TAIL = "FF";
+ final String version = "10";
- String version;
int length;
- String deviceId;
+ String deviceCode;
String deviceType;
String messageType;
String sequence;
diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
index 123062e..899c992 100644
--- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java
+++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java
@@ -1,5 +1,6 @@
package com.casic.common;
+import com.casic.tube.frame.ConfigResponseFrame;
import com.casic.tube.frame.HeartFrame;
import com.casic.tube.frame.brs.DataFrameBRS;
import com.casic.tube.frame.brs.EventFrameBRS;
@@ -25,6 +26,9 @@
case "02":
return buildDataFrame(manufacturerCode);
+ case "03":
+ return new ConfigResponseFrame();
+
case "05":
return new IMEIFrame();
diff --git a/src/main/java/com/casic/common/CasicProtocol.java b/src/main/java/com/casic/common/CasicProtocol.java
index 1b2c6fd..3d59da5 100644
--- a/src/main/java/com/casic/common/CasicProtocol.java
+++ b/src/main/java/com/casic/common/CasicProtocol.java
@@ -4,19 +4,21 @@
public interface CasicProtocol {
- public boolean checkFrame(String frame);
+ boolean checkFrame(String frame);
- public String getDeviceId(String frame);
- public String getManufacturerCode(String frame);
+ String getDeviceId(String frame);
- public String getDeviceType(String frame);
+ String getManufacturerCode(String frame);
- public String getMessageType(String frame);
+ String getDeviceType(String frame);
- public String getMessageBody(String frame);
+ String getMessageType(String frame);
- public JSONObject parseMessageBody(String messageBody);
+ String getMessageBody(String frame);
- public String getUptime(String frame);
+ JSONObject parseMessageBody(String messageBody);
+ String getUptime(String frame);
+
+ String buildFrameStr(CasicFrame frame);
}
diff --git a/src/main/java/com/casic/service/MyChannelHandlerPool.java b/src/main/java/com/casic/service/MyChannelHandlerPool.java
deleted file mode 100644
index 9ab8fae..0000000
--- a/src/main/java/com/casic/service/MyChannelHandlerPool.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.casic.service;
-
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-/**
- * MyChannelHandlerPool
- * 通道组池,管理所有websocket连接
- * @author zhengkai.blog.csdn.net
- * @date 2019-06-12
- */
-public class MyChannelHandlerPool {
-
- public MyChannelHandlerPool(){}
-
- public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/MyWebSocketHandler.java b/src/main/java/com/casic/service/MyWebSocketHandler.java
deleted file mode 100644
index e4d174e..0000000
--- a/src/main/java/com/casic/service/MyWebSocketHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.casic.service;
-
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MyWebSocketHandler extends SimpleChannelInboundHandler {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端建立连接,通道开启!");
-
- //添加到channelGroup通道组
- MyChannelHandlerPool.channelGroup.add(ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("与客户端断开连接,通道关闭!");
- //添加到channelGroup 通道组
- MyChannelHandlerPool.channelGroup.remove(ctx.channel());
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //首次连接是FullHttpRequest,处理参数 by zhengkai.blog.csdn.net
- if (null != msg && msg instanceof FullHttpRequest) {
- FullHttpRequest request = (FullHttpRequest) msg;
- String uri = request.uri();
- Map paramMap=getUrlParams(uri);
- System.out.println("接收到的参数是:"+ JSON.toJSONString(paramMap));
- //如果url包含参数,需要处理
- if(uri.contains("?")){
- String newUri=uri.substring(0,uri.indexOf("?"));
- System.out.println(newUri);
- request.setUri(newUri);
- }
-
- }else if(msg instanceof TextWebSocketFrame){
- //正常的TEXT消息类型
- TextWebSocketFrame frame=(TextWebSocketFrame)msg;
- System.out.println("客户端收到服务器数据:" +frame.text());
- sendAllMessage(frame.text());
- }
- super.channelRead(ctx, msg);
- }
-
- @Override
- protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
-
- }
-
- private void sendAllMessage(String message){
- //收到信息后,群发给所有channel
- MyChannelHandlerPool.channelGroup.writeAndFlush( new TextWebSocketFrame(message));
- }
-
- private static Map getUrlParams(String url){
- Map map = new HashMap<>();
- url = url.replace("?",";");
- if (!url.contains(";")){
- return map;
- }
- if (url.split(";").length > 0){
- String[] arr = url.split(";")[1].split("&");
- for (String s : arr){
- String key = s.split("=")[0];
- String value = s.split("=")[1];
- map.put(key,value);
- }
- return map;
-
- }else{
- return map;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/service/NettyServer.java b/src/main/java/com/casic/service/NettyServer.java
deleted file mode 100644
index aa56093..0000000
--- a/src/main/java/com/casic/service/NettyServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.casic.service;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.stream.ChunkedWriteHandler;
-
-/**
- * NettyServer Netty服务器配置
- */
-public class NettyServer {
- private final int port;
-
- public NettyServer(int port) {
- this.port = port;
- }
-
- public void start() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
-
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.option(ChannelOption.SO_BACKLOG, 1024);
- sb.group(group, bossGroup) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作
-
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("收到新连接");
- //websocket协议本身是基于http协议的,所以这边也要使用http解编码器
- ch.pipeline().addLast(new HttpServerCodec());
- //以块的方式来写的处理器
- ch.pipeline().addLast(new ChunkedWriteHandler());
- ch.pipeline().addLast(new HttpObjectAggregator(8192));
- ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
- ch.pipeline().addLast(new MyWebSocketHandler());
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(NettyServer.class + " 启动正在监听: " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- bossGroup.shutdownGracefully().sync();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java
new file mode 100644
index 0000000..61486c5
--- /dev/null
+++ b/src/main/java/com/casic/tube/controller/TubeDataController.java
@@ -0,0 +1,93 @@
+package com.casic.tube.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.common.CasicFrame;
+import com.casic.tube.frame.ConfigFrame;
+import com.casic.tube.service.ITubeDataService;
+import com.casic.util.aep.AepCommandSend;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Base64;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class TubeDataController {
+
+ @Resource
+ private ITubeDataService tubeDataService;
+
+ @RequestMapping("/tube/data/recv")
+ public Object dataRecv(@RequestBody Map map) {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
+ if (recvObj.containsKey("payload")) {
+ JSONObject payload = recvObj.getJSONObject("payload");
+ String value = payload.getString("APPdata");
+
+ if (value.isEmpty()) {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ } else {
+ byte[] baseBytes = Base64.getDecoder().decode(value);
+ String frameStr = new String(baseBytes);
+
+ // 根据协议进行解析
+ CasicFrame frame = tubeDataService.dataParse(frameStr);
+
+ // 存库
+ tubeDataService.afterAction(frame);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ }
+ } else {
+ retObj.put("resp", "payload not matched");
+ retObj.put("code", 200);
+ retObj.put("success", false);
+ }
+
+ return retObj;
+ }
+
+ @RequestMapping("/tube/config/send")
+ public Object configSend(@RequestBody Map map) throws Exception {
+ JSONObject retObj = new JSONObject();
+ log.info(JSONObject.toJSONString(map));
+
+ CasicFrame cmdFrame = new ConfigFrame();
+ cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵)
+ cmdFrame.setDeviceCode((String) map.get("devCode"));
+ cmdFrame.setSequence("01");
+ cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻
+
+ JSONObject messageBody = new JSONObject();
+ messageBody.put("datas", map.get("cmdList"));
+ cmdFrame.setMessageBody(messageBody);
+
+ String frameStr = tubeDataService.doBuildCommand(cmdFrame);
+
+ // TODO-LIST
+ // 这三个参数根据设备编号从数据库中取
+ String deviceId = (String) map.get("deviceId");
+ String productId = (String) map.get("productId");
+ String masterApiKey = (String) map.get("masterApiKey");
+
+ AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId, masterApiKey);
+ int code = aepCommandSend.handleAndReply(frameStr);
+
+ retObj.put("code", 200);
+ retObj.put("success", true);
+ retObj.put("AEPRetCode", code);
+ return retObj;
+ }
+}
diff --git a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java b/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
deleted file mode 100644
index 07cc972..0000000
--- a/src/main/java/com/casic/tube/controller/TubeDataRecvController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.casic.tube.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.casic.common.CasicFrame;
-import com.casic.dao.service.IDataTubeOtherService;
-import com.casic.tube.service.ITubeDataService;
-import com.casic.tube.service.TubeDataServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Base64;
-import java.util.Map;
-
-@Slf4j
-@RestController
-public class TubeDataRecvController {
-
- @Resource
- private ITubeDataService tubeDataService;
-
- @RequestMapping("/tube/data/recv")
- public String dataRecv(@RequestBody Map map) {
- JSONObject retObj = new JSONObject();
- log.info(JSONObject.toJSONString(map));
-
- JSONObject recvObj = (JSONObject) JSONObject.toJSON(map);
- if (recvObj.containsKey("payload")) {
- JSONObject payload = recvObj.getJSONObject("payload");
- String value = "";
- if (payload.containsKey("APPdata")) {
- value = payload.getString("APPdata");
- } else if (payload.containsKey("serviceData")) {
- JSONObject serviceData = payload.getJSONObject("serviceData");
- value = serviceData.getString("Value");
- }
-
- log.info(value);
-
- if (value.isEmpty()) {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- } else {
- byte[] baseBytes = Base64.getDecoder().decode(value);
- String frameStr = new String(baseBytes);
-
- // 根据协议进行解析
- CasicFrame frame = tubeDataService.dataParse(frameStr);
-
- // 存库
- tubeDataService.afterAction(frame);
-
- retObj.put("code", 200);
- retObj.put("success", true);
- }
- } else {
- retObj.put("resp", "payload not matched");
- retObj.put("code", 200);
- retObj.put("success", false);
- }
-
- return retObj.toJSONString();
- }
-}
diff --git a/src/main/java/com/casic/tube/frame/ConfigFrame.java b/src/main/java/com/casic/tube/frame/ConfigFrame.java
new file mode 100644
index 0000000..883dad6
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigFrame.java
@@ -0,0 +1,12 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigFrame extends CasicFrame {
+
+ public ConfigFrame() {
+ setSequence("01"); // 默认序号
+ setControl("1"); // 默认为不需要分包
+ setMessageType("52"); // 消息大类 52 = SetRequest
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
new file mode 100644
index 0000000..a419145
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/ConfigResponseFrame.java
@@ -0,0 +1,20 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+public class ConfigResponseFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "03";
+ final String MESSAGE_TYPE_STRING = "SetResponse";
+ final String MESSAGE_TYPE_DESCRIPTION = "配置参数响应";
+
+ @Override
+ public String toString() {
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "指令序号" + getSequence() + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/DataFrame.java b/src/main/java/com/casic/tube/frame/DataFrame.java
index 5414329..97e07b8 100644
--- a/src/main/java/com/casic/tube/frame/DataFrame.java
+++ b/src/main/java/com/casic/tube/frame/DataFrame.java
@@ -7,7 +7,30 @@
public class DataFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "02";
+ final String MESSAGE_TYPE_STRING = "Data/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "数据消息/管盯";
+
+ public List dataItemList;
+
public List toDataModelList() {
return null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append(";");
+ builder.append("上报时间:").append(getUptime()).append(";");
+ for (DataItem dataItem : dataItemList) {
+ builder.append("[");
+ builder.append(dataItem);
+ builder.append("],");
+ }
+ builder.deleteCharAt(builder.length() - 1);
+ builder.append("}");
+ return builder.toString();
+ }
}
diff --git a/src/main/java/com/casic/tube/frame/DataItem.java b/src/main/java/com/casic/tube/frame/DataItem.java
new file mode 100644
index 0000000..4e9aceb
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/DataItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class DataItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/EventFrame.java b/src/main/java/com/casic/tube/frame/EventFrame.java
new file mode 100644
index 0000000..ea800b4
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventFrame.java
@@ -0,0 +1,30 @@
+package com.casic.tube.frame;
+
+import com.casic.common.CasicFrame;
+
+import java.util.List;
+
+public class EventFrame extends CasicFrame {
+
+ final String MESSAGE_TYPE_IDENTIFY = "01";
+ final String MESSAGE_TYPE_STRING = "Event/Tube";
+ final String MESSAGE_TYPE_DESCRIPTION = "事件消息/管盯";
+
+ public List eventItemList;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append(MESSAGE_TYPE_DESCRIPTION).append(":").append(MESSAGE_TYPE_STRING).append(";");
+ builder.append("设备编号:").append(getDeviceCode()).append("; ");
+ builder.append("上报时间:").append(getUptime()).append("; ");
+ for (EventItem eventItem : eventItemList) {
+ builder.append("[");
+ builder.append(eventItem);
+ builder.append("],");
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+}
diff --git a/src/main/java/com/casic/tube/frame/EventItem.java b/src/main/java/com/casic/tube/frame/EventItem.java
new file mode 100644
index 0000000..a1245bf
--- /dev/null
+++ b/src/main/java/com/casic/tube/frame/EventItem.java
@@ -0,0 +1,4 @@
+package com.casic.tube.frame;
+
+public class EventItem {
+}
diff --git a/src/main/java/com/casic/tube/frame/HeartFrame.java b/src/main/java/com/casic/tube/frame/HeartFrame.java
index fbeb2d7..af7e7a6 100644
--- a/src/main/java/com/casic/tube/frame/HeartFrame.java
+++ b/src/main/java/com/casic/tube/frame/HeartFrame.java
@@ -5,12 +5,18 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class HeartFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "00";
+ final String MESSAGE_TYPE_STRING = "OnlineRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "心跳消息";
+
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "}";
}
}
diff --git a/src/main/java/com/casic/tube/frame/IMEIFrame.java b/src/main/java/com/casic/tube/frame/IMEIFrame.java
index cf951c2..9420620 100644
--- a/src/main/java/com/casic/tube/frame/IMEIFrame.java
+++ b/src/main/java/com/casic/tube/frame/IMEIFrame.java
@@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
@Data
-@Slf4j
public class IMEIFrame extends CasicFrame {
+ final String MESSAGE_TYPE_IDENTIFY = "05";
+ final String MESSAGE_TYPE_STRING = "StartupRequest";
+ final String MESSAGE_TYPE_DESCRIPTION = "开机上报消息";
+
String imei;
String iccid;
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
- "IMEI: " + imei + "; " +
- "ICCID: " + iccid + "; " +
- "上报时间: " + getUptime();
+ return "{" +
+ MESSAGE_TYPE_DESCRIPTION + ":" + MESSAGE_TYPE_STRING + ";" +
+ "设备编号:" + getDeviceCode() + ";" +
+ "上报时间:" + getUptime() + ";" +
+ "IMEI:" + imei + ";" +
+ "ICCID:" + iccid +
+ "}";
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
index 110f11b..50e8a2b 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java
@@ -4,7 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
-import com.casic.tube.frame.mhk.DataItemMHK;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -17,19 +17,9 @@
@Slf4j
public class DataFrameBRS extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemBRS dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -55,13 +45,13 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemBRS dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(dataItem.getGas());
- data.setVbat(dataItem.getBat());
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(((DataItemBRS)dataItem).getGas());
+ data.setVbat(((DataItemBRS)dataItem).getBat());
+ data.setUptime(LocalDateTime.parse(((DataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
index 1ed89af..8d09b10 100644
--- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java
@@ -1,22 +1,22 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemBRS {
+public class DataItemBRS extends DataItem {
String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强
String temp; // 温度值
String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常
String bat; // 电池电压 单位mv
- String gas; // 浓度,单位%VOL
+ String gas; // 浓度,单位%LEL
String devStat; // 设备状态,0表示正常,其他值表示异常
String time; // 采集时间
@Override
public String toString() {
- return "气体浓度值: " + gas + " %VOL; " +
- "电池电压值: " + bat + " 毫伏; " +
- "设备状态: " + devStat + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gas + "%LEL;" +
+ "电池电压值:" + bat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
index fc6c14b..9026b4c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventFrameBRS.java
@@ -3,6 +3,8 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +13,11 @@
@Data
@Slf4j
-public class EventFrameBRS extends CasicFrame {
-
- List eventItemList;
+public class EventFrameBRS extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemBRS eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]; ");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
index fb712cb..6c8146c 100644
--- a/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/EventItemBRS.java
@@ -1,17 +1,18 @@
package com.casic.tube.frame.brs;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemBRS {
+public class EventItemBRS extends EventItem {
String eventType;
String value;
String time;
@Override
public String toString() {
- return "报警类型: " + eventType + "; " +
- "报警数值: " + value + "; " +
- "报警时间: " + time;
+ return "报警类型:" + eventType + ";" +
+ "报警数值:" + value + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
index 1bb6664..4f6f591 100644
--- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
+++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java
@@ -53,7 +53,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
(softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") +
(simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") +
(rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") +
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
index 199fa25..e6e541c 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataFrameMHK.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.casic.dao.model.DataTubeOther;
import com.casic.tube.frame.DataFrame;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -16,19 +17,9 @@
@Slf4j
public class DataFrameMHK extends DataFrame {
- List dataItemList;
-
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (DataItemMHK dataItem : dataItemList) {
- builder.append("[");
- builder.append(dataItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
- return builder.toString();
+ return super.toString();
}
@Override
@@ -54,16 +45,16 @@
@Override
public List toDataModelList() {
List dataList = new ArrayList<>();
- for (DataItemMHK dataItem : dataItemList) {
+ for (DataItem dataItem : dataItemList) {
DataTubeOther data = new DataTubeOther();
- data.setDevcode(getDeviceId());
- data.setGasval(String.valueOf(dataItem.getGasval()));
- data.setVbat(String.valueOf(dataItem.getVbat()));
- data.setSin(String.valueOf(dataItem.getSin()));
- data.setRsrp(String.valueOf(dataItem.getRsrp()));
- data.setSinr(String.valueOf(dataItem.getSinr()));
- data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
+ data.setDevcode(getDeviceCode());
+ data.setGasval(String.valueOf(((DataItemMHK) dataItem).getGasval()));
+ data.setVbat(String.valueOf(((DataItemMHK) dataItem).getVbat()));
+ data.setSin(String.valueOf(((DataItemMHK) dataItem).getSin()));
+ data.setRsrp(String.valueOf(((DataItemMHK) dataItem).getRsrp()));
+ data.setSinr(String.valueOf(((DataItemMHK) dataItem).getSinr()));
+ data.setUptime(LocalDateTime.parse(((DataItemMHK) dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间
data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间
dataList.add(data);
diff --git a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
index a6e25e2..0aa9bab 100644
--- a/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/DataItemMHK.java
@@ -1,9 +1,10 @@
package com.casic.tube.frame.mhk;
+import com.casic.tube.frame.DataItem;
import lombok.Data;
@Data
-public class DataItemMHK {
+public class DataItemMHK extends DataItem {
double gasval;
int vbat;
String batsta;
@@ -14,9 +15,8 @@
@Override
public String toString() {
- return "气体浓度值: " + gasval + "; " +
- "电池电压值: " + vbat + " 毫伏; " +
- "电池状态: " + batsta + "; " +
- "采样时间: " + time;
+ return "气体浓度值:" + gasval + "%LEL;" +
+ "电池电压值:" + vbat + "mv;" +
+ "采样时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
index 793ffc0..9aea120 100644
--- a/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/EventFrameMHK.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
+import com.casic.tube.frame.EventFrame;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -11,22 +12,11 @@
@Data
@Slf4j
-public class EventFrameMHK extends CasicFrame {
-
- List eventItemList;
+public class EventFrameMHK extends EventFrame {
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("设备编号: ").append(getDeviceId()).append("; ");
- for (EventItemMHK eventItem : eventItemList) {
- builder.append("[");
- builder.append(eventItem);
- builder.append("]");
- }
- builder.append("上报时间: ").append(getUptime());
-
- return builder.toString();
+ return super.toString();
}
@Override
diff --git a/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java b/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java
index de2751f..8f6a536 100644
--- a/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/EventItemMHK.java
@@ -1,9 +1,10 @@
package com.casic.tube.frame.mhk;
+import com.casic.tube.frame.EventItem;
import lombok.Data;
@Data
-public class EventItemMHK {
+public class EventItemMHK extends EventItem {
String type;
String value;
double lon;
@@ -12,9 +13,9 @@
@Override
public String toString() {
- return "报警类型: " + type + "; " +
- "报警数值: " + value + "; " +
- "报警位置: " + lon + ", " + lat + "; " +
- "报警时间: " + time;
+ return "报警类型:" + type + ";" +
+ "报警数值:" + value + ";" +
+ "报警位置:" + lon + ", " + lat + ";" +
+ "报警时间:" + time;
}
}
diff --git a/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java
index ae463d7..b8ac79c 100644
--- a/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java
+++ b/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java
@@ -22,7 +22,7 @@
@Override
public String toString() {
- return "设备编号: " + getDeviceId() + "; " +
+ return "设备编号: " + getDeviceCode() + "; " +
"设备采样周期: " + intv + " 分钟; " +
"设备上传周期: " + up + " 分钟; " +
"设备报警阈值: " + al + ", " + ah + "; " +
diff --git a/lib/ag-sdk-biz.jar b/lib/ag-sdk-biz.jar
new file mode 100644
index 0000000..dcc3422
--- /dev/null
+++ b/lib/ag-sdk-biz.jar
Binary files differ
diff --git a/lib/ag-sdk-biz.pom.xml b/lib/ag-sdk-biz.pom.xml
new file mode 100644
index 0000000..1e263af
--- /dev/null
+++ b/lib/ag-sdk-biz.pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ com.ctg.ag
+ ag-sdk-biz-110107.tar.gz
+ 20240131.111227-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+