package com.zy.acs.gateway.domain; import com.core.common.Cools; import com.zy.acs.gateway.constant.AgvConstant; import com.zy.acs.gateway.constant.PacErrorType; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import java.util.Objects; /** * AGV报文模型 * Created by vincent on 2023/3/10 */ public class AgvPackage implements PackageSupport { /** * 源数据包缓冲区(引用) */ private ByteBuf sourceBuff; /** * 原始消息对应的16进制字符串 */ private String sourceHexStr; /** * 消息头部 */ private PacHeader header; /** * 消息体 */ private PacBody body; /** * 消息的校正码 */ private int validCode; /** * 是否为校验异常包 */ private boolean errorPac; /** * 校验异常类型 */ private PacErrorType pacErrorType; public static AgvPackage valueOfEmpty() { AgvPackage agvPackage = new AgvPackage(); agvPackage.setHeader(new PacHeader()) .setBody(new PacBody()) .setValidCode((short) 0) .setErrorPac(false); return agvPackage; } public String toLogString() { StringBuilder pacSb = new StringBuilder(); pacSb.append("AGV(").append(getHeader().getUniqueNo()).append(")") .append("上传") .append("[").append(getHeader().getProtocolType().getDes()).append("]消息.") .append("原始消息[").append(getSourceHexStr()).append("]"); return pacSb.toString(); } public ByteBuf getSourceBuff() { // 因为处理buffer时,总是希望拿到一个重置了readerIndex的buf if (Objects.nonNull(this.sourceBuff)) { this.sourceBuff.resetReaderIndex(); } return this.sourceBuff; } public AgvPackage setSourceBuff(ByteBuf sourceBuff) { this.sourceBuff = sourceBuff; if (Cools.isEmpty(this.sourceHexStr)) { this.sourceBuff.resetReaderIndex(); this.sourceHexStr = ByteBufUtil.hexDump(this.sourceBuff).toUpperCase(); this.sourceBuff.resetReaderIndex(); } return this; } public PacHeader getHeader() { return header; } public AgvPackage setHeader(PacHeader header) { this.header = header; return this; } public PacBody getBody() { return body; } public AgvPackage setBody(PacBody body) { this.body = body; return this; } public int getValidCode() { return validCode; } public AgvPackage setValidCode(int validCode) { this.validCode = validCode; return this; } public boolean isErrorPac() { return errorPac; } public AgvPackage setErrorPac(boolean errorPac) { this.errorPac = errorPac; return this; } public String getSourceHexStr() { return sourceHexStr; } public AgvPackage setSourceHexStr(String sourceHexStr) { this.sourceHexStr = sourceHexStr; return this; } public PacErrorType getPacErrorType() { return pacErrorType; } public AgvPackage setPacErrorType(PacErrorType pacErrorType) { this.pacErrorType = pacErrorType; return this; } public ByteBuf convert(ByteBuf byteBuf){ byteBuf.writeByte(this.getHeader().getStartSymbol()) .writeShort(this.getHeader().getContentLength()) .writeByte(this.getHeader().getProtocolType().getCode()) .writeBytes(this.getHeader().getUniqueNo().getBytes(AgvConstant.CHARSET_GBK)) .writeByte(this.getHeader().getEncryptType().getCode()) .writeBytes(this.getBody().getContent()) .writeByte(this.getValidCode()); // 计算并设置校验码 // this.setValidCode(ValidUtil.caculateValidByteFromBuff(byteBuf)); byteBuf.resetReaderIndex(); byteBuf.writerIndex(byteBuf.readableBytes() - 1).writeByte(this.getValidCode()); return byteBuf; } }