AeroflexVirtualBoxHandler.java 3.76 KB
package com.example.mina.boxhandler;

import com.example.mina.base.AbstractVirtualBoxHandler;
import com.example.mina.entity.AeroflexDataBuffer;
import com.example.mina.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;

/**
 * @author 杜云山
 * @date 21/03/05
 */
@Slf4j
public class AeroflexVirtualBoxHandler extends AbstractVirtualBoxHandler {

    private static final byte[] ERROR = "ERROR".getBytes();

    private static final byte[] NONE = "OK".getBytes();

    private static final String SET_ALL = "ATTN ALL MAX";

    private static final String SET_ONE = "ATTN";

    private static final String GET_ONE = "ATTN?";

    private static final String SPACE_SPLIT = " ";

    private static final String SEMICOLON_SPLIT = ";";

    private AeroflexDataBuffer dataBuffer;

    public AeroflexVirtualBoxHandler() {
        this.initMatrix();
    }

    @Override
    protected void initMatrix() {

        int row = 10;
        int col = 1;
        int maxAttenuate = 888;

        dataBuffer = new AeroflexDataBuffer(row, maxAttenuate);
    }

    @Override
    public void messageReceived(IoSession session, Object message) {

        IoBuffer ioBuffer = (IoBuffer) message;
        byte[] bytes = ioBuffer.array();

        byte[] result = handleMessage(bytes, bytes.length);

        session.write(IoBuffer.wrap(result));
    }

    @Override
    protected byte[] handleMessage(byte[] cmd, int len) {
        String command = new String(cmd).trim();

        log.info("aeroflexVirtualBoxHandler receive: {}", command);

        if (command.startsWith(SET_ALL)) {
            //set all to max
            for (int i = 1; i < dataBuffer.getMaxRow(); i++) {
                dataBuffer.setOffset(i, dataBuffer.getMaxAttenuate());
            }

            return NONE;
        } else if (command.startsWith(GET_ONE)) {
            //get
            String[] sss = command.split(SPACE_SPLIT);
            if (sss.length >= 2) {

                int row = StrUtil.toInt(sss[1]);
                if (row >= 0 && row <= dataBuffer.getMaxRow()) {
                    String str = String.valueOf(dataBuffer.getOffset(row));
                    log.info("aeroflexVirtualBoxHandler return: {}", str);
                    return str.getBytes();
                }
            }
            return ERROR;

        } else if (command.startsWith(SET_ONE)) {
            //Set, Follow by ATTN?
            String[] aa = command.split(SEMICOLON_SPLIT);

            String[] sss = aa[0].split(SPACE_SPLIT);

            if (sss.length >= 3) {

                int row = StrUtil.toInt(sss[1]);
                int val = StrUtil.toInt(sss[2]);

                if (row >= 0 && row <= dataBuffer.getMaxRow()) {
                    if (val >= 0 && val <= dataBuffer.getMaxAttenuate()) {
                        dataBuffer.setOffset(row, val);

                        String str = String.valueOf(dataBuffer.getOffset(row));
                        log.info("aeroflexVirtualBoxHandler return =====>  {}", str);
                        return str.getBytes();
                    }
                }
            }

            return ERROR;

        } else {
            return ERROR;
        }

    }

    @Override
    public void sessionCreated(IoSession session) {

        log.info("--- abstractVirtual server session created");
    }

    @Override
    public void sessionOpened(IoSession session) {

        log.info("--- abstractVirtual server session Opened");
    }

    @Override
    public void sessionClosed(IoSession session) {

        log.info("--- abstractVirtual server session Closed");
    }

    @Override
    public void messageSent(IoSession session, Object message) {

        log.info("--- abstractVirtual 发送数据成功!{}", message);
    }

}