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(); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |