package com.zy.acs.gateway.mock;
|
|
import com.alibaba.fastjson.JSON;
|
import com.zy.acs.common.domain.protocol.AGV_12_UP;
|
import com.zy.acs.common.domain.protocol.IMessageBody;
|
import com.zy.acs.common.utils.Utils;
|
import com.zy.acs.framework.common.RadixTools;
|
import com.zy.acs.gateway.constant.ProtocolType;
|
import com.zy.acs.gateway.domain.AgvPackage;
|
import com.zy.acs.gateway.handler.MessageBodyHandler;
|
import com.zy.acs.gateway.handler.coder.ProtocolDecoder;
|
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBufAllocator;
|
import io.netty.channel.ChannelHandlerContext;
|
|
public class ParseProtocolUtils {
|
|
public static void main(String[] args) {
|
String protocolMsg = "AA30000F0000003DF06C67124B000000DCFFDDFF358EB043000029BAC0358EB043000000000000000000000000A6FF40020C031909";
|
|
byte[] bytes = RadixTools.hexStringToBytes(protocolMsg);
|
|
ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(256);
|
|
buffer.writeBytes(bytes);
|
|
|
ProtocolDecoder protocolDecoder = new ProtocolDecoder(1024);
|
|
AgvPackage pac = AgvPackage.valueOfEmpty();
|
pac.setSourceBuff(buffer);
|
|
protocolDecoder.analyzeProtocol(pac);
|
|
|
Boolean b = msgChannelRead(pac);
|
|
|
System.out.println(JSON.toJSONString(pac));
|
|
IMessageBody messageBody = pac.getBody().getMessageBody();
|
if (messageBody instanceof AGV_12_UP) {
|
AGV_12_UP agv_12_up = (AGV_12_UP) messageBody;
|
System.out.println(agv_12_up.getQrCode());
|
}
|
}
|
|
|
private static Boolean msgChannelRead(AgvPackage pac) {
|
String namespace = IMessageBody.class.getPackage().getName();
|
|
ProtocolType protocolType = pac.getHeader().getProtocolType();
|
|
|
if (null == protocolType) {
|
|
// 未知包
|
return Boolean.FALSE;
|
}
|
|
String className = namespace + ".AGV_" + Utils.zeroFill(Integer.toHexString(protocolType.getCode()).toUpperCase(), 2)
|
+"_"
|
|
+ pac.getHeader().getProtocolType().getDirection().toString().toUpperCase();
|
|
Class<?> cls = null;
|
try {
|
|
|
cls = Class.forName(className);;
|
|
} catch (ClassNotFoundException e) {
|
|
|
return Boolean.FALSE;
|
}
|
|
Object obj = null;
|
|
if (null != cls) {
|
|
|
try {
|
obj = cls.newInstance();
|
|
} catch (ReflectiveOperationException reflectiveOperationException) {
|
|
// 。。。
|
return Boolean.FALSE;
|
}
|
|
|
}
|
|
ByteBuf contentBuf = pac.getBody().getContent(); contentBuf.markReaderIndex(); // sign
|
// body.buf 属于切片获取, slice 与 channel中的缓冲区 为同一 refenec
|
|
|
|
contentBuf.resetReaderIndex();
|
|
int len= contentBuf.readableBytes();
|
|
byte[] bytes = new byte[len];
|
|
|
|
pac.getBody().getContent().readBytes(bytes);
|
|
|
|
// 读取字节数组 ===>> 实际报文类型
|
IMessageBody iMessageBody = null;
|
|
if (null != obj) {
|
|
if ( obj instanceof IMessageBody) {
|
|
iMessageBody = (IMessageBody) obj;
|
|
|
iMessageBody.readFromBytes(bytes);
|
}
|
|
}
|
|
|
|
pac.getBody().setMessageBody(iMessageBody); contentBuf.resetReaderIndex();
|
|
return true;
|
}
|
|
}
|
|
// AA 30000F0000001DEE6C67120B0000001200EDFF8340B5420100E76FC28340B542000000000000000000000000A6FF40020C030674
|