package com.example.agvcontroller.protocol; import com.example.agvcontroller.socket.RadixTools; import java.util.logging.Logger; 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; /** * 编码器 * 此解码器将会生成校验码 * 处理方式: 异或和 * Created by vincent on 2019-04-02 */ //@Component @ChannelHandler.Sharable public class ProtocolEncoder extends MessageToByteEncoder { //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); out.writeBytes((byte[]) new byte[]{ 0x0D, 0x0A }); } else if (obj instanceof AgvAction){ AgvAction action = (AgvAction)obj; String uniqueNo = action.getAgvNo(); byte[] uniqueNoBytes = RadixTools.intToBytes(Integer.parseInt(uniqueNo)); // uniqueno byte[] bodyBytes = action.writeToBytes(); int len = PackagePart.UNIQUENO.getLen() // len + PackagePart.TIMESTAMP.getLen() + PackagePart.COMMAND_MARK.getLen() + bodyBytes.length; out.writeByte((byte)0xEE) // symbol .writeShortLE(len) .writeBytes(Utils.reverse(uniqueNoBytes)) // uniqueno .writeIntLE((int) (System.currentTimeMillis() / 1000)) // timestamp .writeByte(ProtocolPojoType.ACTION_COMMAND.protocolType.getCode()) // type .writeBytes(bodyBytes) // body .writeShort((short)0) // valid ; int validCode = ValidUtil.calculateValidByteFromBuff(out); out.resetReaderIndex(); out.writerIndex(out.readableBytes() - 2); out.writeShortLE(validCode); } 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()); } } // 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 }