Slave104Handle.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package wei.yigulu.iec104.nettyconfig;
  2. import io.netty.buffer.ByteBuf;
  3. import io.netty.buffer.Unpooled;
  4. import io.netty.channel.ChannelHandlerContext;
  5. import io.netty.channel.ChannelInboundHandlerAdapter;
  6. import io.netty.channel.SimpleChannelInboundHandler;
  7. import lombok.NoArgsConstructor;
  8. import org.slf4j.Logger;
  9. import wei.yigulu.iec104.apdumodel.Apdu;
  10. import wei.yigulu.iec104.container.Iec104Link;
  11. import wei.yigulu.iec104.container.LinkContainer;
  12. import wei.yigulu.iec104.util.PropertiesReader;
  13. import wei.yigulu.utils.DataConvertor;
  14. import java.net.InetSocketAddress;
  15. /**
  16. * 消息处理类
  17. *
  18. * @author 修唯xiuwei
  19. * @version 3.0
  20. */
  21. @NoArgsConstructor
  22. public class Slave104Handle extends SimpleChannelInboundHandler<ByteBuf> {
  23. private Logger log;
  24. private static final String STARTASKPROPNAME = "haveStartAsk";
  25. private static final boolean STARTASKDEFVAL = false;
  26. private static final boolean STARTASK = PropertiesReader.getInstance().getBooleanProp(STARTASKPROPNAME, STARTASKDEFVAL);
  27. /**
  28. * Slave 104 handle
  29. *
  30. * @param slaverBuilder slaver builder
  31. */
  32. public Slave104Handle(Iec104SlaverBuilder slaverBuilder) {
  33. this.slaverBuilder = slaverBuilder;
  34. this.log = slaverBuilder.getLog();
  35. }
  36. public Slave104Handle(Iec104SlaverBuilder slaverBuilder, Class<? extends Apdu> apduClass) {
  37. this(slaverBuilder);
  38. this.apduClass = apduClass;
  39. }
  40. private Iec104SlaverBuilder slaverBuilder;
  41. private Class<? extends Apdu> apduClass = Apdu.class;
  42. @Override
  43. public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
  44. //收数据
  45. log.debug("----------------------------------------------------------------------------------");
  46. log.debug(DataConvertor.ByteBuf2String( msg));
  47. Apdu apdu = apduClass.newInstance().setChannel(ctx.channel()).setIec104Builder(slaverBuilder).setLog(slaverBuilder.getLog()).loadByteBuf(msg);
  48. apdu.answer();
  49. }
  50. @Override
  51. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  52. log.error("104Slave交互时发生异常", cause);
  53. }
  54. @Override
  55. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  56. log.debug("发出U帧,启动命令");
  57. InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
  58. String clientIp = ipSocket.getAddress().getHostAddress();
  59. Integer clientPort = ipSocket.getPort();
  60. if (!this.slaverBuilder.getConnectFilterManager().verdict(ctx.channel())) {
  61. ctx.channel().close();
  62. log.info(clientIp + ":" + clientPort + "客户端被过滤链拦截,已关闭通道");
  63. return;
  64. }
  65. log.info(clientIp + ":" + clientPort + "客户端连接");
  66. LinkContainer.getInstance().getLinks().put(ctx.channel().id(), new Iec104Link(ctx.channel(), clientIp, clientPort, Iec104Link.Role.MASTER,slaverBuilder.getLog()));
  67. this.slaverBuilder.connected(ipSocket);
  68. this.slaverBuilder.getChannels().add(ctx.channel());
  69. if (STARTASK) {
  70. ctx.writeAndFlush(Unpooled.copiedBuffer(TechnicalTerm.START));
  71. }
  72. }
  73. @Override
  74. public void channelInactive(ChannelHandlerContext ctx) throws Exception {
  75. InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
  76. String clientIp = ipSocket.getAddress().getHostAddress();
  77. Integer clientPort = ipSocket.getPort();
  78. log.info(clientIp + ":" + clientPort + "客户端断开连接");
  79. this.slaverBuilder.getChannels().remove(ctx.channel());
  80. LinkContainer.getInstance().getLinks().remove(ctx.channel().id());
  81. this.slaverBuilder.disconnected(ipSocket);
  82. }
  83. }