2021与蓝度共同重构项目,服务端
Van333
2022-12-29 727a69f859060093e685582fa10e5de82dcc138a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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);
        }
    }
 
 
}