package com.sandu.ximon.admin.manager.iot.frame.inner.report; import com.sandu.common.execption.BusinessException; import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame; import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; import lombok.Data; import java.util.ArrayList; import java.util.List; /** * 服务器下发查询漏包帧 * * @author ZZQ * @date 2022/5/7 10:38 */ @Data public class RemoteSearchLoseDataReportInnerFrame extends BaseResponseInnerFrame { //FE //B3 //003F //001E //00 //0035 0036 0037 0038 0039 003A 003B //003C 003D 003E 003F 0040 0041 0042 //0043 0044 0045 0046 0047 0048 0049 //004A 004B 004C 004D 004E 004F 0050 //0051 0052 //36E57602 //漏包总帧数 private int loseCount; //校验状态 private boolean checkState; private List list; @Override public RemoteSearchLoseDataReportInnerFrame transformFrame(String hex) { if (hex.length() < 16) { throw new BusinessException("响应帧出错,请重新发送指令!"); } // MQTT通信方式(1) setConnectType(hex.substring(0, 2)); // 功能码(1) setFunctionCode(hex.substring(2, 4)); // 负荷长度(2) setPayloadLength(hex.substring(4, 8)); //漏包总帧数 setLoseCount(parseVal(hex, 8, 12)); //校验状态 if ("01".equals(hex.substring(12, 14))) { setCheckState(true); } else { setCheckState(false); } //丢帧卷序号 LoseFrameData loseFrameData = new LoseFrameData(); loseFrameData.transformFrame(hex.substring(14, hex.length() - 8)); //保存丢帧数据卷号 setList(loseFrameData.getList()); setCrc32(hex.substring(hex.length() - 8)); // 校验CRC32 String frame = hex.substring(2, hex.length() - 8); this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); return this; } private Integer parseVal(String frame, int start, int end) { return Integer.parseInt(frame.substring(start, end), 16); } @Data public static class LoseFrameData implements IResponseInnerFrame { private List list = new ArrayList<>(); @Override public LoseFrameData transformFrame(String hex) { for (int i = 0; i < hex.length() / 4; i++) { list.add(parseVal(hex, i * 4, i * 4 + 4)); } return this; } private Integer parseVal(String frame, int start, int end) { return Integer.parseInt(frame.substring(start, end), 16); } } }