package com.zy.acs.gateway.handler.coder;
|
|
import com.core.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
|
|
}
|