package org.yzh.protocol.codec; import io.github.yezhihao.netmc.codec.MessageDecoder; import io.github.yezhihao.netmc.codec.MessageEncoder; import io.github.yezhihao.netmc.session.Session; import io.github.yezhihao.protostar.SchemaManager; import io.github.yezhihao.protostar.util.Explain; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.yzh.protocol.basics.JTMessage; /** * JT消息编解码适配器 * @author yezhihao * https://gitee.com/yezhihao/jt808-server */ @Slf4j public class JTMessageAdapter implements MessageEncoder, MessageDecoder { private final JTMessageEncoder messageEncoder; private final JTMessageDecoder messageDecoder; public JTMessageAdapter(String... basePackages) { this(new SchemaManager(basePackages)); } public JTMessageAdapter(SchemaManager schemaManager) { this(new JTMessageEncoder(schemaManager), new MultiPacketDecoder(schemaManager, new MultiPacketListener(20))); } public JTMessageAdapter(JTMessageEncoder messageEncoder, JTMessageDecoder messageDecoder) { this.messageEncoder = messageEncoder; this.messageDecoder = messageDecoder; } public ByteBuf encode(JTMessage message, Explain explain) { return messageEncoder.encode(message, explain); } public JTMessage decode(ByteBuf input, Explain explain) { return messageDecoder.decode(input, explain); } public ByteBuf encode(JTMessage message) { return messageEncoder.encode(message); } public JTMessage decode(ByteBuf input) { return messageDecoder.decode(input); } @Override public ByteBuf encode(JTMessage message, Session session) { ByteBuf output = messageEncoder.encode(message); encodeLog(session, message, output); return output; } @Override public JTMessage decode(ByteBuf input, Session session) { JTMessage message = messageDecoder.decode(input); if (message != null) message.setSession(session); decodeLog(session, message, input); return message; } public void encodeLog(Session session, JTMessage message, ByteBuf output) { if (log.isInfoEnabled()) log.info("{}\n>>>>>-{},hex[{}]", session, message, ByteBufUtil.hexDump(output)); } public void decodeLog(Session session, JTMessage message, ByteBuf input) { if (log.isInfoEnabled()) log.info("{}\n<<<<<-{},hex[{}]", session, message, ByteBufUtil.hexDump(input, 0, input.writerIndex())); } }