ModbusTcpSlaverHandle.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package wei.yigulu.modbus.netty;
  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 lombok.NoArgsConstructor;
  7. import org.slf4j.Logger;
  8. import wei.yigulu.modbus.domain.request.TcpModbusRequest;
  9. import wei.yigulu.modbus.domain.response.TcpModbusResponse;
  10. import wei.yigulu.modbus.exceptiom.ModbusException;
  11. import wei.yigulu.modbus.utils.ModbusResponseDataUtils;
  12. import wei.yigulu.utils.DataConvertor;
  13. import java.net.InetSocketAddress;
  14. /**
  15. * 消息处理类
  16. *
  17. * @author 修唯xiuwei
  18. * @version 3.0
  19. */
  20. @NoArgsConstructor
  21. public class ModbusTcpSlaverHandle extends ChannelInboundHandlerAdapter {
  22. protected Logger log;
  23. /**
  24. * Slave 104 handle
  25. *
  26. * @param slaverBuilder slaver builder
  27. */
  28. public ModbusTcpSlaverHandle(ModbusTcpSlaverBuilder slaverBuilder) {
  29. this.slaverBuilder = slaverBuilder;
  30. this.log = slaverBuilder.getLog();
  31. }
  32. protected ModbusTcpSlaverBuilder slaverBuilder;
  33. @Override
  34. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  35. //收数据
  36. ByteBuf byteBuf = (ByteBuf) msg;
  37. log.debug("re <=" + DataConvertor.ByteBuf2String(byteBuf));
  38. TcpModbusRequest request = new TcpModbusRequest().decode(byteBuf.nioBuffer());
  39. TcpModbusResponse response = new TcpModbusResponse();
  40. response.setTcpExtraCode(request.getTcpExtraCode());
  41. try {
  42. byte[] bbs = ModbusResponseDataUtils.buildResponse(this.slaverBuilder.getModbusSlaveDataContainer(), request, response);
  43. ctx.writeAndFlush(Unpooled.copiedBuffer(bbs));
  44. log.debug("se =>" + DataConvertor.Byte2String(bbs));
  45. } catch (ModbusException e) {
  46. log.error(e.getMsg());
  47. }
  48. }
  49. @Override
  50. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  51. log.error("ModbusSlave交互时发生异常", cause);
  52. }
  53. @Override
  54. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  55. InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
  56. String clientIp = ipSocket.getAddress().getHostAddress();
  57. Integer clientPort = ipSocket.getPort();
  58. if (!this.slaverBuilder.getConnectFilterManager().verdict(ctx.channel())) {
  59. ctx.channel().close();
  60. log.info(clientIp + ":" + clientPort + "客户端被过滤链拦截,已关闭通道");
  61. return;
  62. }
  63. log.info(clientIp + ":" + clientPort + "客户端连接");
  64. this.slaverBuilder.connected(ipSocket);
  65. this.slaverBuilder.getChannels().add(ctx.channel());
  66. }
  67. @Override
  68. public void channelInactive(ChannelHandlerContext ctx) throws Exception {
  69. InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
  70. String clientIp = ipSocket.getAddress().getHostAddress();
  71. Integer clientPort = ipSocket.getPort();
  72. log.info(clientIp + ":" + clientPort + "客户端断开连接");
  73. this.slaverBuilder.getChannels().remove(ctx.channel());
  74. this.slaverBuilder.disconnected(ipSocket);
  75. }
  76. }