diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
index 7e1fe0a..9a63bf4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
@@ -1,6 +1,6 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
@@ -41,15 +41,14 @@
return storeObjectMap;
}
- public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) {
+ public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) {
if (showSkip()) {
return null;
}
List prepareFieldConfig = prepareParseField(ruleConfig);
if (CollectionUtils.isNotEmpty(prepareFieldConfig)) {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
FieldParser fieldParser = new DefaultProtocolFieldParser();
+ byteBuf.resetReaderIndex();
Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap);
if (CollectionUtils.isNotEmpty(fixDataMap)) {
return fixDataMap;
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
index 7e1fe0a..9a63bf4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
@@ -1,6 +1,6 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
@@ -41,15 +41,14 @@
return storeObjectMap;
}
- public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) {
+ public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) {
if (showSkip()) {
return null;
}
List prepareFieldConfig = prepareParseField(ruleConfig);
if (CollectionUtils.isNotEmpty(prepareFieldConfig)) {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
FieldParser fieldParser = new DefaultProtocolFieldParser();
+ byteBuf.resetReaderIndex();
Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap);
if (CollectionUtils.isNotEmpty(fixDataMap)) {
return fixDataMap;
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
index 817bfaf..28eb908 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
@@ -1,5 +1,6 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.pojo.FieldRuleConfig;
import com.casic.missiles.registry.FieldRuleConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
@@ -15,5 +16,12 @@
fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId);
}
+ /* 是否应该跳过
+ *
+ * @return
+ */
+ private Boolean showSkip() {
+ return CollectionUtils.isNotEmpty(fieldRuleConfigList) ? false : true;
+ }
}
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
index 7e1fe0a..9a63bf4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
@@ -1,6 +1,6 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
@@ -41,15 +41,14 @@
return storeObjectMap;
}
- public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) {
+ public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) {
if (showSkip()) {
return null;
}
List prepareFieldConfig = prepareParseField(ruleConfig);
if (CollectionUtils.isNotEmpty(prepareFieldConfig)) {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
FieldParser fieldParser = new DefaultProtocolFieldParser();
+ byteBuf.resetReaderIndex();
Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap);
if (CollectionUtils.isNotEmpty(fixDataMap)) {
return fixDataMap;
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
index 817bfaf..28eb908 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
@@ -1,5 +1,6 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.pojo.FieldRuleConfig;
import com.casic.missiles.registry.FieldRuleConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
@@ -15,5 +16,12 @@
fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId);
}
+ /* 是否应该跳过
+ *
+ * @return
+ */
+ private Boolean showSkip() {
+ return CollectionUtils.isNotEmpty(fieldRuleConfigList) ? false : true;
+ }
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
index a6a4377..b996e72 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
@@ -1,6 +1,7 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.casic.missiles.parser.safe.SafeStrategy;
import com.casic.missiles.parser.sender.DataSubscribeProvider;
@@ -32,30 +33,34 @@
}
public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) {
- if (showSkip()) {
- return null;
+ if (CollectionUtils.isNotEmpty(datagramEventConfigList)) {
+ return datagramEventConfigList.get(0);
}
- return datagramEventConfigList.get(0);
+ return null;
}
// 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文
- public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
+ public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ?
processorInstance.getSafeBean() :
fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName();
if (!StringUtils.isEmpty(safeName)) {
//需要加密
SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName);
- String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
+ ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
return clearComplementZero(plain);
}
- return ByteBufUtil.hexDump(bizDataContent);
+ return bizDataContent;
}
//解密清零操作
- private String clearComplementZero(String plain) {
- plain = plain.substring(0, plain.lastIndexOf("00"));
- return plain;
+ private ByteBuf clearComplementZero(ByteBuf plainBuf) {
+ Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2;
+ while (plainBuf.getByte(plainLength) == (byte) 0x00) {
+ plainLength--;
+ }
+ plainBuf = plainBuf.slice(0, ++plainLength);
+ return plainBuf;
}
//数据发送,数据发送者暂未构建
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
index 7e1fe0a..9a63bf4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
@@ -1,6 +1,6 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
@@ -41,15 +41,14 @@
return storeObjectMap;
}
- public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) {
+ public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) {
if (showSkip()) {
return null;
}
List prepareFieldConfig = prepareParseField(ruleConfig);
if (CollectionUtils.isNotEmpty(prepareFieldConfig)) {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
FieldParser fieldParser = new DefaultProtocolFieldParser();
+ byteBuf.resetReaderIndex();
Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap);
if (CollectionUtils.isNotEmpty(fixDataMap)) {
return fixDataMap;
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
index 817bfaf..28eb908 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
@@ -1,5 +1,6 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.pojo.FieldRuleConfig;
import com.casic.missiles.registry.FieldRuleConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
@@ -15,5 +16,12 @@
fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId);
}
+ /* 是否应该跳过
+ *
+ * @return
+ */
+ private Boolean showSkip() {
+ return CollectionUtils.isNotEmpty(fieldRuleConfigList) ? false : true;
+ }
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
index a6a4377..b996e72 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
@@ -1,6 +1,7 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.casic.missiles.parser.safe.SafeStrategy;
import com.casic.missiles.parser.sender.DataSubscribeProvider;
@@ -32,30 +33,34 @@
}
public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) {
- if (showSkip()) {
- return null;
+ if (CollectionUtils.isNotEmpty(datagramEventConfigList)) {
+ return datagramEventConfigList.get(0);
}
- return datagramEventConfigList.get(0);
+ return null;
}
// 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文
- public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
+ public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ?
processorInstance.getSafeBean() :
fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName();
if (!StringUtils.isEmpty(safeName)) {
//需要加密
SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName);
- String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
+ ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
return clearComplementZero(plain);
}
- return ByteBufUtil.hexDump(bizDataContent);
+ return bizDataContent;
}
//解密清零操作
- private String clearComplementZero(String plain) {
- plain = plain.substring(0, plain.lastIndexOf("00"));
- return plain;
+ private ByteBuf clearComplementZero(ByteBuf plainBuf) {
+ Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2;
+ while (plainBuf.getByte(plainLength) == (byte) 0x00) {
+ plainLength--;
+ }
+ plainBuf = plainBuf.slice(0, ++plainLength);
+ return plainBuf;
}
//数据发送,数据发送者暂未构建
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
index 043927d..545d62d 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.casic.missiles.enums.FixedPropertyEnum;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
import com.casic.missiles.pojo.ProtocolConfig;
@@ -10,8 +11,10 @@
import com.casic.missiles.registry.ProtocolFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
+import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@@ -20,7 +23,7 @@
* @author cz
* @date 2023-6-12
*/
-public class ProtocolFieldConfigProvider {
+public class ProtocolFieldConfigProvider implements FixedPropertyEnum {
private static final String FIXED_FIELD_DS = "fixedFieldDs";
private static final String CONTENT_FIELD_DS = "contentFieldDs";
@@ -31,6 +34,7 @@
private final List protocolFieldConfigs;
private Map singleObjects = new ConcurrentHashMap<>();
private Map storeObjectMap = new HashMap<>();
+ private Map frameStructMap;
public Map getStoreObjectMap() {
return storeObjectMap;
@@ -101,7 +105,7 @@
}
Map fixedPropertyMap = new HashMap<>();
FieldParser fieldParser = new DefaultProtocolFieldParser();
- fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig));
+ fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig));
if (CollectionUtils.isNotEmpty(fixedPropertyMap)) {
this.singleObjects.put(catchKey, fixedPropertyMap);
return fixedPropertyMap;
@@ -175,7 +179,8 @@
return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS);
}
FieldParser fieldParser = new DefaultProtocolFieldParser();
- ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte);
+ frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte);
+ ByteBuf bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT);
if (bizDataByteBuf != null) {
this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf);
return bizDataByteBuf;
@@ -183,6 +188,24 @@
return null;
}
+ /**
+ * 设置完整的数据报文
+ *
+ * @param clearZeroPlainBuf 解密后的业务报文内容
+ * @return
+ */
+ public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) {
+ ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer();
+ if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) {
+ wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT));
+ }
+ wholePlainBuf.writeBytes(clearZeroPlainBuf);
+ if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) {
+ wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT));
+ }
+ return wholePlainBuf;
+ }
+
private ProtocolFieldConfig selectFieldConfig(Long id) {
Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter(
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
index 7e1fe0a..9a63bf4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
@@ -1,6 +1,6 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
@@ -41,15 +41,14 @@
return storeObjectMap;
}
- public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) {
+ public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) {
if (showSkip()) {
return null;
}
List prepareFieldConfig = prepareParseField(ruleConfig);
if (CollectionUtils.isNotEmpty(prepareFieldConfig)) {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
FieldParser fieldParser = new DefaultProtocolFieldParser();
+ byteBuf.resetReaderIndex();
Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap);
if (CollectionUtils.isNotEmpty(fixDataMap)) {
return fixDataMap;
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
index 817bfaf..28eb908 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
@@ -1,5 +1,6 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.pojo.FieldRuleConfig;
import com.casic.missiles.registry.FieldRuleConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
@@ -15,5 +16,12 @@
fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId);
}
+ /* 是否应该跳过
+ *
+ * @return
+ */
+ private Boolean showSkip() {
+ return CollectionUtils.isNotEmpty(fieldRuleConfigList) ? false : true;
+ }
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
index a6a4377..b996e72 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
@@ -1,6 +1,7 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.casic.missiles.parser.safe.SafeStrategy;
import com.casic.missiles.parser.sender.DataSubscribeProvider;
@@ -32,30 +33,34 @@
}
public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) {
- if (showSkip()) {
- return null;
+ if (CollectionUtils.isNotEmpty(datagramEventConfigList)) {
+ return datagramEventConfigList.get(0);
}
- return datagramEventConfigList.get(0);
+ return null;
}
// 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文
- public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
+ public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ?
processorInstance.getSafeBean() :
fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName();
if (!StringUtils.isEmpty(safeName)) {
//需要加密
SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName);
- String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
+ ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
return clearComplementZero(plain);
}
- return ByteBufUtil.hexDump(bizDataContent);
+ return bizDataContent;
}
//解密清零操作
- private String clearComplementZero(String plain) {
- plain = plain.substring(0, plain.lastIndexOf("00"));
- return plain;
+ private ByteBuf clearComplementZero(ByteBuf plainBuf) {
+ Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2;
+ while (plainBuf.getByte(plainLength) == (byte) 0x00) {
+ plainLength--;
+ }
+ plainBuf = plainBuf.slice(0, ++plainLength);
+ return plainBuf;
}
//数据发送,数据发送者暂未构建
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
index 043927d..545d62d 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.casic.missiles.enums.FixedPropertyEnum;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
import com.casic.missiles.pojo.ProtocolConfig;
@@ -10,8 +11,10 @@
import com.casic.missiles.registry.ProtocolFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
+import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@@ -20,7 +23,7 @@
* @author cz
* @date 2023-6-12
*/
-public class ProtocolFieldConfigProvider {
+public class ProtocolFieldConfigProvider implements FixedPropertyEnum {
private static final String FIXED_FIELD_DS = "fixedFieldDs";
private static final String CONTENT_FIELD_DS = "contentFieldDs";
@@ -31,6 +34,7 @@
private final List protocolFieldConfigs;
private Map singleObjects = new ConcurrentHashMap<>();
private Map storeObjectMap = new HashMap<>();
+ private Map frameStructMap;
public Map getStoreObjectMap() {
return storeObjectMap;
@@ -101,7 +105,7 @@
}
Map fixedPropertyMap = new HashMap<>();
FieldParser fieldParser = new DefaultProtocolFieldParser();
- fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig));
+ fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf, protocolConfig));
if (CollectionUtils.isNotEmpty(fixedPropertyMap)) {
this.singleObjects.put(catchKey, fixedPropertyMap);
return fixedPropertyMap;
@@ -175,7 +179,8 @@
return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS);
}
FieldParser fieldParser = new DefaultProtocolFieldParser();
- ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte);
+ frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte);
+ ByteBuf bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT);
if (bizDataByteBuf != null) {
this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf);
return bizDataByteBuf;
@@ -183,6 +188,24 @@
return null;
}
+ /**
+ * 设置完整的数据报文
+ *
+ * @param clearZeroPlainBuf 解密后的业务报文内容
+ * @return
+ */
+ public ByteBuf createDataContentBuf(ByteBuf clearZeroPlainBuf) {
+ ByteBuf wholePlainBuf = ByteBufAllocator.DEFAULT.buffer();
+ if (frameStructMap.containsKey(BEFORE_BUSINESS_CONTENT)) {
+ wholePlainBuf.writeBytes(frameStructMap.get(BEFORE_BUSINESS_CONTENT));
+ }
+ wholePlainBuf.writeBytes(clearZeroPlainBuf);
+ if (frameStructMap.containsKey(AFTER_BUSINESS_CONTENT)) {
+ wholePlainBuf.writeBytes(frameStructMap.get(AFTER_BUSINESS_CONTENT));
+ }
+ return wholePlainBuf;
+ }
+
private ProtocolFieldConfig selectFieldConfig(Long id) {
Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter(
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java
index 856b399..f097f42 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java
@@ -30,7 +30,7 @@
env2.put("value" + i, valueList.get(i));
}
}
- values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExcuteOperation(), env2));
+ values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2));
return values;
} catch (ExpressionNotFoundException enf) {
log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage());
diff --git a/pom.xml b/pom.xml
index c8bc07e..1a6a44e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
sensorhub
pom
@@ -28,92 +28,70 @@
3.5.2
4.1.66.Final
5.2.7
- 2.4.8
+ 2.4.8
+ 3.5.2
-
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${boot.version}
-
-
-
- com.casic
- casic-core
- ${core.version}
-
-
- mysql
- mysql-connector-java
- ${mysql.driver.version}
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis-plus-boot-starter}
-
-
- com.baomidou
- mybatis-plus-generator
- ${mybatis-plus-generator.version}
-
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
-
-
- com.casic
- casic-core
- ${core.version}
- provided
-
-
- com.casic
- casic-admin-support
- ${admin.version}
- provided
-
-
- com.casic
- casic-file-support
- ${admin.version}
-
-
-
- com.casic
- casic-export-support
- ${extension.version}
-
-
- com.casic
- casic-file
- ${admin.version}
-
-
-
org.springframework.boot
spring-boot-starter-web
${boot.version}
-
+ org.springframework.boot
+ spring-boot-starter-test
+ ${boot.version}
+ test
+
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.driver.version}
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
com.alibaba
fastjson
${fastjson.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.1
+
+
+
+ cn.hutool
+ hutool-core
+ 5.7.2
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
@@ -125,58 +103,9 @@
maven-compiler-plugin
${maven.compiler.plugin.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 2a77c72..3a55d51 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -5,7 +5,7 @@
com.casic
sensorhub
- 0.0.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
com.casic
@@ -15,39 +15,6 @@
sensorhub-server
-
-
- org.springframework.boot
- spring-boot-starter
- 2.4.5
-
-
-
- org.projectlombok
- lombok
- 1.18.20
-
-
-
-
- org.springframework.boot
- spring-boot-starter-jdbc
- 2.4.5
-
-
-
- mysql
- mysql-connector-java
- 8.0.16
- compile
-
-
-
- com.baomidou
- mybatis-plus-boot-starter
- 3.4.3
-
-
org.apache.httpcomponents
@@ -55,12 +22,6 @@
4.5.7
-
- org.bouncycastle
- bcprov-jdk15to18
- 1.71
-
-
redis.clients
@@ -75,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.71
+
+
@@ -86,7 +53,7 @@
true
- com.casic.missiles.SensorhubServerApplication
+ com.casic.missiles.ServerApplication
exec
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
deleted file mode 100644
index 24b1e76..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/SensorhubServerApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.casic.missiles;
-
-import com.casic.missiles.netty.SensorhubServer;
-import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@SpringBootApplication(scanBasePackages = "com.casic.missiles")
-@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
-@EnableTransactionManagement(proxyTargetClass = true)
-@Slf4j
-public class SensorhubServerApplication implements CommandLineRunner {
-
- @Autowired
- private SensorhubServer nettyServer;
- public static void main(String[] args) {
- SpringApplication.run(SensorhubServerApplication.class, args);
- }
-
- @Override
- public void run(String... args) {
- this.nettyServer.startServer();
- }
-
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
new file mode 100644
index 0000000..7820203
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/ServerApplication.java
@@ -0,0 +1,30 @@
+package com.casic.missiles;
+
+import com.casic.missiles.netty.SensorhubServer;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication(scanBasePackages = "com.casic.missiles")
+@MapperScan(basePackages = {"com.casic.missiles.**.dao", "com.casic.missiles.**.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@Slf4j
+public class ServerApplication implements CommandLineRunner {
+
+ @Autowired
+ private SensorhubServer nettyServer;
+ public static void main(String[] args) {
+ SpringApplication.run(ServerApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) {
+ this.nettyServer.startServer();
+ }
+
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index dc1ab97..1c68e1a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -38,47 +38,49 @@
@Override
public Boolean doParseProtocol(ByteBuf byteBuf) {
//匹配前导码
- ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
+ ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (protocolConfig == null) {
return rematch(byteBuf);
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
- ByteBuf wholeDatagramByte = null;
- //通过匹配帧结构获取完整的数据包
+ // 通过协议工厂匹配,匹配规则,获取规则配置
+ RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf);
+ if (ruleConfig == null) {
+ return false;
+ }
+ //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置
+ AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
+ //获取报文的业务内容
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(byteBuf);
+ //获取流程实例配置
+ ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
+ //密文解析
+ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
+ ByteBuf wholePlainBuf = byteBuf;
+ //如果加密,帧结构肯定发生了变化
+ if (clearZeroPlainBuf != bizDataByteBuf) {
+ //获取报文的业务内容
+ wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf);
+ }
+ ByteBuf wholeNewPlainBuf=null;
+ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) {
+ if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(wholePlainBuf, protocolFactory)) != null) {
break;
}
}
//没有匹配成功
- if (wholeDatagramByte == null) {
+ if (wholeNewPlainBuf == null) {
return false;
}
- /**
- * 统一固定字段解析=>进行规则的查询的判断
- * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容
- * =>业务字段解析=> 数据验证=>数据构建=> 数据发送
- */
- //进行规则字段解析,进行匹配规则
- RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte);
- if (ruleConfig == null) {
- return false;
- }
- //选定业务字段内容
- ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte);
- //以下进行业务的规则解析,同时选定流程实例
- AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId());
- ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider();
- //密文解析
- String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
-
- ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain,
+ //解析组合业务字段
+ ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf,
ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
- //解析业务字段
- ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain);
+ //解析单个业务字段
+ ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf);
//构建发送解析任务
Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory);
//数据发送
@@ -90,7 +92,7 @@
* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
*/
private Boolean rematch(ByteBuf byteBuf) {
- String oldDataContent =ByteBufUtil.hexDump(byteBuf);
+ String oldDataContent = ByteBufUtil.hexDump(byteBuf);
//重置位判断
byteBuf.resetReaderIndex();
//判断重置是否前移,如果没有前移,则直接判为匹配失败
@@ -132,9 +134,11 @@
Map bizDataMap = new HashMap<>();
Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap();
Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap();
+ Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap();
//加上固定字段的数据
bizDataMap.putAll(ruleStoreObjectMap);
bizDataMap.putAll(protocolStoreObjectMap);
+ bizDataMap.putAll(combinedStoreObjectMap);
return bizDataMap;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
index d19cadd..8228273 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java
@@ -15,17 +15,25 @@
//** 帧结构前导码匹配
// 1、首字母匹配前导码,
// 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选
- public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
+ public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) {
String protocolContent = ByteBufUtil.hexDump(byteBuf);
List firstMatchConfigs = initialMatch(protocolContent);
- for(ProtocolConfig firstMatchConfig:firstMatchConfigs){
- if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){
- return firstMatchConfig;
+ for (ProtocolConfig firstMatchConfig : firstMatchConfigs) {
+ if (doMatchLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)) {
+ return firstMatchConfig;
}
}
return null;
}
+
+ //初始化匹配前导码内容
+ private static List initialMatch(String protocolContent) {
+ String firstFrameChar = protocolContent.charAt(0) + "";
+ ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
+ return protocolConfigProvider.getMatchList();
+ }
+
//** 解析字组合前导码匹配
// 1、解析字前导码长度,根据长度进行匹配
// 2、采用有限匹配原则,不允许匹配字符包含
@@ -34,7 +42,7 @@
Set> en = fieldFixedMap.entrySet();
for (Map.Entry entry : en) {
String key = entry.getKey();
- if (doMacthLeadCode(protocolContent, key)) {
+ if (doMatchLeadCode(key, protocolContent)) {
return entry.getValue();
}
}
@@ -42,20 +50,17 @@
return null;
}
- //初始化匹配前导码内容
- private static List initialMatch(String protocolContent) {
- String firstFrameChar = protocolContent.charAt(0) + "";
- ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar);
- return protocolConfigProvider.getMatchList();
- }
-
-
/**
* 以前导码长度进行截图,是否相等,保证匹配的前导准确性
*/
- private static Boolean doMacthLeadCode(String preFix, String matchContent) {
+ private static Boolean doMatchLeadCode(String preFix, String matchContent) {
+ if (preFix.endsWith("x")) {
+ while (preFix.endsWith("x")) {
+ preFix = preFix.substring(0, preFix.length() - 1);
+ }
+ }
Integer preFixLength = preFix.length();
- String beMatchContent = matchContent.substring(0, preFixLength);
- return beMatchContent.equals(preFix);
+ String beMatchContent = matchContent.substring(0, preFixLength).toLowerCase();
+ return beMatchContent.equals(preFix.toLowerCase());
}
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
index 50f23fc..fff23f3 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java
@@ -11,6 +11,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
+/**
+ * @author cz
+ */
@Order(0)
@Component
public class FrameLengthMatcher implements FrameStructMatcher {
@@ -28,10 +31,10 @@
if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) {
Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig);
if (ObjectUtil.isEmpty(totalLength)) {
- if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断
+ if (dataGramContent.length() == totalLength) {//等于长度返回true,超出长度,切断
ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength);
return wholeDatagramByte;
- } else {
+ }else {
//读的标志位前移舍弃
byteBuf.markReaderIndex();
return null;
@@ -42,7 +45,6 @@
}
-
private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) {
byteBuf.readBytes(totalLength);
byteBuf.markReaderIndex();//读的标志位前移
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
index d527ad0..cb1ca7a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java
@@ -10,7 +10,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
-import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@
*/
@Order(1)
@Component
-@AllArgsConstructor
+@Slf4j
public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum {
//帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧
@@ -65,7 +65,7 @@
ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer();
String mergeFrameStr = "";
String tail = "";
- System.out.println(ByteBufUtil.hexDump(byteBufContent));
+ log.debug("--合并前"+ByteBufUtil.hexDump(byteBufContent));
//会存在多个帧拼接在一起的的情况,进行合并处理
while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) {
Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig);
@@ -87,7 +87,7 @@
}
mergeFrameStr += tail;
mergeWholeFrameByte.writeBytes(mergeFrameStr.getBytes(Charset.forName("ISO-8859-1")));
- System.out.println(ByteBufUtil.hexDump(mergeWholeFrameByte));
+ log.debug("--合并后--"+ByteBufUtil.hexDump(mergeWholeFrameByte));
return mergeWholeFrameByte;
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
index c3a1bab..9e8cceb 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java
@@ -20,11 +20,8 @@
@Override
public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) {
ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig();
- if (protocolConfig == null) {
- return null;
- }
ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider();
- if (protocolConfig == null) {
+ if (protocolConfig == null||fieldConfigProvider == null) {
return null;
}
ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null :
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
index 5f1c177..d18759f 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java
@@ -1,6 +1,5 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver;
import com.casic.missiles.pojo.CombinedFieldConfig;
@@ -9,7 +8,7 @@
import com.casic.missiles.registry.CombinedFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
+import org.apache.commons.lang3.StringUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
@@ -26,20 +25,23 @@
private final List combinedFieldConfigList;
private Map storeObjectMap = new HashMap<>();
+ public Map getStoreObjectMap() {
+ return storeObjectMap;
+ }
+
public CombinedFieldConfigProvider(Long ruleId) {
CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class);
combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId);
}
- public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) {
- if (showSkip()) {
+ public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap) {
+ if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) {
return;
}
- //匹配对应的数据,然后进行相关的字段解析
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
+ byteBuf.resetReaderIndex();
+ List ruleCombinedConfigList=this.prepareParseField(ruleConfig);
GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver();
- combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap);
+ combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap);
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
index 7e1fe0a..9a63bf4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java
@@ -1,6 +1,6 @@
package com.casic.missiles.parser.provider;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
@@ -41,15 +41,14 @@
return storeObjectMap;
}
- public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) {
+ public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) {
if (showSkip()) {
return null;
}
List prepareFieldConfig = prepareParseField(ruleConfig);
if (CollectionUtils.isNotEmpty(prepareFieldConfig)) {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
- byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1")));
FieldParser fieldParser = new DefaultProtocolFieldParser();
+ byteBuf.resetReaderIndex();
Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap);
if (CollectionUtils.isNotEmpty(fixDataMap)) {
return fixDataMap;
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
index 817bfaf..28eb908 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java
@@ -1,5 +1,6 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.casic.missiles.pojo.FieldRuleConfig;
import com.casic.missiles.registry.FieldRuleConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
@@ -15,5 +16,12 @@
fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId);
}
+ /* 是否应该跳过
+ *
+ * @return
+ */
+ private Boolean showSkip() {
+ return CollectionUtils.isNotEmpty(fieldRuleConfigList) ? false : true;
+ }
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
index a6a4377..b996e72 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java
@@ -1,6 +1,7 @@
package com.casic.missiles.parser.provider;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.casic.missiles.parser.safe.SafeStrategy;
import com.casic.missiles.parser.sender.DataSubscribeProvider;
@@ -32,30 +33,34 @@
}
public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) {
- if (showSkip()) {
- return null;
+ if (CollectionUtils.isNotEmpty(datagramEventConfigList)) {
+ return datagramEventConfigList.get(0);
}
- return datagramEventConfigList.get(0);
+ return null;
}
// 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文
- public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
+ public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) {
String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ?
processorInstance.getSafeBean() :
fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName();
if (!StringUtils.isEmpty(safeName)) {
//需要加密
SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName);
- String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
+ ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent));
return clearComplementZero(plain);
}
- return ByteBufUtil.hexDump(bizDataContent);
+ return bizDataContent;
}
//解密清零操作
- private String clearComplementZero(String plain) {
- plain = plain.substring(0, plain.lastIndexOf("00"));
- return plain;
+ private ByteBuf clearComplementZero(ByteBuf plainBuf) {
+ Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2;
+ while (plainBuf.getByte(plainLength) == (byte) 0x00) {
+ plainLength--;
+ }
+ plainBuf = plainBuf.slice(0, ++plainLength);
+ return plainBuf;
}
//数据发送,数据发送者暂未构建
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
index 043927d..545d62d 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.casic.missiles.enums.FixedPropertyEnum;
import com.casic.missiles.parser.resolver.FieldParser;
import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser;
import com.casic.missiles.pojo.ProtocolConfig;
@@ -10,8 +11,10 @@
import com.casic.missiles.registry.ProtocolFieldConfigRegistry;
import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
+import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@@ -20,7 +23,7 @@
* @author cz
* @date 2023-6-12
*/
-public class ProtocolFieldConfigProvider {
+public class ProtocolFieldConfigProvider implements FixedPropertyEnum {
private static final String FIXED_FIELD_DS = "fixedFieldDs";
private static final String CONTENT_FIELD_DS = "contentFieldDs";
@@ -31,6 +34,7 @@
private final List protocolFieldConfigs;
private Map