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(); } }