package com.example.agvcontroller.protocol;
|
|
import com.example.agvcontroller.met.AbstractInboundHandler;
|
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
import io.netty.buffer.ByteBuf;
|
import io.netty.channel.ChannelHandler;
|
import io.netty.channel.ChannelHandlerContext;
|
|
/**
|
* 报文主体handler
|
* Created by vincent on 2023-03-15
|
*/
|
//@Component("messageBodyHandler")
|
@ChannelHandler.Sharable
|
public class MessageBodyHandler extends AbstractInboundHandler<AgvPackage> {
|
|
private static final Logger log = LoggerFactory.getLogger(MessageBodyHandler.class);
|
|
@Override
|
@SuppressWarnings("all")
|
protected boolean channelRead0(ChannelHandlerContext ctx, 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) {
|
|
log.error("MessageBodyHandler ClassNotFoundException", e);log.error("找不到指定类:{}", className);
|
|
return Boolean.FALSE;
|
}
|
|
Object obj = null;
|
|
if (null != cls) {
|
|
|
try {
|
obj = cls.newInstance();
|
|
} catch (ReflectiveOperationException reflectiveOperationException) {
|
log.error("MessageBodyHandler ReflectiveOperationException", reflectiveOperationException);
|
|
log.error("java反射创建实例失败:{}", className);
|
|
// 。。。
|
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;
|
}
|
|
|
}
|