package com.genersoft.iot.vmp.jt1078.codec.netty; import com.genersoft.iot.vmp.jt1078.proc.response.Rs; import com.genersoft.iot.vmp.jt1078.session.Session; import com.genersoft.iot.vmp.jt1078.session.SessionManager; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author QingtaiJiang * @date 2023/4/27 18:14 * @email qingtaij@163.com */ public class Jt808Handler extends ChannelInboundHandlerAdapter { private final static Logger log = LoggerFactory.getLogger(Jt808Handler.class); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof Rs) { ctx.writeAndFlush(msg); } else { ctx.fireChannelRead(msg); } } @Override public void channelActive(ChannelHandlerContext ctx) { Channel channel = ctx.channel(); Session session = SessionManager.INSTANCE.newSession(channel); channel.attr(Session.KEY).set(session); log.info("> Tcp connect {}", session); } @Override public void channelInactive(ChannelHandlerContext ctx) { Session session = ctx.channel().attr(Session.KEY).get(); log.info("< Tcp disconnect {}", session); ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable e) { Session session = ctx.channel().attr(Session.KEY).get(); String message = e.getMessage(); if (message.toLowerCase().contains("Connection reset by peer".toLowerCase())) { log.info("< exception{} {}", session, e.getMessage()); } else { log.info("< exception{} {}", session, e.getMessage(), e); } } @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; IdleState state = event.state(); if (state == IdleState.READER_IDLE || state == IdleState.WRITER_IDLE) { Session session = ctx.channel().attr(Session.KEY).get(); log.warn("< Proactively disconnect{}", session); ctx.close(); } } } }