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); } }