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); } } } } }