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 + + + 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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + 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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + 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/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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(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/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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(CasicFrame frame); } diff --git a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java index 25a9d12..46d049d 100644 --- a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java @@ -42,7 +42,7 @@ CasicFrame tubeFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode); if (tubeFrame != null) { - tubeFrame.setDeviceId(deviceId); + tubeFrame.setDeviceCode(deviceId); tubeFrame.setUptime(uptime); tubeFrame.setMessageType(messageType); @@ -52,7 +52,7 @@ tubeFrame.parseMessageBody(); } - log.info(tubeFrame.toString()); + log.info("收到设备消息:{}", tubeFrame); return tubeFrame; } } else { @@ -63,10 +63,15 @@ } @Override + public String doBuildCommand(CasicFrame cmd) { + return tubeProtocol.buildFrameStr(cmd); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) { - String devCode = frame.getDeviceId(); + String devCode = frame.getDeviceCode(); DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode); String wellCode = ""; if (devWellView != null) { 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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(CasicFrame frame); } diff --git a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java index 25a9d12..46d049d 100644 --- a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java @@ -42,7 +42,7 @@ CasicFrame tubeFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode); if (tubeFrame != null) { - tubeFrame.setDeviceId(deviceId); + tubeFrame.setDeviceCode(deviceId); tubeFrame.setUptime(uptime); tubeFrame.setMessageType(messageType); @@ -52,7 +52,7 @@ tubeFrame.parseMessageBody(); } - log.info(tubeFrame.toString()); + log.info("收到设备消息:{}", tubeFrame); return tubeFrame; } } else { @@ -63,10 +63,15 @@ } @Override + public String doBuildCommand(CasicFrame cmd) { + return tubeProtocol.buildFrameStr(cmd); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) { - String devCode = frame.getDeviceId(); + String devCode = frame.getDeviceCode(); DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode); String wellCode = ""; if (devWellView != null) { diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..5c9bf4a --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(CasicFrame frame); } diff --git a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java index 25a9d12..46d049d 100644 --- a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java @@ -42,7 +42,7 @@ CasicFrame tubeFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode); if (tubeFrame != null) { - tubeFrame.setDeviceId(deviceId); + tubeFrame.setDeviceCode(deviceId); tubeFrame.setUptime(uptime); tubeFrame.setMessageType(messageType); @@ -52,7 +52,7 @@ tubeFrame.parseMessageBody(); } - log.info(tubeFrame.toString()); + log.info("收到设备消息:{}", tubeFrame); return tubeFrame; } } else { @@ -63,10 +63,15 @@ } @Override + public String doBuildCommand(CasicFrame cmd) { + return tubeProtocol.buildFrameStr(cmd); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) { - String devCode = frame.getDeviceId(); + String devCode = frame.getDeviceCode(); DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode); String wellCode = ""; if (devWellView != null) { diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..5c9bf4a --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandBody.java b/src/main/java/com/casic/util/aep/AepCommandBody.java new file mode 100644 index 0000000..9942050 --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandBody.java @@ -0,0 +1,48 @@ +package com.casic.util.aep; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + + +@Data +public class AepCommandBody { + + /** + * 电信平台设备id,选填 + */ + private String deviceId; + /** + * 必填 产品id + */ + private String productId; + + /** + * 必填 操作人 + */ + private String operator; + /** + * 1、2设备级别,3为设备组,默认为1,选填 + */ + private Integer level; + /** + * 指令内容,必填,格式为json + */ + private Map content; + /** + * 设备组id + */ + private String deviceGroupId; + /** + * 消息超时时长 + */ + private Integer ttl; + + public void setPayloadString(String frameStr) { + content = new HashMap<>(); + content.put("dataType", 1); // 字符串方式 + content.put("payload", frameStr); + } + +} 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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(CasicFrame frame); } diff --git a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java index 25a9d12..46d049d 100644 --- a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java @@ -42,7 +42,7 @@ CasicFrame tubeFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode); if (tubeFrame != null) { - tubeFrame.setDeviceId(deviceId); + tubeFrame.setDeviceCode(deviceId); tubeFrame.setUptime(uptime); tubeFrame.setMessageType(messageType); @@ -52,7 +52,7 @@ tubeFrame.parseMessageBody(); } - log.info(tubeFrame.toString()); + log.info("收到设备消息:{}", tubeFrame); return tubeFrame; } } else { @@ -63,10 +63,15 @@ } @Override + public String doBuildCommand(CasicFrame cmd) { + return tubeProtocol.buildFrameStr(cmd); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) { - String devCode = frame.getDeviceId(); + String devCode = frame.getDeviceCode(); DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode); String wellCode = ""; if (devWellView != null) { diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..5c9bf4a --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandBody.java b/src/main/java/com/casic/util/aep/AepCommandBody.java new file mode 100644 index 0000000..9942050 --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandBody.java @@ -0,0 +1,48 @@ +package com.casic.util.aep; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + + +@Data +public class AepCommandBody { + + /** + * 电信平台设备id,选填 + */ + private String deviceId; + /** + * 必填 产品id + */ + private String productId; + + /** + * 必填 操作人 + */ + private String operator; + /** + * 1、2设备级别,3为设备组,默认为1,选填 + */ + private Integer level; + /** + * 指令内容,必填,格式为json + */ + private Map content; + /** + * 设备组id + */ + private String deviceGroupId; + /** + * 消息超时时长 + */ + private Integer ttl; + + public void setPayloadString(String frameStr) { + content = new HashMap<>(); + content.put("dataType", 1); // 字符串方式 + content.put("payload", frameStr); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandSend.java b/src/main/java/com/casic/util/aep/AepCommandSend.java new file mode 100644 index 0000000..d35f83f --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandSend.java @@ -0,0 +1,85 @@ +package com.casic.util.aep; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.util.SpringContextUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.StandardCharsets; + +/** + * @author cz + * @date 2024-04-24 + */ +@Slf4j +public class AepCommandSend { + + private String deviceId; + private String productId; + private String masterApiKey; + + public AepCommandSend() { + } + + public AepCommandSend(String deviceId, String productId, String masterApiKey) { + this.deviceId = deviceId; + this.productId = productId; + this.masterApiKey = masterApiKey; + } + + /** + * 处理电信平台的报文解析,并组装回复报文,发送电信平台 + * + * @param frameStr + */ + public int handleAndReply(String frameStr) throws Exception { + AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); + AepDeviceCommandClient client = getAepClient(aepConfig); + + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + AepCommandBody body = new AepCommandBody(); + body.setDeviceId(deviceId); + body.setProductId(productId); + body.setTtl(aepConfig.getTtl()); + body.setOperator(aepConfig.getOperator()); + body.setLevel(aepConfig.getLevel()); + body.setPayloadString(frameStr); + + request.setBody(JSONObject.toJSONString(body).getBytes()); + log.info("向AEP平台发送指令: {}", JSON.toJSONString(body)); + + JSONObject retObj = new JSONObject(); + + try { + CreateCommandResponse msgResponse = client.CreateCommand(request); + retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + + log.info("AEP平台返回消息: {}", retObj.toJSONString()); + } catch (Exception ex) { + log.error("AEP平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return (int) retObj.get("code"); + } + + /** + * 获取电信平台客户端 + * + * @param aepConfig + * @return + */ + private AepDeviceCommandClient getAepClient(AepConfig aepConfig) { + String aepKey = aepConfig.getKey(); + String aepSecret = aepConfig.getSecret(); + + return AepDeviceCommandClient.newClient().appKey(aepKey).appSecret(aepSecret).build(); + } +} 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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(CasicFrame frame); } diff --git a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java index 25a9d12..46d049d 100644 --- a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java @@ -42,7 +42,7 @@ CasicFrame tubeFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode); if (tubeFrame != null) { - tubeFrame.setDeviceId(deviceId); + tubeFrame.setDeviceCode(deviceId); tubeFrame.setUptime(uptime); tubeFrame.setMessageType(messageType); @@ -52,7 +52,7 @@ tubeFrame.parseMessageBody(); } - log.info(tubeFrame.toString()); + log.info("收到设备消息:{}", tubeFrame); return tubeFrame; } } else { @@ -63,10 +63,15 @@ } @Override + public String doBuildCommand(CasicFrame cmd) { + return tubeProtocol.buildFrameStr(cmd); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) { - String devCode = frame.getDeviceId(); + String devCode = frame.getDeviceCode(); DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode); String wellCode = ""; if (devWellView != null) { diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..5c9bf4a --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandBody.java b/src/main/java/com/casic/util/aep/AepCommandBody.java new file mode 100644 index 0000000..9942050 --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandBody.java @@ -0,0 +1,48 @@ +package com.casic.util.aep; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + + +@Data +public class AepCommandBody { + + /** + * 电信平台设备id,选填 + */ + private String deviceId; + /** + * 必填 产品id + */ + private String productId; + + /** + * 必填 操作人 + */ + private String operator; + /** + * 1、2设备级别,3为设备组,默认为1,选填 + */ + private Integer level; + /** + * 指令内容,必填,格式为json + */ + private Map content; + /** + * 设备组id + */ + private String deviceGroupId; + /** + * 消息超时时长 + */ + private Integer ttl; + + public void setPayloadString(String frameStr) { + content = new HashMap<>(); + content.put("dataType", 1); // 字符串方式 + content.put("payload", frameStr); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandSend.java b/src/main/java/com/casic/util/aep/AepCommandSend.java new file mode 100644 index 0000000..d35f83f --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandSend.java @@ -0,0 +1,85 @@ +package com.casic.util.aep; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.util.SpringContextUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.StandardCharsets; + +/** + * @author cz + * @date 2024-04-24 + */ +@Slf4j +public class AepCommandSend { + + private String deviceId; + private String productId; + private String masterApiKey; + + public AepCommandSend() { + } + + public AepCommandSend(String deviceId, String productId, String masterApiKey) { + this.deviceId = deviceId; + this.productId = productId; + this.masterApiKey = masterApiKey; + } + + /** + * 处理电信平台的报文解析,并组装回复报文,发送电信平台 + * + * @param frameStr + */ + public int handleAndReply(String frameStr) throws Exception { + AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); + AepDeviceCommandClient client = getAepClient(aepConfig); + + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + AepCommandBody body = new AepCommandBody(); + body.setDeviceId(deviceId); + body.setProductId(productId); + body.setTtl(aepConfig.getTtl()); + body.setOperator(aepConfig.getOperator()); + body.setLevel(aepConfig.getLevel()); + body.setPayloadString(frameStr); + + request.setBody(JSONObject.toJSONString(body).getBytes()); + log.info("向AEP平台发送指令: {}", JSON.toJSONString(body)); + + JSONObject retObj = new JSONObject(); + + try { + CreateCommandResponse msgResponse = client.CreateCommand(request); + retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + + log.info("AEP平台返回消息: {}", retObj.toJSONString()); + } catch (Exception ex) { + log.error("AEP平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return (int) retObj.get("code"); + } + + /** + * 获取电信平台客户端 + * + * @param aepConfig + * @return + */ + private AepDeviceCommandClient getAepClient(AepConfig aepConfig) { + String aepKey = aepConfig.getKey(); + String aepSecret = aepConfig.getSecret(); + + return AepDeviceCommandClient.newClient().appKey(aepKey).appSecret(aepSecret).build(); + } +} diff --git a/src/main/java/com/casic/util/aep/AepConfig.java b/src/main/java/com/casic/util/aep/AepConfig.java new file mode 100644 index 0000000..c2a7371 --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepConfig.java @@ -0,0 +1,23 @@ +package com.casic.util.aep; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "sensorhub.aep") +public class AepConfig { + + @Value("${casic.aep.app.key}") + private String key; + + @Value("${casic.aep.app.secret}") + private String secret; + + private Integer ttl = 7200; + private Integer level = 1; + private String operator = "birmm"; + +} 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/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java index 1f38aab..23df423 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataFrameHTTP.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,21 +17,6 @@ @Slf4j public class DataFrameHTTP extends DataFrame { - List dataItemList; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("设备编号: ").append(getDeviceId()).append("; "); - for (DataItemHTTP dataItem : dataItemList) { - builder.append("["); - builder.append(dataItem); - builder.append("]"); - } - builder.append("上报时间: ").append(getUptime()); - return builder.toString(); - } - @Override public void parseMessageBody() { JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); @@ -57,13 +42,13 @@ @Override public List toDataModelList() { List dataList = new ArrayList<>(); - for (DataItemHTTP dataItem : dataItemList) { + for (DataItem dataItem : dataItemList) { DataTubeOther data = new DataTubeOther(); - data.setDevcode(getDeviceId()); - data.setGasval(String.valueOf(dataItem.getCh4())); - data.setVbat(String.valueOf(dataItem.getVbat() * 1000)); // 单位转换为mv - data.setUptime(LocalDateTime.parse(dataItem.getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setDevcode(getDeviceCode()); + data.setGasval(String.valueOf(((DataItemHTTP) dataItem).getCh4())); + data.setVbat(String.valueOf(((DataItemHTTP) dataItem).getVbat() * 1000)); // 单位转换为mv + data.setUptime(LocalDateTime.parse(((DataItemHTTP) 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/tp/DataItemHTTP.java b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java index 9a53bd5..e5281eb 100644 --- a/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java +++ b/src/main/java/com/casic/tube/frame/tp/DataItemHTTP.java @@ -1,9 +1,10 @@ package com.casic.tube.frame.tp; +import com.casic.tube.frame.DataItem; import lombok.Data; @Data -public class DataItemHTTP { +public class DataItemHTTP extends DataItem { int ch4; // 甲烷浓度值(ppm) double temp; // 温度值(℃) double rh; // 湿度值(%) @@ -16,11 +17,10 @@ @Override public String toString() { - return "甲烷浓度值: " + ch4 + " ppm; " + - "电池电压值: " + vbat + " V; " + - "温湿度: " + temp + " ℃, " + rh + " %; " + - "报警码: " + alarm + "; " + - "位置: " + lon + ", " + lat + "; " + - "采样时间: " + time; + return "甲烷浓度值:" + ch4 + "ppm;" + + "电池电压值:" + vbat + "V;" + + "温湿度:" + temp + "℃," + rh + "%;" + + "位置:" + lon + "," + lat + ";" + + "采样时间:" + time; } } diff --git a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java index 9efc23b..4fdd78c 100644 --- a/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java +++ b/src/main/java/com/casic/tube/protocol/CasicTubeProtocolImpl.java @@ -1,6 +1,7 @@ package com.casic.tube.protocol; import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; import com.casic.common.CasicProtocol; import org.springframework.stereotype.Component; @@ -62,4 +63,24 @@ public String getUptime(String frame) { return frame.substring(frame.length() - 16, frame.length() - 2); } + + @Override + public String buildFrameStr(CasicFrame frame) { + StringBuilder builder = new StringBuilder(); + + builder.append(frame.getDeviceType()); + builder.append(frame.getDeviceCode()); + builder.append(frame.getMessageType()); + builder.append(frame.getSequence()); + builder.append(frame.getControl()); + builder.append(frame.getMessageBody().toJSONString()); + builder.append(frame.getUptime()); + + builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数 + builder.insert(0, frame.getVersion()); + builder.insert(0, frame.getHEADER()); + builder.append(frame.getTAIL()); + + return builder.toString(); + } } diff --git a/src/main/java/com/casic/tube/service/ITubeDataService.java b/src/main/java/com/casic/tube/service/ITubeDataService.java index bc6af02..c9dafea 100644 --- a/src/main/java/com/casic/tube/service/ITubeDataService.java +++ b/src/main/java/com/casic/tube/service/ITubeDataService.java @@ -1,10 +1,13 @@ package com.casic.tube.service; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; public interface ITubeDataService { - public CasicFrame dataParse(String frame); + CasicFrame dataParse(String frame); - public void afterAction(CasicFrame frame); + String doBuildCommand(CasicFrame cmd); + + void afterAction(CasicFrame frame); } diff --git a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java index 25a9d12..46d049d 100644 --- a/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeDataServiceImpl.java @@ -42,7 +42,7 @@ CasicFrame tubeFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode); if (tubeFrame != null) { - tubeFrame.setDeviceId(deviceId); + tubeFrame.setDeviceCode(deviceId); tubeFrame.setUptime(uptime); tubeFrame.setMessageType(messageType); @@ -52,7 +52,7 @@ tubeFrame.parseMessageBody(); } - log.info(tubeFrame.toString()); + log.info("收到设备消息:{}", tubeFrame); return tubeFrame; } } else { @@ -63,10 +63,15 @@ } @Override + public String doBuildCommand(CasicFrame cmd) { + return tubeProtocol.buildFrameStr(cmd); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) { - String devCode = frame.getDeviceId(); + String devCode = frame.getDeviceCode(); DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode); String wellCode = ""; if (devWellView != null) { diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..5c9bf4a --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandBody.java b/src/main/java/com/casic/util/aep/AepCommandBody.java new file mode 100644 index 0000000..9942050 --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandBody.java @@ -0,0 +1,48 @@ +package com.casic.util.aep; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + + +@Data +public class AepCommandBody { + + /** + * 电信平台设备id,选填 + */ + private String deviceId; + /** + * 必填 产品id + */ + private String productId; + + /** + * 必填 操作人 + */ + private String operator; + /** + * 1、2设备级别,3为设备组,默认为1,选填 + */ + private Integer level; + /** + * 指令内容,必填,格式为json + */ + private Map content; + /** + * 设备组id + */ + private String deviceGroupId; + /** + * 消息超时时长 + */ + private Integer ttl; + + public void setPayloadString(String frameStr) { + content = new HashMap<>(); + content.put("dataType", 1); // 字符串方式 + content.put("payload", frameStr); + } + +} diff --git a/src/main/java/com/casic/util/aep/AepCommandSend.java b/src/main/java/com/casic/util/aep/AepCommandSend.java new file mode 100644 index 0000000..d35f83f --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepCommandSend.java @@ -0,0 +1,85 @@ +package com.casic.util.aep; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.util.SpringContextUtil; +import com.ctg.ag.sdk.biz.AepDeviceCommandClient; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandRequest; +import com.ctg.ag.sdk.biz.aep_device_command.CreateCommandResponse; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.StandardCharsets; + +/** + * @author cz + * @date 2024-04-24 + */ +@Slf4j +public class AepCommandSend { + + private String deviceId; + private String productId; + private String masterApiKey; + + public AepCommandSend() { + } + + public AepCommandSend(String deviceId, String productId, String masterApiKey) { + this.deviceId = deviceId; + this.productId = productId; + this.masterApiKey = masterApiKey; + } + + /** + * 处理电信平台的报文解析,并组装回复报文,发送电信平台 + * + * @param frameStr + */ + public int handleAndReply(String frameStr) throws Exception { + AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); + AepDeviceCommandClient client = getAepClient(aepConfig); + + CreateCommandRequest request = new CreateCommandRequest(); + request.setParamMasterKey(masterApiKey); + + AepCommandBody body = new AepCommandBody(); + body.setDeviceId(deviceId); + body.setProductId(productId); + body.setTtl(aepConfig.getTtl()); + body.setOperator(aepConfig.getOperator()); + body.setLevel(aepConfig.getLevel()); + body.setPayloadString(frameStr); + + request.setBody(JSONObject.toJSONString(body).getBytes()); + log.info("向AEP平台发送指令: {}", JSON.toJSONString(body)); + + JSONObject retObj = new JSONObject(); + + try { + CreateCommandResponse msgResponse = client.CreateCommand(request); + retObj = JSON.parseObject(new String(msgResponse.getBody(), StandardCharsets.UTF_8)); + + log.info("AEP平台返回消息: {}", retObj.toJSONString()); + } catch (Exception ex) { + log.error("AEP平台发送失败,异常信息{}", ex.getMessage()); + } finally { + client.shutdown(); + } + + return (int) retObj.get("code"); + } + + /** + * 获取电信平台客户端 + * + * @param aepConfig + * @return + */ + private AepDeviceCommandClient getAepClient(AepConfig aepConfig) { + String aepKey = aepConfig.getKey(); + String aepSecret = aepConfig.getSecret(); + + return AepDeviceCommandClient.newClient().appKey(aepKey).appSecret(aepSecret).build(); + } +} diff --git a/src/main/java/com/casic/util/aep/AepConfig.java b/src/main/java/com/casic/util/aep/AepConfig.java new file mode 100644 index 0000000..c2a7371 --- /dev/null +++ b/src/main/java/com/casic/util/aep/AepConfig.java @@ -0,0 +1,23 @@ +package com.casic.util.aep; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "sensorhub.aep") +public class AepConfig { + + @Value("${casic.aep.app.key}") + private String key; + + @Value("${casic.aep.app.secret}") + private String secret; + + private Integer ttl = 7200; + private Integer level = 1; + private String operator = "birmm"; + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f1e2c28..8f37be9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -27,7 +27,11 @@ enable-local: false host: 127.0.0.1 port: 11320 - url: http://127.0.0.1:1164/test + + aep: + app: + key: ke4zM3hld29 + secret: 35ykNutA1t # type 可燃气体的设备类型 # minutes: 燃气外协设备上传数据的分钟数 \ No newline at end of file