Newer
Older
br-data-forwarding / src / main / java / com / casic / tube / protocol / CasicTubeProtocolImpl.java
package com.casic.tube.protocol;

import com.alibaba.fastjson.JSONObject;
import com.casic.common.CasicFrame;
import com.casic.common.CasicProtocol;
import org.springframework.stereotype.Component;

@Component
public class CasicTubeProtocolImpl implements CasicProtocol {
    @Override
    public boolean checkFrame(String frame) {
        boolean valid = checkFrameHeaderAndTail(frame);
        if (valid) {
            valid = checkFrameLength(frame);
        }

        return valid;
    }

    private boolean checkFrameHeaderAndTail(String frame) {
        return (frame.substring(0, 2).equalsIgnoreCase("AA")) &&
                (frame.substring(frame.length() - 2).equalsIgnoreCase("FF"));
    }

    private boolean checkFrameLength(String frame) {
        String lengthStr = frame.substring(4, 7);
        int length = Integer.parseInt(lengthStr);

        return frame.length() == length + 9;
    }

    @Override
    public String getDeviceType(String frame) {
        return frame.substring(7, 9);
    }

    @Override
    public String getDeviceId(String frame) {
        return frame.substring(9, 21);
    }

    @Override
    public String getManufacturerCode(String frame) {
        return frame.substring(11, 13);
    }

    @Override
    public String getMessageType(String frame) {
        return frame.substring(21, 23);
    }

    @Override
    public String getMessageBody(String frame) {
        return frame.substring(26, frame.length() - 16);
    }

    @Override
    public JSONObject parseMessageBody(String messageBody) {
        return JSONObject.parseObject(messageBody);
    }

    @Override
    public String getUptime(String frame) {
        return frame.substring(frame.length() - 16, frame.length() - 2);
    }

    @Override
    public String buildFrameStr(CasicFrame frame) {
        StringBuilder builder = new StringBuilder();

        builder.append(frame.getDeviceType());
        builder.append(frame.getDeviceCode());
        builder.append(frame.getMessageType());
        builder.append(frame.getSequence());
        builder.append(frame.getControl());
        builder.append(frame.getMessageBody().toJSONString());
        builder.append(frame.getUptime());

        builder.insert(0, String.format("%03d", builder.length())); // 长度为3位数
        builder.insert(0, frame.getVersion());
        builder.insert(0, frame.getHEADER());
        builder.append(frame.getTAIL());

        return builder.toString();
    }
}