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<RemoteSearchLoseDataReportInnerFrame> {
|
//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<Integer> 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<LoseFrameData> {
|
private List<Integer> 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);
|
}
|
}
|
|
|
}
|