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