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 { 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; } }