package com.zy.acs.gateway.handler; 
 | 
  
 | 
import com.zy.acs.gateway.AbstractInboundHandler; 
 | 
import com.zy.acs.gateway.cache.ChannelCache; 
 | 
import com.zy.acs.gateway.config.SystemProperties; 
 | 
import com.zy.acs.gateway.constant.PacErrorType; 
 | 
import com.zy.acs.gateway.domain.AgvPackage; 
 | 
import com.zy.acs.gateway.utils.ValidUtil; 
 | 
import io.netty.buffer.ByteBuf; 
 | 
import io.netty.buffer.ByteBufUtil; 
 | 
import io.netty.channel.ChannelHandler; 
 | 
import io.netty.channel.ChannelHandlerContext; 
 | 
import org.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
/** 
 | 
 * 协议校验码验证handler 
 | 
 * Created by vincent on 2019-04-02 
 | 
 */ 
 | 
@Component("validateHandler") 
 | 
@ChannelHandler.Sharable 
 | 
public class ValidateHandler extends AbstractInboundHandler<AgvPackage> { 
 | 
  
 | 
    private static final Logger log = LoggerFactory.getLogger(ValidateHandler.class); 
 | 
  
 | 
    @Autowired 
 | 
    private SystemProperties systemProperties; 
 | 
  
 | 
    @Override 
 | 
    protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) { 
 | 
        if (pac.isErrorPac()) { 
 | 
            log.error("收到一个异常包[{}], 原始消息[{}]", pac.getPacErrorType().getDes(), pac.getSourceHexStr()); 
 | 
            return false; 
 | 
        } 
 | 
        ByteBuf buf = pac.getSourceBuff(); 
 | 
        if (systemProperties.isPrintPacLog()) { 
 | 
            log.info("Agv [{}] 上行 [{}] <<< {}", pac.getHeader().getUniqueNo(), pac.getHeader().getProtocolType().getDes(), ByteBufUtil.hexDump(buf).toUpperCase()); 
 | 
        } 
 | 
        // crc 计算包含帧头 
 | 
        if(!ValidUtil.validPac(pac)) { 
 | 
            pac.setErrorPac(Boolean.TRUE).setPacErrorType(PacErrorType.PAC_VALID_ERROR); 
 | 
            log.error("收到一个校验异常包:{}", pac.toLogString()); 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
                ChannelCache.setChannel(pac.getHeader().getUniqueNo(), ctx.channel()); 
 | 
  
 | 
  
 | 
        return true; 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |