diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
index 02f5ba2..bc8a81e 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
@@ -1,13 +1,14 @@
package com.casic.missiles.socket;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
+import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
@@ -15,6 +16,13 @@
*/
@Slf4j
public class BootNettyServer {
+
+ private final ISocketService socketService;
+
+ public BootNettyServer(ISocketService socketService) {
+ this.socketService = socketService;
+ }
+
public void bind(int port) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
@@ -26,17 +34,31 @@
/**
* 设置group,将bossGroup,workerGroup线程组传递到ServerBootstrap
*/
- serverBootstrap = serverBootstrap.group(bossGroup, workerGroup);
- /**
- * ServerSocketChannel是以NIO的selector为基础进行实现的,用来接收新的连接,这里告诉Channel通过NioServerSocketChannel获取新的连接
- */
- serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap = serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
- serverBootstrap = serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
+ serverBootstrap.group(bossGroup, workerGroup);
+ serverBootstrap.channel(NioServerSocketChannel.class);
+ //连接数
+ serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
+ //长连接
+ serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
+ //缓冲大小,initial要介于minimum和maximum之间
+ serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(512, 1024, 2048));
/**
* 设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
*/
- serverBootstrap = serverBootstrap.childHandler(new ChannelInitializer());
+ serverBootstrap.childHandler(new ChannelInitializer() {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+
+ pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ /**
+ * 自定义ChannelInboundHandlerAdapter
+ */
+ pipeline.addLast(new ChannelHandlerAdapter(socketService));
+ }
+ });
log.info("端口已开启,占用" + port + "端口号....");
/**
* 绑定端口,同步等待成功
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
index 02f5ba2..bc8a81e 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
@@ -1,13 +1,14 @@
package com.casic.missiles.socket;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
+import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
@@ -15,6 +16,13 @@
*/
@Slf4j
public class BootNettyServer {
+
+ private final ISocketService socketService;
+
+ public BootNettyServer(ISocketService socketService) {
+ this.socketService = socketService;
+ }
+
public void bind(int port) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
@@ -26,17 +34,31 @@
/**
* 设置group,将bossGroup,workerGroup线程组传递到ServerBootstrap
*/
- serverBootstrap = serverBootstrap.group(bossGroup, workerGroup);
- /**
- * ServerSocketChannel是以NIO的selector为基础进行实现的,用来接收新的连接,这里告诉Channel通过NioServerSocketChannel获取新的连接
- */
- serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap = serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
- serverBootstrap = serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
+ serverBootstrap.group(bossGroup, workerGroup);
+ serverBootstrap.channel(NioServerSocketChannel.class);
+ //连接数
+ serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
+ //长连接
+ serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
+ //缓冲大小,initial要介于minimum和maximum之间
+ serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(512, 1024, 2048));
/**
* 设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
*/
- serverBootstrap = serverBootstrap.childHandler(new ChannelInitializer());
+ serverBootstrap.childHandler(new ChannelInitializer() {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+
+ pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ /**
+ * 自定义ChannelInboundHandlerAdapter
+ */
+ pipeline.addLast(new ChannelHandlerAdapter(socketService));
+ }
+ });
log.info("端口已开启,占用" + port + "端口号....");
/**
* 绑定端口,同步等待成功
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
index 7aa4a6a..2725560 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
@@ -1,8 +1,6 @@
package com.casic.missiles.socket;
-import com.casic.missiles.modular.system.utils.Constant;
-import com.casic.missiles.modular.system.utils.DecodeData;
-import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -15,68 +13,15 @@
@Slf4j
public class ChannelHandlerAdapter extends ChannelInboundHandlerAdapter {
- public static boolean isCorrectData(int[] bytes) {
- if (bytes[0] != Constant.BITS_OF_HEAD) {
- return false;
- }
- return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ private final ISocketService socketService;
+
+ public ChannelHandlerAdapter(ISocketService socketService) {
+ this.socketService = socketService;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
- String temp = msg.toString();
- log.info("channelRead message ===> " + temp);
- /**
- * 回应客户端
- * */
- String[] dataArray = temp.split(" ");
- int[] data = new int[dataArray.length];
- for (int i = 0; i < dataArray.length; i++) {
- data[i] = Integer.parseInt(dataArray[i], 16);
- }
- if (isCorrectData(data)) {
- int dataType = data[2];
- /**
- * 先解析再回应
- * */
- switch (dataType) {
- case 0x01:
- //水下机器人信息
- DecodeData.decodeRobotInfo(data);
- break;
- case 0x02:
- //算法结果
-
- break;
- case 0x03:
- //任务数据还需要细分
-
- break;
- case 0x04:
- //短信内容
- DecodeData.decodeSMS(data);
-
- /**
- * Socket返回数据给西工大
- * */
- ctx.write(EncodeData.encodeSMS(""));
- break;
- case 0x05:
- //环境数据请求
- EncodeData.encodeEnvironment("");
- break;
- case 0x06:
- //AIS数据请求
- EncodeData.encodeAIS("");
- break;
- case 0x07:
- //方舱位置
- DecodeData.decodeShelterPosition(data);
- break;
- default:
- break;
- }
- }
+ socketService.communicate(ctx, msg);
}
@Override
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
index 02f5ba2..bc8a81e 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
@@ -1,13 +1,14 @@
package com.casic.missiles.socket;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
+import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
@@ -15,6 +16,13 @@
*/
@Slf4j
public class BootNettyServer {
+
+ private final ISocketService socketService;
+
+ public BootNettyServer(ISocketService socketService) {
+ this.socketService = socketService;
+ }
+
public void bind(int port) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
@@ -26,17 +34,31 @@
/**
* 设置group,将bossGroup,workerGroup线程组传递到ServerBootstrap
*/
- serverBootstrap = serverBootstrap.group(bossGroup, workerGroup);
- /**
- * ServerSocketChannel是以NIO的selector为基础进行实现的,用来接收新的连接,这里告诉Channel通过NioServerSocketChannel获取新的连接
- */
- serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap = serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
- serverBootstrap = serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
+ serverBootstrap.group(bossGroup, workerGroup);
+ serverBootstrap.channel(NioServerSocketChannel.class);
+ //连接数
+ serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
+ //长连接
+ serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
+ //缓冲大小,initial要介于minimum和maximum之间
+ serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(512, 1024, 2048));
/**
* 设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
*/
- serverBootstrap = serverBootstrap.childHandler(new ChannelInitializer());
+ serverBootstrap.childHandler(new ChannelInitializer() {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+
+ pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ /**
+ * 自定义ChannelInboundHandlerAdapter
+ */
+ pipeline.addLast(new ChannelHandlerAdapter(socketService));
+ }
+ });
log.info("端口已开启,占用" + port + "端口号....");
/**
* 绑定端口,同步等待成功
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
index 7aa4a6a..2725560 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
@@ -1,8 +1,6 @@
package com.casic.missiles.socket;
-import com.casic.missiles.modular.system.utils.Constant;
-import com.casic.missiles.modular.system.utils.DecodeData;
-import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -15,68 +13,15 @@
@Slf4j
public class ChannelHandlerAdapter extends ChannelInboundHandlerAdapter {
- public static boolean isCorrectData(int[] bytes) {
- if (bytes[0] != Constant.BITS_OF_HEAD) {
- return false;
- }
- return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ private final ISocketService socketService;
+
+ public ChannelHandlerAdapter(ISocketService socketService) {
+ this.socketService = socketService;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
- String temp = msg.toString();
- log.info("channelRead message ===> " + temp);
- /**
- * 回应客户端
- * */
- String[] dataArray = temp.split(" ");
- int[] data = new int[dataArray.length];
- for (int i = 0; i < dataArray.length; i++) {
- data[i] = Integer.parseInt(dataArray[i], 16);
- }
- if (isCorrectData(data)) {
- int dataType = data[2];
- /**
- * 先解析再回应
- * */
- switch (dataType) {
- case 0x01:
- //水下机器人信息
- DecodeData.decodeRobotInfo(data);
- break;
- case 0x02:
- //算法结果
-
- break;
- case 0x03:
- //任务数据还需要细分
-
- break;
- case 0x04:
- //短信内容
- DecodeData.decodeSMS(data);
-
- /**
- * Socket返回数据给西工大
- * */
- ctx.write(EncodeData.encodeSMS(""));
- break;
- case 0x05:
- //环境数据请求
- EncodeData.encodeEnvironment("");
- break;
- case 0x06:
- //AIS数据请求
- EncodeData.encodeAIS("");
- break;
- case 0x07:
- //方舱位置
- DecodeData.decodeShelterPosition(data);
- break;
- default:
- break;
- }
- }
+ socketService.communicate(ctx, msg);
}
@Override
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
deleted file mode 100644
index 4c9513b..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.casic.missiles.socket;
-
-import io.netty.channel.Channel;
-import io.netty.handler.codec.string.StringDecoder;
-import io.netty.handler.codec.string.StringEncoder;
-
-/**
- * @author a203
- */
-public class ChannelInitializer extends io.netty.channel.ChannelInitializer {
-
- @Override
- protected void initChannel(Channel channel) {
- // ChannelOutboundHandler,依照逆序执行
- channel.pipeline().addLast("encoder", new StringEncoder());
-
- // 属于ChannelInboundHandler,依照顺序执行
- channel.pipeline().addLast("decoder", new StringDecoder());
- /**
- * 自定义ChannelInboundHandlerAdapter
- */
- channel.pipeline().addLast(new ChannelHandlerAdapter());
- }
-}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
index 02f5ba2..bc8a81e 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
@@ -1,13 +1,14 @@
package com.casic.missiles.socket;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
+import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
@@ -15,6 +16,13 @@
*/
@Slf4j
public class BootNettyServer {
+
+ private final ISocketService socketService;
+
+ public BootNettyServer(ISocketService socketService) {
+ this.socketService = socketService;
+ }
+
public void bind(int port) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
@@ -26,17 +34,31 @@
/**
* 设置group,将bossGroup,workerGroup线程组传递到ServerBootstrap
*/
- serverBootstrap = serverBootstrap.group(bossGroup, workerGroup);
- /**
- * ServerSocketChannel是以NIO的selector为基础进行实现的,用来接收新的连接,这里告诉Channel通过NioServerSocketChannel获取新的连接
- */
- serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap = serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
- serverBootstrap = serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
+ serverBootstrap.group(bossGroup, workerGroup);
+ serverBootstrap.channel(NioServerSocketChannel.class);
+ //连接数
+ serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
+ //长连接
+ serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
+ //缓冲大小,initial要介于minimum和maximum之间
+ serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(512, 1024, 2048));
/**
* 设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
*/
- serverBootstrap = serverBootstrap.childHandler(new ChannelInitializer());
+ serverBootstrap.childHandler(new ChannelInitializer() {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+
+ pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ /**
+ * 自定义ChannelInboundHandlerAdapter
+ */
+ pipeline.addLast(new ChannelHandlerAdapter(socketService));
+ }
+ });
log.info("端口已开启,占用" + port + "端口号....");
/**
* 绑定端口,同步等待成功
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
index 7aa4a6a..2725560 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
@@ -1,8 +1,6 @@
package com.casic.missiles.socket;
-import com.casic.missiles.modular.system.utils.Constant;
-import com.casic.missiles.modular.system.utils.DecodeData;
-import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -15,68 +13,15 @@
@Slf4j
public class ChannelHandlerAdapter extends ChannelInboundHandlerAdapter {
- public static boolean isCorrectData(int[] bytes) {
- if (bytes[0] != Constant.BITS_OF_HEAD) {
- return false;
- }
- return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ private final ISocketService socketService;
+
+ public ChannelHandlerAdapter(ISocketService socketService) {
+ this.socketService = socketService;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
- String temp = msg.toString();
- log.info("channelRead message ===> " + temp);
- /**
- * 回应客户端
- * */
- String[] dataArray = temp.split(" ");
- int[] data = new int[dataArray.length];
- for (int i = 0; i < dataArray.length; i++) {
- data[i] = Integer.parseInt(dataArray[i], 16);
- }
- if (isCorrectData(data)) {
- int dataType = data[2];
- /**
- * 先解析再回应
- * */
- switch (dataType) {
- case 0x01:
- //水下机器人信息
- DecodeData.decodeRobotInfo(data);
- break;
- case 0x02:
- //算法结果
-
- break;
- case 0x03:
- //任务数据还需要细分
-
- break;
- case 0x04:
- //短信内容
- DecodeData.decodeSMS(data);
-
- /**
- * Socket返回数据给西工大
- * */
- ctx.write(EncodeData.encodeSMS(""));
- break;
- case 0x05:
- //环境数据请求
- EncodeData.encodeEnvironment("");
- break;
- case 0x06:
- //AIS数据请求
- EncodeData.encodeAIS("");
- break;
- case 0x07:
- //方舱位置
- DecodeData.decodeShelterPosition(data);
- break;
- default:
- break;
- }
- }
+ socketService.communicate(ctx, msg);
}
@Override
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
deleted file mode 100644
index 4c9513b..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.casic.missiles.socket;
-
-import io.netty.channel.Channel;
-import io.netty.handler.codec.string.StringDecoder;
-import io.netty.handler.codec.string.StringEncoder;
-
-/**
- * @author a203
- */
-public class ChannelInitializer extends io.netty.channel.ChannelInitializer {
-
- @Override
- protected void initChannel(Channel channel) {
- // ChannelOutboundHandler,依照逆序执行
- channel.pipeline().addLast("encoder", new StringEncoder());
-
- // 属于ChannelInboundHandler,依照顺序执行
- channel.pipeline().addLast("decoder", new StringDecoder());
- /**
- * 自定义ChannelInboundHandlerAdapter
- */
- channel.pipeline().addLast(new ChannelHandlerAdapter());
- }
-}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java
new file mode 100644
index 0000000..9bae1d5
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.socket.service;
+
+import io.netty.channel.ChannelHandlerContext;
+
+/**
+ * @author a203
+ */
+public interface ISocketService {
+ /**
+ * Socket数据通信接口
+ *
+ * @param ctx 通道上下文
+ * @param msg 读取到的数据
+ */
+ void communicate(ChannelHandlerContext ctx, Object msg);
+}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
index 02f5ba2..bc8a81e 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
@@ -1,13 +1,14 @@
package com.casic.missiles.socket;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
+import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
@@ -15,6 +16,13 @@
*/
@Slf4j
public class BootNettyServer {
+
+ private final ISocketService socketService;
+
+ public BootNettyServer(ISocketService socketService) {
+ this.socketService = socketService;
+ }
+
public void bind(int port) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
@@ -26,17 +34,31 @@
/**
* 设置group,将bossGroup,workerGroup线程组传递到ServerBootstrap
*/
- serverBootstrap = serverBootstrap.group(bossGroup, workerGroup);
- /**
- * ServerSocketChannel是以NIO的selector为基础进行实现的,用来接收新的连接,这里告诉Channel通过NioServerSocketChannel获取新的连接
- */
- serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap = serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
- serverBootstrap = serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
+ serverBootstrap.group(bossGroup, workerGroup);
+ serverBootstrap.channel(NioServerSocketChannel.class);
+ //连接数
+ serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
+ //长连接
+ serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
+ //缓冲大小,initial要介于minimum和maximum之间
+ serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(512, 1024, 2048));
/**
* 设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
*/
- serverBootstrap = serverBootstrap.childHandler(new ChannelInitializer());
+ serverBootstrap.childHandler(new ChannelInitializer() {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+
+ pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ /**
+ * 自定义ChannelInboundHandlerAdapter
+ */
+ pipeline.addLast(new ChannelHandlerAdapter(socketService));
+ }
+ });
log.info("端口已开启,占用" + port + "端口号....");
/**
* 绑定端口,同步等待成功
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
index 7aa4a6a..2725560 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
@@ -1,8 +1,6 @@
package com.casic.missiles.socket;
-import com.casic.missiles.modular.system.utils.Constant;
-import com.casic.missiles.modular.system.utils.DecodeData;
-import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -15,68 +13,15 @@
@Slf4j
public class ChannelHandlerAdapter extends ChannelInboundHandlerAdapter {
- public static boolean isCorrectData(int[] bytes) {
- if (bytes[0] != Constant.BITS_OF_HEAD) {
- return false;
- }
- return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ private final ISocketService socketService;
+
+ public ChannelHandlerAdapter(ISocketService socketService) {
+ this.socketService = socketService;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
- String temp = msg.toString();
- log.info("channelRead message ===> " + temp);
- /**
- * 回应客户端
- * */
- String[] dataArray = temp.split(" ");
- int[] data = new int[dataArray.length];
- for (int i = 0; i < dataArray.length; i++) {
- data[i] = Integer.parseInt(dataArray[i], 16);
- }
- if (isCorrectData(data)) {
- int dataType = data[2];
- /**
- * 先解析再回应
- * */
- switch (dataType) {
- case 0x01:
- //水下机器人信息
- DecodeData.decodeRobotInfo(data);
- break;
- case 0x02:
- //算法结果
-
- break;
- case 0x03:
- //任务数据还需要细分
-
- break;
- case 0x04:
- //短信内容
- DecodeData.decodeSMS(data);
-
- /**
- * Socket返回数据给西工大
- * */
- ctx.write(EncodeData.encodeSMS(""));
- break;
- case 0x05:
- //环境数据请求
- EncodeData.encodeEnvironment("");
- break;
- case 0x06:
- //AIS数据请求
- EncodeData.encodeAIS("");
- break;
- case 0x07:
- //方舱位置
- DecodeData.decodeShelterPosition(data);
- break;
- default:
- break;
- }
- }
+ socketService.communicate(ctx, msg);
}
@Override
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
deleted file mode 100644
index 4c9513b..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.casic.missiles.socket;
-
-import io.netty.channel.Channel;
-import io.netty.handler.codec.string.StringDecoder;
-import io.netty.handler.codec.string.StringEncoder;
-
-/**
- * @author a203
- */
-public class ChannelInitializer extends io.netty.channel.ChannelInitializer {
-
- @Override
- protected void initChannel(Channel channel) {
- // ChannelOutboundHandler,依照逆序执行
- channel.pipeline().addLast("encoder", new StringEncoder());
-
- // 属于ChannelInboundHandler,依照顺序执行
- channel.pipeline().addLast("decoder", new StringDecoder());
- /**
- * 自定义ChannelInboundHandlerAdapter
- */
- channel.pipeline().addLast(new ChannelHandlerAdapter());
- }
-}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java
new file mode 100644
index 0000000..9bae1d5
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.socket.service;
+
+import io.netty.channel.ChannelHandlerContext;
+
+/**
+ * @author a203
+ */
+public interface ISocketService {
+ /**
+ * Socket数据通信接口
+ *
+ * @param ctx 通道上下文
+ * @param msg 读取到的数据
+ */
+ void communicate(ChannelHandlerContext ctx, Object msg);
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
new file mode 100644
index 0000000..85c2bc5
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
@@ -0,0 +1,135 @@
+package com.casic.missiles.socket.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.casic.missiles.modular.system.dto.ShipDTO;
+import com.casic.missiles.modular.system.dto.TyphoonDTO;
+import com.casic.missiles.modular.system.service.IShipService;
+import com.casic.missiles.modular.system.service.ITyphoonService;
+import com.casic.missiles.modular.system.utils.Constant;
+import com.casic.missiles.modular.system.utils.DecodeData;
+import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
+import io.netty.channel.ChannelHandlerContext;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author a203
+ */
+@Slf4j
+@Service
+public class SocketServiceImpl implements ISocketService {
+
+
+ private final ITyphoonService typhoonService;
+ private final IShipService shipService;
+
+ public SocketServiceImpl(ITyphoonService typhoonService, IShipService shipService) {
+ this.typhoonService = typhoonService;
+ this.shipService = shipService;
+ }
+
+ private boolean isCorrectData(int[] bytes) {
+ if (bytes[0] != Constant.BITS_OF_HEAD) {
+ return false;
+ }
+ return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ }
+
+ private int decodeRobotId(int[] bytes) {
+ int robotId;
+ if (Constant.SHELTER_ID == bytes[4]) {
+ //返回方舱的周围的AIS数据
+ robotId = 0;
+ } else {
+ //返回机器人的周围的AIS数据
+ robotId = bytes[4];
+ }
+ return robotId;
+ }
+
+ /**
+ * Socket数据通信接口
+ *
+ * @param ctx 通道上下文
+ * @param msg 读取到的数据
+ */
+ @Override
+ public void communicate(ChannelHandlerContext ctx, Object msg) {
+ String temp = msg.toString();
+ log.info("channelRead message ===> " + temp);
+ /**
+ * 回应客户端
+ * */
+ String[] dataArray = temp.split(" ");
+ int[] data = new int[dataArray.length];
+ for (int i = 0; i < dataArray.length; i++) {
+ data[i] = Integer.parseInt(dataArray[i], 16);
+ }
+ if (isCorrectData(data)) {
+ int dataType = data[2];
+ int robotId = decodeRobotId(data);
+ /**
+ * 先解析再回应
+ * */
+ switch (dataType) {
+ case 0x01:
+ //水下机器人信息
+ DecodeData.decodeRobotInfo(data);
+ break;
+ case 0x02:
+ //算法结果
+
+ break;
+ case 0x03:
+ //任务数据还需要细分
+
+ break;
+ case 0x04:
+ /**
+ * 短信内容
+ *
+ * 西工大通过Socket发短信给我们,然后我们用卫星发送给我们自己的岸基软件,然后再传给西工大岸基软件
+ * */
+ String decodeSMS = DecodeData.decodeSMS(data);
+ log.info("decodeSMS ===> " + decodeSMS);
+
+ /**
+ * 与卫星通信
+ * */
+
+ /**
+ * Socket返回数据给西工大
+ * */
+ ctx.write(EncodeData.encodeSMS(decodeSMS));
+ break;
+ case 0x05:
+ //环境数据请求
+ List typhoonList = typhoonService.currentTyphoonList();
+ /**
+ * 如果有多个台风,只返回距离当前机器人或者方舱最近的台风信息
+ * */
+ Map objectMap = EncodeData.encodeEnvironment(
+ robotId, JSON.toJSONString(typhoonList),
+ "2021-10-22", "0", "10");
+ ctx.writeAndFlush(JSON.toJSONString(objectMap));
+ break;
+ case 0x06:
+ //AIS数据请求
+ List ships = shipService.shipsInCircle("10448984,68042960,50", 30);
+ Map map = EncodeData.encodeAIS(robotId, JSON.toJSONString(ships));
+ ctx.writeAndFlush(JSON.toJSONString(map));
+ break;
+ case 0x07:
+ //方舱位置
+ DecodeData.decodeShelterPosition(data);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 3c096f1..d7d5443 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -40,6 +40,16 @@
casic-server-support
1.0.0
+
+ com.casic
+ casic-environment
+ ${pro.version}
+
+
+ com.casic
+ casic-ship
+ ${pro.version}
+
com.alibaba
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index ea31852..dc69c33 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -9,6 +9,7 @@
public static final int BITS_OF_HEAD = 0x2A;
public static final int BITS_OF_END = 0x0A;
+ public static final int SHELTER_ID = 0xFF;
/**
* 洋流相关常量
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index bc0e41e..8ac0ba6 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -28,10 +28,10 @@
/**
* 环境数据
*/
- public static Map encodeEnvironment(String data) {
+ public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "Env");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
EnvironmentDTO dto = new EnvironmentDTO();
//台风中心经度
@@ -75,10 +75,10 @@
/**
* AIS数据
*/
- public static Map encodeAIS(String data) {
+ public static Map encodeAIS(int robotId, String data) {
Map resultMap = createDataHead("AIS");
resultMap.put("type", "AIS");
- resultMap.put("robotID", 0);
+ resultMap.put("robotID", robotId);
//船只数量
int shipCount = 2;
List positionBeans = new ArrayList<>();
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
index 02f5ba2..bc8a81e 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java
@@ -1,13 +1,14 @@
package com.casic.missiles.socket;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.AdaptiveRecvByteBufAllocator;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
+import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
@@ -15,6 +16,13 @@
*/
@Slf4j
public class BootNettyServer {
+
+ private final ISocketService socketService;
+
+ public BootNettyServer(ISocketService socketService) {
+ this.socketService = socketService;
+ }
+
public void bind(int port) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
@@ -26,17 +34,31 @@
/**
* 设置group,将bossGroup,workerGroup线程组传递到ServerBootstrap
*/
- serverBootstrap = serverBootstrap.group(bossGroup, workerGroup);
- /**
- * ServerSocketChannel是以NIO的selector为基础进行实现的,用来接收新的连接,这里告诉Channel通过NioServerSocketChannel获取新的连接
- */
- serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap = serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
- serverBootstrap = serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 10496, 1048576));
+ serverBootstrap.group(bossGroup, workerGroup);
+ serverBootstrap.channel(NioServerSocketChannel.class);
+ //连接数
+ serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
+ //长连接
+ serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
+ //缓冲大小,initial要介于minimum和maximum之间
+ serverBootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(512, 1024, 2048));
/**
* 设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
*/
- serverBootstrap = serverBootstrap.childHandler(new ChannelInitializer());
+ serverBootstrap.childHandler(new ChannelInitializer() {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ ChannelPipeline pipeline = socketChannel.pipeline();
+
+ pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ /**
+ * 自定义ChannelInboundHandlerAdapter
+ */
+ pipeline.addLast(new ChannelHandlerAdapter(socketService));
+ }
+ });
log.info("端口已开启,占用" + port + "端口号....");
/**
* 绑定端口,同步等待成功
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
index 7aa4a6a..2725560 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelHandlerAdapter.java
@@ -1,8 +1,6 @@
package com.casic.missiles.socket;
-import com.casic.missiles.modular.system.utils.Constant;
-import com.casic.missiles.modular.system.utils.DecodeData;
-import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -15,68 +13,15 @@
@Slf4j
public class ChannelHandlerAdapter extends ChannelInboundHandlerAdapter {
- public static boolean isCorrectData(int[] bytes) {
- if (bytes[0] != Constant.BITS_OF_HEAD) {
- return false;
- }
- return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ private final ISocketService socketService;
+
+ public ChannelHandlerAdapter(ISocketService socketService) {
+ this.socketService = socketService;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
- String temp = msg.toString();
- log.info("channelRead message ===> " + temp);
- /**
- * 回应客户端
- * */
- String[] dataArray = temp.split(" ");
- int[] data = new int[dataArray.length];
- for (int i = 0; i < dataArray.length; i++) {
- data[i] = Integer.parseInt(dataArray[i], 16);
- }
- if (isCorrectData(data)) {
- int dataType = data[2];
- /**
- * 先解析再回应
- * */
- switch (dataType) {
- case 0x01:
- //水下机器人信息
- DecodeData.decodeRobotInfo(data);
- break;
- case 0x02:
- //算法结果
-
- break;
- case 0x03:
- //任务数据还需要细分
-
- break;
- case 0x04:
- //短信内容
- DecodeData.decodeSMS(data);
-
- /**
- * Socket返回数据给西工大
- * */
- ctx.write(EncodeData.encodeSMS(""));
- break;
- case 0x05:
- //环境数据请求
- EncodeData.encodeEnvironment("");
- break;
- case 0x06:
- //AIS数据请求
- EncodeData.encodeAIS("");
- break;
- case 0x07:
- //方舱位置
- DecodeData.decodeShelterPosition(data);
- break;
- default:
- break;
- }
- }
+ socketService.communicate(ctx, msg);
}
@Override
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
deleted file mode 100644
index 4c9513b..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/ChannelInitializer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.casic.missiles.socket;
-
-import io.netty.channel.Channel;
-import io.netty.handler.codec.string.StringDecoder;
-import io.netty.handler.codec.string.StringEncoder;
-
-/**
- * @author a203
- */
-public class ChannelInitializer extends io.netty.channel.ChannelInitializer {
-
- @Override
- protected void initChannel(Channel channel) {
- // ChannelOutboundHandler,依照逆序执行
- channel.pipeline().addLast("encoder", new StringEncoder());
-
- // 属于ChannelInboundHandler,依照顺序执行
- channel.pipeline().addLast("decoder", new StringDecoder());
- /**
- * 自定义ChannelInboundHandlerAdapter
- */
- channel.pipeline().addLast(new ChannelHandlerAdapter());
- }
-}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java
new file mode 100644
index 0000000..9bae1d5
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/ISocketService.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.socket.service;
+
+import io.netty.channel.ChannelHandlerContext;
+
+/**
+ * @author a203
+ */
+public interface ISocketService {
+ /**
+ * Socket数据通信接口
+ *
+ * @param ctx 通道上下文
+ * @param msg 读取到的数据
+ */
+ void communicate(ChannelHandlerContext ctx, Object msg);
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
new file mode 100644
index 0000000..85c2bc5
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
@@ -0,0 +1,135 @@
+package com.casic.missiles.socket.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.casic.missiles.modular.system.dto.ShipDTO;
+import com.casic.missiles.modular.system.dto.TyphoonDTO;
+import com.casic.missiles.modular.system.service.IShipService;
+import com.casic.missiles.modular.system.service.ITyphoonService;
+import com.casic.missiles.modular.system.utils.Constant;
+import com.casic.missiles.modular.system.utils.DecodeData;
+import com.casic.missiles.modular.system.utils.EncodeData;
+import com.casic.missiles.socket.service.ISocketService;
+import io.netty.channel.ChannelHandlerContext;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author a203
+ */
+@Slf4j
+@Service
+public class SocketServiceImpl implements ISocketService {
+
+
+ private final ITyphoonService typhoonService;
+ private final IShipService shipService;
+
+ public SocketServiceImpl(ITyphoonService typhoonService, IShipService shipService) {
+ this.typhoonService = typhoonService;
+ this.shipService = shipService;
+ }
+
+ private boolean isCorrectData(int[] bytes) {
+ if (bytes[0] != Constant.BITS_OF_HEAD) {
+ return false;
+ }
+ return bytes[bytes.length - 1] == Constant.BITS_OF_END;
+ }
+
+ private int decodeRobotId(int[] bytes) {
+ int robotId;
+ if (Constant.SHELTER_ID == bytes[4]) {
+ //返回方舱的周围的AIS数据
+ robotId = 0;
+ } else {
+ //返回机器人的周围的AIS数据
+ robotId = bytes[4];
+ }
+ return robotId;
+ }
+
+ /**
+ * Socket数据通信接口
+ *
+ * @param ctx 通道上下文
+ * @param msg 读取到的数据
+ */
+ @Override
+ public void communicate(ChannelHandlerContext ctx, Object msg) {
+ String temp = msg.toString();
+ log.info("channelRead message ===> " + temp);
+ /**
+ * 回应客户端
+ * */
+ String[] dataArray = temp.split(" ");
+ int[] data = new int[dataArray.length];
+ for (int i = 0; i < dataArray.length; i++) {
+ data[i] = Integer.parseInt(dataArray[i], 16);
+ }
+ if (isCorrectData(data)) {
+ int dataType = data[2];
+ int robotId = decodeRobotId(data);
+ /**
+ * 先解析再回应
+ * */
+ switch (dataType) {
+ case 0x01:
+ //水下机器人信息
+ DecodeData.decodeRobotInfo(data);
+ break;
+ case 0x02:
+ //算法结果
+
+ break;
+ case 0x03:
+ //任务数据还需要细分
+
+ break;
+ case 0x04:
+ /**
+ * 短信内容
+ *
+ * 西工大通过Socket发短信给我们,然后我们用卫星发送给我们自己的岸基软件,然后再传给西工大岸基软件
+ * */
+ String decodeSMS = DecodeData.decodeSMS(data);
+ log.info("decodeSMS ===> " + decodeSMS);
+
+ /**
+ * 与卫星通信
+ * */
+
+ /**
+ * Socket返回数据给西工大
+ * */
+ ctx.write(EncodeData.encodeSMS(decodeSMS));
+ break;
+ case 0x05:
+ //环境数据请求
+ List typhoonList = typhoonService.currentTyphoonList();
+ /**
+ * 如果有多个台风,只返回距离当前机器人或者方舱最近的台风信息
+ * */
+ Map objectMap = EncodeData.encodeEnvironment(
+ robotId, JSON.toJSONString(typhoonList),
+ "2021-10-22", "0", "10");
+ ctx.writeAndFlush(JSON.toJSONString(objectMap));
+ break;
+ case 0x06:
+ //AIS数据请求
+ List ships = shipService.shipsInCircle("10448984,68042960,50", 30);
+ Map map = EncodeData.encodeAIS(robotId, JSON.toJSONString(ships));
+ ctx.writeAndFlush(JSON.toJSONString(map));
+ break;
+ case 0x07:
+ //方舱位置
+ DecodeData.decodeShelterPosition(data);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
index 7ad77bb..061802a 100644
--- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
+++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
@@ -1,6 +1,7 @@
package com.casic.missiles;
import com.casic.missiles.socket.BootNettyServer;
+import com.casic.missiles.socket.service.ISocketService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
@@ -13,6 +14,8 @@
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+import javax.annotation.Resource;
+
/**
* SpringBoot方式启动类
*
@@ -31,6 +34,9 @@
@Value("${socket.port}")
private Integer port;
+ @Resource
+ private ISocketService socketService;
+
public static void main(String[] args) {
SpringApplication.run(CasicApplication.class, args);
log.info("CasicApplication is success!");
@@ -42,6 +48,6 @@
/**
* 使用异步注解方式启动netty服务端服务
*/
- new BootNettyServer().bind(port);
+ new BootNettyServer(socketService).bind(port);
}
}