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
package com.sandu.ximon.admin.manager.iot.amqp.processor;
 
import com.alibaba.fastjson.JSON;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A7PlcErrorCodeReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A7PlcHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A7PlcManualLightSwitchReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A7PlcTimeSyncReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A7PlcReportEnum;
import com.sandu.ximon.admin.service.*;
import com.sandu.ximon.dao.domain.Plc;
import lombok.extern.slf4j.Slf4j;
 
/**
 * @author van
 * PLC数据上报处理
 */
@Slf4j
public class PlcDataProcessor implements IMessageProcessor {
 
    private PlcDataProcessor() {
    }
 
    public static PlcDataProcessor getInstance() {
        return PlcDataProcessorHolder.INSTANCE;
    }
 
    private static class PlcDataProcessorHolder {
 
        private static final PlcDataProcessor INSTANCE = new PlcDataProcessor();
    }
 
    @Override
    public void process(String productKey, String deviceName, CommonFrame frame) {
        String functionCode = frame.getPayload().substring(2, 4);
        if (A7PlcReportEnum.HeartBeat_Data.getCode().equals(functionCode)) {
            log.error("心跳相应");
            A7PlcHeartbeatReportInnerFrame heartbeatReportInnerFrame = new A7PlcHeartbeatReportInnerFrame().transformFrame(frame.getPayload());
 
//            if ("3930364d485010ff803affff".equals(deviceName)) {
//                System.out.println("心跳包: " + JSON.toJSONString(heartbeatReportInnerFrame));
//                System.out.println("crc32校验结果:"+heartbeatReportInnerFrame.isValidate());
//            }
            if (heartbeatReportInnerFrame.isValidate()) {
                SpringContextHolder.getBean(PlcReportDataService.class).saveReportData(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
                //心跳包上报不保存硬件设备信息
//                SpringContextHolder.getBean(LightService.class).saveLight(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
            }
 
        } else if (A7PlcReportEnum.Time_Synchronized.getCode().equals(functionCode)) {
            log.error("请求时间同步");
            A7PlcTimeSyncReportInnerFrame syncRespInnerFrame = new A7PlcTimeSyncReportInnerFrame().transformFrame(frame.getPayload());
            if (syncRespInnerFrame.isValidate()) {
                SpringContextHolder.getBean(PlcService.class).timeSynchronizationInitiative(deviceName, syncRespInnerFrame.getDestinationAddress());
            }
 
        } else if (A7PlcReportEnum.Error_Code.getCode().equals(functionCode)) {
            log.error("故障码上报");
            A7PlcErrorCodeReportInnerFrame codeRespInnerFrame = new A7PlcErrorCodeReportInnerFrame().transformFrame(frame.getPayload());
            log.error(codeRespInnerFrame.isValidate() + "是否通过校验");
            log.error(codeRespInnerFrame.getErrorCode() + "故障码");
            if (codeRespInnerFrame.isValidate()) {
                SpringContextHolder.getBean(PlcReportErrorService.class).saveReportError(deviceName, codeRespInnerFrame);
            }
//            0000  表示没有故障,发送清除故障指令
            if (codeRespInnerFrame.getErrorCode() == 0) {
                System.out.println("清除故障操作!");
                SpringContextHolder.getBean(PlcReportErrorService.class).saveReportError(deviceName, codeRespInnerFrame);
                SpringContextHolder.getBean(LightReportErrorService.class).cleanErrorCode(deviceName, codeRespInnerFrame.getDestinationAddress());
            }
        } else if (A7PlcReportEnum.Manual_LightSwitch_Request.getCode().equals(functionCode)){
            A7PlcManualLightSwitchReportInnerFrame syncRespInnerFrame = new A7PlcManualLightSwitchReportInnerFrame().transformFrame(frame.getPayload());
            if (syncRespInnerFrame.isValidate()) {
                Plc plc = SpringContextHolder.getBean(PlcService.class).getPlc(deviceName);
                String responseStatus = syncRespInnerFrame.getResponseStatus();
                if (plc != null) {
//                    手动开关动作上报。0x00-全关,0x64-全开
                    if (responseStatus.equals("00")){
                        plc.setPlcLight1(0);
                        plc.setPlcLight2(0);
                        plc.setPlcLight3(0);
                    } else if (responseStatus.equals("64")) {
                        plc.setPlcLight1(1);
                        plc.setPlcLight2(1);
                        plc.setPlcLight3(1);
                    }
                    SpringContextHolder.getBean(PlcService.class).updateById(plc);
                }
            }
        }
    }
}