2021与蓝度共同重构项目,服务端
zhanzhiqin
2022-03-18 f52fc795e348d4d5998503ed8712a5eab4412404
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
 
import cn.hutool.core.util.StrUtil;
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 lombok.ToString;
 
/**
 * @author chenjiantian
 * @date 2021/12/6 18:20
 * A5-82-45
 * c3充电桩故障码 上报
 */
@Data
@ToString(callSuper = true)
public class A5C3HeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5C3HeartbeatReportInnerFrame> {
 
    //  目标地址    4
    private String destinationAddress;
    //  心跳包数据
    private HeartBeatDataPackage heartBeatDataPackage;
 
    @Override
    public A5C3HeartbeatReportInnerFrame transformFrame(String hex) {
        //  长度不一致时,返回null
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
        setConnectType(hex.substring(0, 2));
        //  功能码(1)
        setFunctionCode(hex.substring(2, 4));
        //  负荷长度(2)
        setPayloadLength(hex.substring(4, 8));
 
        setDestinationAddress(hex.substring(8, 16));
 
        String heartBeatData = hex.substring(8, hex.length() - 8);
        HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage();
        heartBeatDataPackage.transformFrame(heartBeatData);
        setHeartBeatDataPackage(heartBeatDataPackage);
 
        setCrc32(hex.substring(hex.length() - 8));
        //  校验CRC32
        String frame = hex.substring(2, hex.length() - 8);
        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
        return this;
    }
 
    @Data
    public static class HeartBeatDataPackage implements IResponseInnerFrame<HeartBeatDataPackage> {
        //  c3Mac(id hex)
        private String c3Mac;
        //  年
        private String year;
        //  月
        private String month;
        //  日
        private String day;
        //  时
        private String hour;
        //  分
        private String min;
        //  秒
        private String sec;
        //  充电桩口
        private String chargingPort;
        //  充电桩口状态位
        private String statusBit;
        //  设备温度    0.1℃
        private String deviceTemperature;
        //  电网电压    0.1V
        private String gridVoltage;
        //  电网电流    0.1A
        private String gridCurrent;
        //  频率  0.01Hz
        private String frequency;
        //  功率因素    0.001
        private String powerFactor;
        //  有功功率    0.1KW
        private String activePower;
        //  无功功率    0.1KFar
        private String reactivePower;
        //  已充电量    0.01KWh
        private String chargedCapacity;
        //  预约电量    1KWh
        private String reservedCapacity;
        //  剩余金额    0.1元
        private String remainingAmount;
        //  已充时长
        private String alreadyChargingTime;
 
        @Override
        public HeartBeatDataPackage transformFrame(String hex) {
            if (StrUtil.isBlank(hex)) {
                return null;
            }
            this.c3Mac = hex.substring(0, 8);
            this.year = parseVal(hex.substring(8, 10));
            this.month = parseVal(hex.substring(10, 12));
            this.day = parseVal(hex.substring(12, 14));
            this.hour = parseVal(hex.substring(14, 16));
            this.min = parseVal(hex.substring(16, 18));
            this.sec = parseVal(hex.substring(18, 20));
            this.chargingPort = parseVal(hex.substring(20, 24));
            this.statusBit = parseVal(hex.substring(24, 26));
            this.deviceTemperature = (parseVal(hex, 26, 28) + "." + parseVal(hex, 28, 30));
            this.gridVoltage = (parseVal(hex, 30, 32) + "." + parseVal(hex, 32, 34));
            this.gridCurrent =  (parseVal(hex, 34, 36) + "." + parseVal(hex, 36, 38));
            this.frequency = (parseVal(hex, 38, 40) + "." + parseVal(hex, 40, 42));
            this.powerFactor = (parseVal(hex, 42, 44) + "." + parseVal(hex, 44, 46));
            this.activePower = (parseVal(hex, 46, 48) + "." + parseVal(hex, 48, 50));
            this.reactivePower = (parseVal(hex, 50, 52) + "." + parseVal(hex, 52, 54));
            this.chargedCapacity = (parseVal(hex, 54, 56) + "." + parseVal(hex, 56, 58));
            this.reservedCapacity = (parseVal(hex, 58, 60) + "." + parseVal(hex, 60, 62));
            this.remainingAmount = (parseVal(hex, 62, 64) + "." + parseVal(hex, 64, 66));
            this.alreadyChargingTime = parseVal(hex.substring(66, 72));
 
            return this;
        }
 
        private Integer parseVal(String frame, int start, int end) {
            return Integer.parseInt(frame.substring(start, end), 16);
        }
 
        private String parseVal(String hex) {
            return Integer.parseInt(hex, 16) + "";
        }
    }
}