123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package wei.yigulu.modbus.netty;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- import lombok.NoArgsConstructor;
- import org.slf4j.Logger;
- import wei.yigulu.modbus.domain.request.TcpModbusRequest;
- import wei.yigulu.modbus.domain.response.TcpModbusResponse;
- import wei.yigulu.modbus.exceptiom.ModbusException;
- import wei.yigulu.modbus.utils.ModbusResponseDataUtils;
- import wei.yigulu.utils.DataConvertor;
- import java.net.InetSocketAddress;
- /**
- * 消息处理类
- *
- * @author 修唯xiuwei
- * @version 3.0
- */
- @NoArgsConstructor
- public class ModbusTcpSlaverHandle extends ChannelInboundHandlerAdapter {
- protected Logger log;
- /**
- * Slave 104 handle
- *
- * @param slaverBuilder slaver builder
- */
- public ModbusTcpSlaverHandle(ModbusTcpSlaverBuilder slaverBuilder) {
- this.slaverBuilder = slaverBuilder;
- this.log = slaverBuilder.getLog();
- }
- protected ModbusTcpSlaverBuilder slaverBuilder;
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- //收数据
- ByteBuf byteBuf = (ByteBuf) msg;
- log.debug("re <=" + DataConvertor.ByteBuf2String(byteBuf));
- TcpModbusRequest request = new TcpModbusRequest().decode(byteBuf.nioBuffer());
- TcpModbusResponse response = new TcpModbusResponse();
- response.setTcpExtraCode(request.getTcpExtraCode());
- try {
- byte[] bbs = ModbusResponseDataUtils.buildResponse(this.slaverBuilder.getModbusSlaveDataContainer(), request, response);
- ctx.writeAndFlush(Unpooled.copiedBuffer(bbs));
- log.debug("se =>" + DataConvertor.Byte2String(bbs));
- } catch (ModbusException e) {
- log.error(e.getMsg());
- }
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- log.error("ModbusSlave交互时发生异常", cause);
- }
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
- String clientIp = ipSocket.getAddress().getHostAddress();
- Integer clientPort = ipSocket.getPort();
- if (!this.slaverBuilder.getConnectFilterManager().verdict(ctx.channel())) {
- ctx.channel().close();
- log.info(clientIp + ":" + clientPort + "客户端被过滤链拦截,已关闭通道");
- return;
- }
- log.info(clientIp + ":" + clientPort + "客户端连接");
- this.slaverBuilder.connected(ipSocket);
- this.slaverBuilder.getChannels().add(ctx.channel());
- }
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
- String clientIp = ipSocket.getAddress().getHostAddress();
- Integer clientPort = ipSocket.getPort();
- log.info(clientIp + ":" + clientPort + "客户端断开连接");
- this.slaverBuilder.getChannels().remove(ctx.channel());
- this.slaverBuilder.disconnected(ipSocket);
- }
- }
|