package com.zy.acs.gateway.handler.coder; 
 | 
  
 | 
import com.zy.acs.framework.common.RadixTools; 
 | 
import com.zy.acs.common.utils.Utils; 
 | 
import com.zy.acs.gateway.config.SystemProperties; 
 | 
import com.zy.acs.gateway.constant.PackagePart; 
 | 
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 io.netty.handler.codec.MessageToByteEncoder; 
 | 
import org.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
/** 
 | 
 * 编码器 
 | 
 * 此解码器将会生成校验码 
 | 
 * 处理方式: 异或和 
 | 
 * Created by vincent on 2019-04-02 
 | 
 */ 
 | 
@Component 
 | 
@ChannelHandler.Sharable 
 | 
public class ProtocolEncoder extends MessageToByteEncoder<Object> { 
 | 
  
 | 
    private static final Logger log = LoggerFactory.getLogger(ProtocolEncoder.class); 
 | 
  
 | 
    @Autowired 
 | 
    private SystemProperties systemProperties; 
 | 
  
 | 
    @Override 
 | 
    protected void encode(ChannelHandlerContext ctx, Object obj, ByteBuf out) { 
 | 
  
 | 
        if (obj instanceof ByteBuf){ 
 | 
            out.writeBytes((ByteBuf) obj); 
 | 
  
 | 
        } else if (obj instanceof byte[]){ 
 | 
            out.writeBytes((byte[]) obj); 
 | 
  
 | 
        } else if (obj instanceof AgvPackage){ 
 | 
  
 | 
            AgvPackage pac = (AgvPackage)obj; 
 | 
  
 | 
  
 | 
  
 | 
            byte[] bodyBytes = pac.getBody().getMessageBody().writeToBytes();   // body 
 | 
  
 | 
            String uniqueNo = pac.getHeader().getUniqueNo(); 
 | 
  
 | 
                byte[] uniquenoBytes = RadixTools.intToBytes(Integer.parseInt(pac.getHeader().getUniqueNo()));   // uniqueno 
 | 
  
 | 
  
 | 
            int len = PackagePart.UNIQUENO.getLen()     // len 
 | 
                    + PackagePart.TIMESTAMP.getLen() 
 | 
                    + PackagePart.COMMAND_MARK.getLen() 
 | 
                    + bodyBytes.length; 
 | 
  
 | 
            out.writeByte(pac.getHeader().getStartSymbol())         // symbol 
 | 
                    .writeShortLE(len) 
 | 
                    .writeBytes(Utils.reverse(uniquenoBytes))       // uniqueno 
 | 
                    .writeIntLE((int) (System.currentTimeMillis() / 1000))   // timestamp 
 | 
                    .writeByte(pac.getHeader().getProtocolType().getCode()) // type 
 | 
                    .writeBytes(bodyBytes)                          // body 
 | 
                    .writeShort(pac.getValidCode())                 // valid 
 | 
            ; 
 | 
  
 | 
            pac.setValidCode(ValidUtil.calculateValidByteFromBuff(out)); 
 | 
            out.resetReaderIndex(); 
 | 
  
 | 
            out.writerIndex(out.readableBytes() - 2); 
 | 
            out.writeShortLE(pac.getValidCode()); 
 | 
  
 | 
  
 | 
            if (systemProperties.isPrintPacLog()){ 
 | 
                log.info("Agv [{}] 下行 [{}] >>> {}", uniqueNo, pac.getHeader().getProtocolType().getDes(), ByteBufUtil.hexDump(out).toUpperCase()); 
 | 
            } 
 | 
  
 | 
        } 
 | 
  
 | 
  
 | 
    } 
 | 
  
 | 
// EE | 11 00 | 01 00 00 00 | 0C AB 12 64 | F0  | 01 00 | 01 01 | 00 00 00 00 | 4C F7 
 | 
// #  | len   | uniqueno    | timestamp   | cmd | content                     | crc 
 | 
  
 | 
} 
 |