diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/casic/util/ServerTest.java b/src/main/java/com/casic/util/ServerTest.java new file mode 100644 index 0000000..53ba687 --- /dev/null +++ b/src/main/java/com/casic/util/ServerTest.java @@ -0,0 +1,38 @@ +package com.casic.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 服务器socket + */ +public class ServerTest { + public static void main(String[] args) { + try { + ServerSocket serverSocket = new ServerSocket(11321); + System.out.println("----------------服务端执行,開始监听请求----------------"); + + Socket socket = serverSocket.accept();//開始监听 + InputStream inputStream = socket.getInputStream(); + //获取请求内容 + String info; + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + while ((info = bufferedReader.readLine()) != null) { + System.out.println("我是服务端,客户端请求为:" + info); + } + //关闭资源 + socket.shutdownInput(); + bufferedReader.close(); + inputStream.close(); + socket.close(); + serverSocket.close(); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/casic/util/ServerTest.java b/src/main/java/com/casic/util/ServerTest.java new file mode 100644 index 0000000..53ba687 --- /dev/null +++ b/src/main/java/com/casic/util/ServerTest.java @@ -0,0 +1,38 @@ +package com.casic.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 服务器socket + */ +public class ServerTest { + public static void main(String[] args) { + try { + ServerSocket serverSocket = new ServerSocket(11321); + System.out.println("----------------服务端执行,開始监听请求----------------"); + + Socket socket = serverSocket.accept();//開始监听 + InputStream inputStream = socket.getInputStream(); + //获取请求内容 + String info; + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + while ((info = bufferedReader.readLine()) != null) { + System.out.println("我是服务端,客户端请求为:" + info); + } + //关闭资源 + socket.shutdownInput(); + bufferedReader.close(); + inputStream.close(); + socket.close(); + serverSocket.close(); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..290d6f6 --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: cz + * @Date: 2022-04-19 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/casic/util/ServerTest.java b/src/main/java/com/casic/util/ServerTest.java new file mode 100644 index 0000000..53ba687 --- /dev/null +++ b/src/main/java/com/casic/util/ServerTest.java @@ -0,0 +1,38 @@ +package com.casic.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 服务器socket + */ +public class ServerTest { + public static void main(String[] args) { + try { + ServerSocket serverSocket = new ServerSocket(11321); + System.out.println("----------------服务端执行,開始监听请求----------------"); + + Socket socket = serverSocket.accept();//開始监听 + InputStream inputStream = socket.getInputStream(); + //获取请求内容 + String info; + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + while ((info = bufferedReader.readLine()) != null) { + System.out.println("我是服务端,客户端请求为:" + info); + } + //关闭资源 + socket.shutdownInput(); + bufferedReader.close(); + inputStream.close(); + socket.close(); + serverSocket.close(); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..290d6f6 --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: cz + * @Date: 2022-04-19 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..20205e3 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ +server: + port: 11315 +################### spring配置 ################### +spring: + datasource: + driverClassName: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@139.198.18.188:1521:WDMA + username: sensor + password: sensor + jms: + pub-sub-domain: false + +logging: + level.root: error + level.com.casic: info + file: + path: logs/ + name: missiles.log \ No newline at end of file diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/casic/util/ServerTest.java b/src/main/java/com/casic/util/ServerTest.java new file mode 100644 index 0000000..53ba687 --- /dev/null +++ b/src/main/java/com/casic/util/ServerTest.java @@ -0,0 +1,38 @@ +package com.casic.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 服务器socket + */ +public class ServerTest { + public static void main(String[] args) { + try { + ServerSocket serverSocket = new ServerSocket(11321); + System.out.println("----------------服务端执行,開始监听请求----------------"); + + Socket socket = serverSocket.accept();//開始监听 + InputStream inputStream = socket.getInputStream(); + //获取请求内容 + String info; + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + while ((info = bufferedReader.readLine()) != null) { + System.out.println("我是服务端,客户端请求为:" + info); + } + //关闭资源 + socket.shutdownInput(); + bufferedReader.close(); + inputStream.close(); + socket.close(); + serverSocket.close(); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..290d6f6 --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: cz + * @Date: 2022-04-19 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..20205e3 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ +server: + port: 11315 +################### spring配置 ################### +spring: + datasource: + driverClassName: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@139.198.18.188:1521:WDMA + username: sensor + password: sensor + jms: + pub-sub-domain: false + +logging: + level.root: error + level.com.casic: info + file: + path: logs/ + name: missiles.log \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d27f7a5..4a7b9ac 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,29 +1,34 @@ -server: - port: 11315 -################### spring配置 ################### spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11102/smartwell_demos?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203! - jms: - pub-sub-domain: false - activemq: - user: - password: - broker-url: tcp://192.168.0.203:61616 - kafka: - url: http://58.250.71.201:19000/API/Table/GetRTJoinTmpStore - tableId: 66 - topic: 66 + profiles: + active: dev + servlet: + multipart: + max-file-size: 50MB + max-request-size: 80MB + mvc: + pathmatch: + matching-strategy: ant_path_matcher +mybatis-plus: + global-config: + enable-sql-runner: true + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + mapper-locations: classpath:mapper/*.xml +mybatis: + mapper-locations: classpath:mapper/*.xml +#mybatis-plus: +# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector - - - -# customer config -c-activemq: - queue-name: "hjt.msg.queue" +casic: + alarm: + rainfall: 20 + humi: 10 + temp: 10 + pressure: 15 + flow: 5 + task: + cronTime: 0 */1 * * * ? xgd: server-port: 13764 diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/casic/util/ServerTest.java b/src/main/java/com/casic/util/ServerTest.java new file mode 100644 index 0000000..53ba687 --- /dev/null +++ b/src/main/java/com/casic/util/ServerTest.java @@ -0,0 +1,38 @@ +package com.casic.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 服务器socket + */ +public class ServerTest { + public static void main(String[] args) { + try { + ServerSocket serverSocket = new ServerSocket(11321); + System.out.println("----------------服务端执行,開始监听请求----------------"); + + Socket socket = serverSocket.accept();//開始监听 + InputStream inputStream = socket.getInputStream(); + //获取请求内容 + String info; + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + while ((info = bufferedReader.readLine()) != null) { + System.out.println("我是服务端,客户端请求为:" + info); + } + //关闭资源 + socket.shutdownInput(); + bufferedReader.close(); + inputStream.close(); + socket.close(); + serverSocket.close(); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..290d6f6 --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: cz + * @Date: 2022-04-19 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..20205e3 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ +server: + port: 11315 +################### spring配置 ################### +spring: + datasource: + driverClassName: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@139.198.18.188:1521:WDMA + username: sensor + password: sensor + jms: + pub-sub-domain: false + +logging: + level.root: error + level.com.casic: info + file: + path: logs/ + name: missiles.log \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d27f7a5..4a7b9ac 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,29 +1,34 @@ -server: - port: 11315 -################### spring配置 ################### spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11102/smartwell_demos?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203! - jms: - pub-sub-domain: false - activemq: - user: - password: - broker-url: tcp://192.168.0.203:61616 - kafka: - url: http://58.250.71.201:19000/API/Table/GetRTJoinTmpStore - tableId: 66 - topic: 66 + profiles: + active: dev + servlet: + multipart: + max-file-size: 50MB + max-request-size: 80MB + mvc: + pathmatch: + matching-strategy: ant_path_matcher +mybatis-plus: + global-config: + enable-sql-runner: true + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + mapper-locations: classpath:mapper/*.xml +mybatis: + mapper-locations: classpath:mapper/*.xml +#mybatis-plus: +# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector - - - -# customer config -c-activemq: - queue-name: "hjt.msg.queue" +casic: + alarm: + rainfall: 20 + humi: 10 + temp: 10 + pressure: 15 + flow: 5 + task: + cronTime: 0 */1 * * * ? xgd: server-port: 13764 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 10b37d0..cbdc982 100644 --- a/pom.xml +++ b/pom.xml @@ -45,10 +45,9 @@ - mysql - mysql-connector-java - 8.0.16 - compile + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 diff --git a/rain_receiver.iml b/rain_receiver.iml new file mode 100644 index 0000000..5cde140 --- /dev/null +++ b/rain_receiver.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/casic/CasicApplication.java b/src/main/java/com/casic/CasicApplication.java index 71ea928..b5f3ef8 100644 --- a/src/main/java/com/casic/CasicApplication.java +++ b/src/main/java/com/casic/CasicApplication.java @@ -20,4 +20,5 @@ log.info("CasicApplication is success!"); SpringApplication.run(CasicApplication.class, args); } + } diff --git a/src/main/java/com/casic/client/Client.java b/src/main/java/com/casic/client/Client.java new file mode 100644 index 0000000..8bf0177 --- /dev/null +++ b/src/main/java/com/casic/client/Client.java @@ -0,0 +1,34 @@ +package com.casic.client; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +public class Client { + + @Autowired + private ServerPort serverPort; + + public void send(String sendMsg) throws Exception { + NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new Clientinitializer()); + ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", serverPort.getPort()).sync(); + Channel channel = channelFuture.channel(); + channel.writeAndFlush(sendMsg); + } finally { + eventLoopGroup.shutdownGracefully(); + } + } + +} + diff --git a/src/main/java/com/casic/client/ClientHandler.java b/src/main/java/com/casic/client/ClientHandler.java new file mode 100644 index 0000000..bf5236b --- /dev/null +++ b/src/main/java/com/casic/client/ClientHandler.java @@ -0,0 +1,31 @@ +package com.casic.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class ClientHandler extends SimpleChannelInboundHandler { + + //接收服务端数据&发送数据 + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + + System.out.println("客户端接收到的消息: "+msg); + + ctx.writeAndFlush("12232321"); + + //完成通信后关闭连接 + //ctx.close(); + } + + //和服务器建立连接 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + //ctx.writeAndFlush("在吗!!!!\\r\\n"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/casic/client/Clientinitializer.java b/src/main/java/com/casic/client/Clientinitializer.java new file mode 100644 index 0000000..c42ac4a --- /dev/null +++ b/src/main/java/com/casic/client/Clientinitializer.java @@ -0,0 +1,24 @@ +package com.casic.client; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; + +public class Clientinitializer extends ChannelInitializer { + + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + //数据分包,组包,粘包 + pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,1024,0,4)); + //pipeline.addLast(new LengthFieldPrepender(4)); + pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); + pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8)); + pipeline.addLast(new ClientHandler()); + + } +} diff --git a/src/main/java/com/casic/config/AlarmLevelConfig.java b/src/main/java/com/casic/config/AlarmLevelConfig.java new file mode 100644 index 0000000..258ead3 --- /dev/null +++ b/src/main/java/com/casic/config/AlarmLevelConfig.java @@ -0,0 +1,18 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.alarm") +public class AlarmLevelConfig { + + private String rainfall; + private String humi; + private String temp; + private String pressure; + private String flow; + +} diff --git a/src/main/java/com/casic/config/ServerPort.java b/src/main/java/com/casic/config/ServerPort.java new file mode 100644 index 0000000..8980e43 --- /dev/null +++ b/src/main/java/com/casic/config/ServerPort.java @@ -0,0 +1,14 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class ServerPort { + + private Integer port; + +} diff --git a/src/main/java/com/casic/config/TaskCronTimeConfig.java b/src/main/java/com/casic/config/TaskCronTimeConfig.java new file mode 100644 index 0000000..8babe82 --- /dev/null +++ b/src/main/java/com/casic/config/TaskCronTimeConfig.java @@ -0,0 +1,16 @@ +package com.casic.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "casic.task") +public class TaskCronTimeConfig { + + private String cronTime; + + + +} diff --git a/src/main/java/com/casic/config/task/TaskSchedulingConfig.java b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java new file mode 100644 index 0000000..05e6d40 --- /dev/null +++ b/src/main/java/com/casic/config/task/TaskSchedulingConfig.java @@ -0,0 +1,50 @@ +package com.casic.config.task; + +import com.casic.service.DeviceDataScanner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; + +import java.util.List; +import java.util.concurrent.Executors; + +@Slf4j +@Configuration +@EnableScheduling +public class TaskSchedulingConfig implements SchedulingConfigurer { + + @Autowired + private List deviceDataScannerList; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + log.info("扫描定时处理start..."); + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); + //执行定时任务 + taskRegistrar.addTriggerTask( + //设置日期任务 + getMangerRunnable(""), + //2.设置执行周期(Trigger) + triggerContext -> new CronTrigger("0 */1 * * * ?").nextExecutionTime(triggerContext) + ); + } + + /** + * 进行某类设备的查询,进行阈值最后一条数据进行判断,进行报警设置值 + */ + private Runnable getMangerRunnable(String DeviceType) { + return new Runnable() { + @Override + public void run() { + deviceDataScannerList.forEach( + deviceDataScanner -> deviceDataScanner.scanDeviceData() + ); + } + }; + } + +} diff --git a/src/main/java/com/casic/enums/AlarmDatagramFlag.java b/src/main/java/com/casic/enums/AlarmDatagramFlag.java new file mode 100644 index 0000000..4716be3 --- /dev/null +++ b/src/main/java/com/casic/enums/AlarmDatagramFlag.java @@ -0,0 +1,8 @@ +package com.casic.enums; + +public interface AlarmDatagramFlag { + + String alarmMark="mmmm"; + + String rainFallMark="mmmm"; +} diff --git a/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java new file mode 100644 index 0000000..3c907a9 --- /dev/null +++ b/src/main/java/com/casic/enums/RelayDevcodeMapEnums.java @@ -0,0 +1,32 @@ +package com.casic.enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * 继电器灯和设备编号的枚举关系 + */ +public enum RelayDevcodeMapEnums { + + RELAY_DEVCODE(new HashMap() { + { + put("842019010188", "1"); + put("865328068419943", "2"); + put("512023010001", "3"); + put("512023010002", "4"); + put("512023010003", "5"); + put("512023010004", "C6"); + } + }); + + public Map relayDevcodeMap; + + RelayDevcodeMapEnums(Map relayDevcodeMap) { + this.relayDevcodeMap = relayDevcodeMap; + } + + public Map getRelayDevcodeMap() { + return relayDevcodeMap; + } + +} diff --git a/src/main/java/com/casic/enums/RelaySwitchEnums.java b/src/main/java/com/casic/enums/RelaySwitchEnums.java new file mode 100644 index 0000000..c8ad6b5 --- /dev/null +++ b/src/main/java/com/casic/enums/RelaySwitchEnums.java @@ -0,0 +1,18 @@ +package com.casic.enums; + +/** + * 继电器开关枚举 + * 报警会打开开关,取消报警会自动关闭开关 + * + */ +public interface RelaySwitchEnums { + + + + + + String preFix="config,set,doout,"; + + String postFix="\r\n"; + +} diff --git a/src/main/java/com/casic/handler/ReceiverDecoder.java b/src/main/java/com/casic/handler/ReceiverDecoder.java deleted file mode 100644 index 0826d29..0000000 --- a/src/main/java/com/casic/handler/ReceiverDecoder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.util.List; - -/** - * @description: 将从接口取到的数据编码 - * @author: Stone - * @create: 2019-01-11 15:15 - **/ -@Slf4j -public class ReceiverDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { - if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { -// log.info(" String : " + msg.toString(Charset.defaultCharset())); -// if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { - pareDeviceHex(msg); -// out.add(msg); -// } - } - } - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); - String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); - log.info(" devcode : " + devcode); - byteBuf.resetReaderIndex();//重置位判断 - String valueStr=byteBuf.slice(26, 4).toString(Charset.defaultCharset()); - log.info(" valueStr : " + valueStr); - long defaultValue = Long.valueOf(valueStr); - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverDomain.java b/src/main/java/com/casic/handler/ReceiverDomain.java deleted file mode 100644 index f0a89b6..0000000 --- a/src/main/java/com/casic/handler/ReceiverDomain.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.casic.handler; - -import io.netty.buffer.ByteBuf; -import lombok.Data; - -/** - * @description: 环境数据实体类 - * @author: Stone - * @create: 2019-01-10 22:38 - **/ -@Data -public class ReceiverDomain { - private String head; - private int len; - private String key; - private String value; - - public ReceiverDomain(ByteBuf bf) { - } - -} diff --git a/src/main/java/com/casic/handler/ReceiverServer.java b/src/main/java/com/casic/handler/ReceiverServer.java deleted file mode 100644 index 6894a00..0000000 --- a/src/main/java/com/casic/handler/ReceiverServer.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.handler; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @description: 接收客户端传过来的数据,只做打印处理 - * @author: Stone - * @create: 2019-01-10 19:52 - **/ -@Slf4j -@Component -public class ReceiverServer { - - @Autowired - private ReceiverServerHandler receiverServerHandler; - - @Value("${xgd.server-port}") - private int port; - - - - @PostConstruct - public void init() { - this.start(); - } - - public void start() { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - log.info("server bind port = {}", port); - - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); - serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); - serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); - - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { -// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); - socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); - socketChannel.pipeline().addLast(new ReceiverDecoder()); - socketChannel.pipeline().addLast(new StringDecoder()); - socketChannel.pipeline().addLast(receiverServerHandler); - } - }); - - serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); - try { - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/casic/handler/ReceiverServerHandler.java b/src/main/java/com/casic/handler/ReceiverServerHandler.java deleted file mode 100644 index f432e06..0000000 --- a/src/main/java/com/casic/handler/ReceiverServerHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.casic.handler; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.javassist.bytecode.ByteArray; -import org.springframework.stereotype.Component; - -/** - * @description: 消息处理handler - * @author: Stone - * @create: 2019-01-10 20:01 - **/ -@Slf4j -@Component -@ChannelHandler.Sharable -public class ReceiverServerHandler extends ChannelInboundHandlerAdapter { - - public ReceiverServerHandler() { - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); -// log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME,(String)msg); - log.info("[{}] : msg = {}", ctx.channel().remoteAddress(), msg); - String msgStr = msg.toString(); - // 以固定行分隔符结尾分割,头部可能有不符合接口协议的字段, 去掉 - int idx = msgStr.indexOf("##"); - if (idx >= 0) { - msgStr = msgStr.substring(idx); - } -// msgProducerService.sendMsg(Common.ACTIVEMQ_QUEUE_NAME, msgStr); - } - -// //ByteBuf byteBuf - public static void main(String[] main) { - byte[] hexBytes = {(byte) 0x86, 0x53, 0x28, 0x06, (byte) 0x84, 0x19, (byte) 0x94, - 0x30, (byte) 0xAA, (byte) 0xAA, 0x01, 0x03, (byte) 0x02, 0x02, 0x00, (byte) 0xB8, 0x44}; - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); - out.writeBytes(hexBytes); - - if (ByteBufUtil.hexDump(out).toLowerCase().contains("aaaa")) { - pareDeviceHex(out); - } - } - - - private static void pareDeviceHex(ByteBuf byteBuf) { - //去掉补位 - String devcode = ByteBufUtil.hexDump(byteBuf.slice(0, 8)); - devcode = devcode.substring(0, devcode.length() - 1); - //数值读取 - byteBuf.readBytes(12); - byteBuf.markReaderIndex(); - Integer defaultValueLength = byteBuf.readByte() & 0xff; - long defaultValue = 0; - for (int i = 0; i < defaultValueLength; i++) { - long tempLong = byteBuf.readByte() & 0xff; - defaultValue = defaultValue * 256 + tempLong; - } - log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); -// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/casic/mapper/DeviceDataMapper.java b/src/main/java/com/casic/mapper/DeviceDataMapper.java new file mode 100644 index 0000000..be72d19 --- /dev/null +++ b/src/main/java/com/casic/mapper/DeviceDataMapper.java @@ -0,0 +1,28 @@ +package com.casic.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeviceDataMapper { + + + /** + * 获取压力数据 + */ + List> getPressureData(); + + /** + * 获取流量数据 + */ + List> getFlowData(); + + /** + * 获取温湿度数据 + */ + List> getHumiTemp(); + + +} diff --git a/src/main/java/com/casic/mapper/RainFallDataMapper.java b/src/main/java/com/casic/mapper/RainFallDataMapper.java new file mode 100644 index 0000000..f5c29db --- /dev/null +++ b/src/main/java/com/casic/mapper/RainFallDataMapper.java @@ -0,0 +1,7 @@ +package com.casic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.RainFallData; + +public interface RainFallDataMapper extends BaseMapper { +} diff --git a/src/main/java/com/casic/model/RainFallData.java b/src/main/java/com/casic/model/RainFallData.java new file mode 100644 index 0000000..fa96673 --- /dev/null +++ b/src/main/java/com/casic/model/RainFallData.java @@ -0,0 +1,30 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("AD_YL_YLIANG") +public class RainFallData { + + private String dbid; + + private String scrid; + + private String dstid; + + private String totalyuliang; + + private String curminuteyuliang; + + private String forminuteyuliang; + + private String value; + + private Date logtime; + + private Date uptime; + +} diff --git a/src/main/java/com/casic/model/RelayStatusDTO.java b/src/main/java/com/casic/model/RelayStatusDTO.java new file mode 100644 index 0000000..b839e0c --- /dev/null +++ b/src/main/java/com/casic/model/RelayStatusDTO.java @@ -0,0 +1,20 @@ +package com.casic.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RelayStatusDTO { + + /*** + * 通道名称 1 2 3 4 5 6 7 8 + */ + private String channelName; + + /*** + * 开关0,1 + */ + private Integer lampSwitch; + +} diff --git a/src/main/java/com/casic/resolver/AlarmDataResolver.java b/src/main/java/com/casic/resolver/AlarmDataResolver.java new file mode 100644 index 0000000..2c6874b --- /dev/null +++ b/src/main/java/com/casic/resolver/AlarmDataResolver.java @@ -0,0 +1,28 @@ +package com.casic.resolver; + + +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AlarmDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Override + public RelayStatusDTO datagram(String msg) { + if(msg.contains(alarmMark)){ + //去掉补位 + String devcode = msg.substring(0, 15); + Integer isAlarm = Integer.valueOf(msg.substring(16,17)); + log.info("设备编号为" + devcode + ",是否报警" + isAlarm); + return RelayStatusDTO.builder() + .channelName( RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/casic/resolver/DatagramResolver.java b/src/main/java/com/casic/resolver/DatagramResolver.java new file mode 100644 index 0000000..d00c952 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramResolver.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +import com.casic.model.RelayStatusDTO; + +public interface DatagramResolver { + + RelayStatusDTO datagram(String msg); + +} diff --git a/src/main/java/com/casic/resolver/DatagramSupport.java b/src/main/java/com/casic/resolver/DatagramSupport.java new file mode 100644 index 0000000..1d911a3 --- /dev/null +++ b/src/main/java/com/casic/resolver/DatagramSupport.java @@ -0,0 +1,9 @@ +package com.casic.resolver; + +public class DatagramSupport { + + + + + +} diff --git a/src/main/java/com/casic/resolver/RainFallDataResolver.java b/src/main/java/com/casic/resolver/RainFallDataResolver.java new file mode 100644 index 0000000..8a22899 --- /dev/null +++ b/src/main/java/com/casic/resolver/RainFallDataResolver.java @@ -0,0 +1,79 @@ +package com.casic.resolver; + +import com.alibaba.druid.util.StringUtils; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.enums.RelayDevcodeMapEnums; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.model.RelayStatusDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +@Slf4j +public class RainFallDataResolver implements DatagramResolver, AlarmDatagramFlag { + + @Autowired + private RainFallDataMapper rainFallDataMapper; + @Autowired + private AlarmLevelConfig alarmLevelConfig; + + @Override + public RelayStatusDTO datagram(String msg) { + if (msg.contains(rainFallMark)) { + //去掉补位 + String devcode = msg.substring(0, 15); + String defaultValue = msg.substring(26, 30); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + RainFallData rainFallData = initRainFallData(devcode, defaultValue); + rainFallDataMapper.insert(rainFallData); + Integer isAlarm = isAlarm(String.valueOf(defaultValue), alarmLevelConfig.getRainfall()); + return RelayStatusDTO.builder() + .channelName(RelayDevcodeMapEnums.RELAY_DEVCODE.getRelayDevcodeMap().get(devcode)) + .lampSwitch(isAlarm) + .build(); + } + return null; + + } + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + private RainFallData initRainFallData(String devcode, String valueStr) { + RainFallData rainFallData = new RainFallData(); + rainFallData.setDstid(devcode); + rainFallData.setTotalyuliang(valueStr); + rainFallData.setUptime(new Date()); + rainFallData.setLogtime(new Date()); + return rainFallData; + } + + // //ByteBuf byteBuf + public static void main(String[] main) { + pareDeviceHex("8653280684199430AAAA01030200023985"); + } + + private static void pareDeviceHex(String msg) { + //去掉补位 + String devcode = msg.substring(0, 15); + log.info(" devcode : " + devcode); + String valueStr = msg.substring(26, 30); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverDecoder.java b/src/main/java/com/casic/server/ReceiverDecoder.java new file mode 100644 index 0000000..7030790 --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverDecoder.java @@ -0,0 +1,71 @@ +package com.casic.server; + +import com.casic.enums.RelaySwitchEnums; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * 自定义解码器 + * + * @description: 将从接口取到的数据编码 + * @author: cz + * @create: 2023-5-10 + **/ +@Slf4j +public class ReceiverDecoder extends ByteToMessageDecoder implements RelaySwitchEnums { + + +// final ChannelGroup channels = +// new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.toString(Charset.defaultCharset()).toLowerCase().contains("aaaa")) { + pareDeviceHex(msg); + } +// if(msg.readableBytes()>2){ +// out.add(msg); +// } + } + +// @Override +// public void channelActive(ChannelHandlerContext ctx) throws Exception { +// channels.add(ctx.channel()); +// super.channelActive(ctx); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); +// ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); +// String switchConent = preFix + 1 + "," + 1 + postFix; +// out.writeBytes(switchConent.getBytes()); +// channels.forEach( +// channel ->{ +// if(channel!=ctx.channel()) { +// channel.writeAndFlush(out); +// } +// } +// ); +// } + + private static void pareDeviceHex(ByteBuf byteBuf) { + //去掉补位 + log.info(" String : " + byteBuf.toString(Charset.defaultCharset())); + String devcode = byteBuf.slice(0, 15).toString(Charset.defaultCharset()); + log.info(" devcode : " + devcode); + byteBuf.resetReaderIndex();//重置位判断 + String valueStr = byteBuf.slice(26, 4).toString(Charset.defaultCharset()); + log.info(" valueStr : " + valueStr); + long defaultValue = Long.valueOf(valueStr); + log.info("设备编号为" + devcode + ",设备数据为" + defaultValue); +// System.out.println("设备编号为" + devcode + ",设备数据为" + defaultValue); + } + +} diff --git a/src/main/java/com/casic/server/ReceiverServer.java b/src/main/java/com/casic/server/ReceiverServer.java new file mode 100644 index 0000000..a98e4ca --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServer.java @@ -0,0 +1,72 @@ +package com.casic.server; + +import com.casic.config.ServerPort; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @description: 接收客户端传过来的数据,只做打印处理 + * @author: Stone + * @create: 2019-01-10 19:52 + **/ +@Slf4j +@Component +public class ReceiverServer { + + @Autowired + private ReceiverServerHandler receiverServerHandler; + @Autowired + private ServerPort serverPort; + + @PostConstruct + public void init() { + this.start(); + } + + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + log.info("server bind port = {}", serverPort.getPort()); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap = serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap = serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); + serverBootstrap = serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); +// socketChannel.pipeline().addLast(new ReceiverDecoder()); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(receiverServerHandler); + } + }); + serverBootstrap = serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + try { + ChannelFuture channelFuture = serverBootstrap.bind(serverPort.getPort()).sync(); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/src/main/java/com/casic/server/ReceiverServerHandler.java b/src/main/java/com/casic/server/ReceiverServerHandler.java new file mode 100644 index 0000000..31ac43e --- /dev/null +++ b/src/main/java/com/casic/server/ReceiverServerHandler.java @@ -0,0 +1,103 @@ +package com.casic.server; + + +import com.casic.enums.RelaySwitchEnums; +import com.casic.model.RelayStatusDTO; +import com.casic.resolver.RainFallDataResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.util.concurrent.GlobalEventExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * @description: 消息处理handler + * @author: Stone + * @create: 2019-01-10 20:01 + **/ +@Slf4j +@Component +@ChannelHandler.Sharable +public class ReceiverServerHandler extends ChannelInboundHandlerAdapter implements RelaySwitchEnums { + + final ChannelGroup channels = + new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + + @Autowired + private List rainFallDataResolverList; + + public ReceiverServerHandler() { + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + channels.add(ctx.channel()); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + channels.forEach(channel -> { + if (channel == ctx.channel()) { + channels.remove(channel); + } + } + ); + super.channelInactive(ctx); + } + + /** + * 雨量计 + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof String) { + rainFallDataResolverList.forEach( + rainFallDataResolver -> { + RelayStatusDTO relayStatusDTO = rainFallDataResolver.datagram(String.valueOf(msg)); + sendMsg(ctx, relayStatusDTO); + } + ); + } + super.channelRead(ctx, msg); + } + + private void sendMsg(ChannelHandlerContext ctx, RelayStatusDTO relayStatusDTO) { + if (!ObjectUtils.isEmpty(relayStatusDTO)) { + ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); + String switchConent = preFix + relayStatusDTO.getChannelName() + "," + relayStatusDTO.getLampSwitch() + postFix; + out.writeBytes(switchConent.getBytes()); + channels.forEach(channel -> { + if (channel.isActive()) { + if (channel != ctx.channel()) { + channel.writeAndFlush(out); + } + } + } + ); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/casic/service/DeviceDataScanner.java b/src/main/java/com/casic/service/DeviceDataScanner.java new file mode 100644 index 0000000..049fa71 --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataScanner.java @@ -0,0 +1,7 @@ +package com.casic.service; + +public interface DeviceDataScanner { + + void scanDeviceData(); + +} diff --git a/src/main/java/com/casic/service/DeviceDataSupport.java b/src/main/java/com/casic/service/DeviceDataSupport.java new file mode 100644 index 0000000..93d61ea --- /dev/null +++ b/src/main/java/com/casic/service/DeviceDataSupport.java @@ -0,0 +1,50 @@ +package com.casic.service; + +import com.alibaba.druid.util.StringUtils; +import com.casic.client.Client; +import com.casic.config.AlarmLevelConfig; +import com.casic.enums.AlarmDatagramFlag; +import com.casic.mapper.DeviceDataMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + */ +@Slf4j +@Component +public class DeviceDataSupport implements AlarmDatagramFlag { + + @Autowired + protected DeviceDataMapper deviceDataMapper; + @Autowired + protected AlarmLevelConfig alarmLevelConfig; + @Autowired + private Client client; + + /** + * 比较是否报警 报警/正常 1/0 + */ + protected Integer isAlarm(String realData, String thresholdValue) { + if (!StringUtils.isEmpty(realData) && StringUtils.isEmpty(thresholdValue)) { + if (Float.valueOf(realData) >= Float.valueOf(thresholdValue)) { + return 1; + } + } + return 0; + } + + /** + * 发送报警消息 + */ + protected void sendAlarmMsg(String devcode, Integer isAlarm) { + try { + String alarmMsg = devcode + alarmMark + isAlarm; + client.send(alarmMsg); + } catch (Exception ex) { + log.error("消息发送失败,设备编号为{},异常信息{}", devcode, ex.getMessage()); + } + } + +} diff --git a/src/main/java/com/casic/service/RainFallDataService.java b/src/main/java/com/casic/service/RainFallDataService.java new file mode 100644 index 0000000..6c1a12d --- /dev/null +++ b/src/main/java/com/casic/service/RainFallDataService.java @@ -0,0 +1,6 @@ +package com.casic.service; + +public interface RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java new file mode 100644 index 0000000..14dc1eb --- /dev/null +++ b/src/main/java/com/casic/service/impl/RainFallDataServiceImpl.java @@ -0,0 +1,13 @@ +package com.casic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.RainFallDataMapper; +import com.casic.model.RainFallData; +import com.casic.service.RainFallDataService; +import org.springframework.stereotype.Service; + +@Service +public class RainFallDataServiceImpl extends ServiceImpl implements RainFallDataService { + + +} diff --git a/src/main/java/com/casic/service/scanner/FlowDataScanner.java b/src/main/java/com/casic/service/scanner/FlowDataScanner.java new file mode 100644 index 0000000..7ab7228 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/FlowDataScanner.java @@ -0,0 +1,28 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FlowDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getFlow(); + List> flowDataMapList = this.deviceDataMapper.getFlowData(); + flowDataMapList.forEach( + flowDataMap -> { + String devcode = flowDataMap.get("devcode").toString(); + String insdata = flowDataMap.get("insdata").toString(); + Integer isAlarm = isAlarm(insdata, thresholdValue); + sendAlarmMsg(devcode, isAlarm); + } + ); + } + + +} diff --git a/src/main/java/com/casic/service/scanner/PressDataScanner.java b/src/main/java/com/casic/service/scanner/PressDataScanner.java new file mode 100644 index 0000000..6738c38 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/PressDataScanner.java @@ -0,0 +1,29 @@ +package com.casic.service.scanner; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.mapper.DeviceDataMapper; +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PressDataScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String thresholdValue = alarmLevelConfig.getPressure(); + List> pressDataMapList = this.deviceDataMapper.getPressureData(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String pressdata = pressDataMap.get("pressdata").toString(); + Integer isAlarm=isAlarm(pressdata,thresholdValue); + sendAlarmMsg(devcode,isAlarm); + } + ); + } + +} diff --git a/src/main/java/com/casic/service/scanner/TempHumiScanner.java b/src/main/java/com/casic/service/scanner/TempHumiScanner.java new file mode 100644 index 0000000..a9efc57 --- /dev/null +++ b/src/main/java/com/casic/service/scanner/TempHumiScanner.java @@ -0,0 +1,34 @@ +package com.casic.service.scanner; + +import com.casic.service.DeviceDataScanner; +import com.casic.service.DeviceDataSupport; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class TempHumiScanner extends DeviceDataSupport implements DeviceDataScanner { + + @Override + public void scanDeviceData() { + String humiThreshold = alarmLevelConfig.getHumi(); + String tempThreshold = alarmLevelConfig.getTemp(); + List> pressDataMapList = this.deviceDataMapper.getHumiTemp(); + pressDataMapList.forEach( + pressDataMap -> { + String devcode = pressDataMap.get("devcode").toString(); + String temperatureData = pressDataMap.get("temperature").toString(); + Integer isTempAlarm = isAlarm(temperatureData, tempThreshold); + String humidityData = pressDataMap.get("humidity").toString(); + Integer isHumiAlarm = isAlarm(humidityData, humiThreshold); + if (isHumiAlarm == 0 && isTempAlarm == 0) { + sendAlarmMsg(devcode, 0); + } else { + sendAlarmMsg(devcode, 1); + } + } + ); + } + +} diff --git a/src/main/java/com/casic/util/Client.java b/src/main/java/com/casic/util/Client.java deleted file mode 100644 index a416600..0000000 --- a/src/main/java/com/casic/util/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.util; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 客户端socket - */ -public class Client { - public static void main(String[] args) { - try { - //发送到8888端口 - Socket socket = new Socket("127.0.0.1", 11321); - //输出流 - OutputStream outputStream = socket.getOutputStream(); - PrintWriter printWriter = new PrintWriter(outputStream); - printWriter.write("服务端你好,我是客户端"); - printWriter.flush(); - //关闭资源 - printWriter.close(); - outputStream.close(); - socket.close(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/casic/util/ClientTest.java b/src/main/java/com/casic/util/ClientTest.java new file mode 100644 index 0000000..4c1bf65 --- /dev/null +++ b/src/main/java/com/casic/util/ClientTest.java @@ -0,0 +1,34 @@ +package com.casic.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 客户端socket + */ +public class ClientTest { + public static void main(String[] args) { + try { + //发送到8888端口 + Socket socket = new Socket("127.0.0.1", 11321); + //输出流 + OutputStream outputStream = socket.getOutputStream(); + PrintWriter printWriter = new PrintWriter(outputStream); + printWriter.write("服务端你好,我是客户端"); + printWriter.flush(); + //关闭资源 + printWriter.close(); + outputStream.close(); + socket.close(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/casic/util/Server.java b/src/main/java/com/casic/util/Server.java deleted file mode 100644 index 50c0957..0000000 --- a/src/main/java/com/casic/util/Server.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author: njb - * @Date: 2020/11/26 18:49 - * @desc: 服务器socket - */ -public class Server { - public static void main(String[] args) { - try { - ServerSocket serverSocket = new ServerSocket(11321); - System.out.println("----------------服务端执行,開始监听请求----------------"); - - Socket socket = serverSocket.accept();//開始监听 - InputStream inputStream = socket.getInputStream(); - //获取请求内容 - String info; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - while ((info = bufferedReader.readLine()) != null) { - System.out.println("我是服务端,客户端请求为:" + info); - } - //关闭资源 - socket.shutdownInput(); - bufferedReader.close(); - inputStream.close(); - socket.close(); - serverSocket.close(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/casic/util/ServerTest.java b/src/main/java/com/casic/util/ServerTest.java new file mode 100644 index 0000000..53ba687 --- /dev/null +++ b/src/main/java/com/casic/util/ServerTest.java @@ -0,0 +1,38 @@ +package com.casic.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author: njb + * @Date: 2020/11/26 18:49 + * @desc: 服务器socket + */ +public class ServerTest { + public static void main(String[] args) { + try { + ServerSocket serverSocket = new ServerSocket(11321); + System.out.println("----------------服务端执行,開始监听请求----------------"); + + Socket socket = serverSocket.accept();//開始监听 + InputStream inputStream = socket.getInputStream(); + //获取请求内容 + String info; + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + while ((info = bufferedReader.readLine()) != null) { + System.out.println("我是服务端,客户端请求为:" + info); + } + //关闭资源 + socket.shutdownInput(); + bufferedReader.close(); + inputStream.close(); + socket.close(); + serverSocket.close(); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/casic/util/SpringContextUtil.java b/src/main/java/com/casic/util/SpringContextUtil.java new file mode 100644 index 0000000..290d6f6 --- /dev/null +++ b/src/main/java/com/casic/util/SpringContextUtil.java @@ -0,0 +1,106 @@ +package com.casic.util; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: cz + * @Date: 2022-04-19 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + +// public static Object getBean(String beanId) throws BeansException { +// return applicationContext.getBean(beanId); +// } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (StringUtils.isNotBlank(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..20205e3 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ +server: + port: 11315 +################### spring配置 ################### +spring: + datasource: + driverClassName: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@139.198.18.188:1521:WDMA + username: sensor + password: sensor + jms: + pub-sub-domain: false + +logging: + level.root: error + level.com.casic: info + file: + path: logs/ + name: missiles.log \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d27f7a5..4a7b9ac 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,29 +1,34 @@ -server: - port: 11315 -################### spring配置 ################### spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11102/smartwell_demos?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8&&allowMultiQueries=true&&useSSL=true - username: root - password: Casic203! - jms: - pub-sub-domain: false - activemq: - user: - password: - broker-url: tcp://192.168.0.203:61616 - kafka: - url: http://58.250.71.201:19000/API/Table/GetRTJoinTmpStore - tableId: 66 - topic: 66 + profiles: + active: dev + servlet: + multipart: + max-file-size: 50MB + max-request-size: 80MB + mvc: + pathmatch: + matching-strategy: ant_path_matcher +mybatis-plus: + global-config: + enable-sql-runner: true + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + mapper-locations: classpath:mapper/*.xml +mybatis: + mapper-locations: classpath:mapper/*.xml +#mybatis-plus: +# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector - - - -# customer config -c-activemq: - queue-name: "hjt.msg.queue" +casic: + alarm: + rainfall: 20 + humi: 10 + temp: 10 + pressure: 15 + flow: 5 + task: + cronTime: 0 */1 * * * ? xgd: server-port: 13764 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/DeviceMapper.xml b/src/main/resources/mapper/DeviceMapper.xml new file mode 100644 index 0000000..95c83d2 --- /dev/null +++ b/src/main/resources/mapper/DeviceMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + \ No newline at end of file