package com.example.mina.box.aeroflex; import com.example.mina.util.StrUtil; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.*; /** * @author 杜云山 * @date 20/07/07 */ public class AeroflexCodecFactory implements ProtocolCodecFactory { @Override public ProtocolEncoder getEncoder(IoSession session) { return new AeroflexMessageEncoder(); } @Override public ProtocolDecoder getDecoder(IoSession session) { return new AeroflexMessageDecoder(); } static class AeroflexMessageEncoder implements ProtocolEncoder { @Override public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { if (message instanceof AeroflexResponseMessage) { byte[] result = ((AeroflexResponseMessage) message).getResult(); session.write(IoBuffer.wrap(result)); } } @Override public void dispose(IoSession session) { } } static class AeroflexMessageDecoder implements ProtocolDecoder { @Override public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { byte[] bytes = new byte[in.limit()]; in.get(bytes); AeroflexRequestMessage requestMessage = getAeroflexRequestMessage(bytes); out.write(requestMessage); } private AeroflexRequestMessage getAeroflexRequestMessage(byte[] bytes) { String cmd = new String(bytes).trim(); AeroflexRequestMessage requestMessage = AeroflexRequestMessage.builder() .cmd(cmd) .build(); // eg: "ATTN ALL MAX" if (cmd.startsWith(AeroflexRequestMessage.SET_ALL)) { requestMessage.setRequestSetAllMax(true); return requestMessage; } // eg: "ATTN? 1" if (cmd.startsWith(AeroflexRequestMessage.GET_ONE)) { // eg: ["ATTN?", "1"] String[] sss = cmd.split(AeroflexRequestMessage.SPACE_SPLIT); if (sss.length < 2) { requestMessage.setHasError(true); return requestMessage; } int row = StrUtil.toInt(sss[1]); requestMessage.setRequestGetOne(true); requestMessage.setRequestGetOneRow(row); return requestMessage; } // eg: "ATTN 2 3;" if (cmd.startsWith(AeroflexRequestMessage.SET_ONE)) { // eg: ["ATTN 2 3"] String[] aa = cmd.split(AeroflexRequestMessage.SEMICOLON_SPLIT); // eg: ["ATTN", "2", "3"] String[] sss = aa[0].split(AeroflexRequestMessage.SPACE_SPLIT); if (sss.length < 3) { requestMessage.setHasError(true); return requestMessage; } int row = StrUtil.toInt(sss[1]); int val = StrUtil.toInt(sss[2]); requestMessage.setRequestSetOne(true); requestMessage.setRequestSetOneRow(row); requestMessage.setRequestSetOneValue(val); return requestMessage; } requestMessage.setHasError(true); return requestMessage; } @Override public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception { } @Override public void dispose(IoSession session) throws Exception { } } }