| | |
| | | package com.sandu.ximon.admin.manager.iot.amqp; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonReportMessage; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.report.*; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonReportMessage; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5C3ReportEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightReportEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.FrameUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | |
| | | /** |
| | | * å¤çä»»å¡ |
| | | * |
| | | * @param productKey 产åç |
| | | * @param deviceName 产ååç§° |
| | | * @param connectFrame 䏿¥å¸§ |
| | | * @param productKey 产åç |
| | | * @param deviceName 产ååç§° |
| | | * @param frame 䏿¥å¸§ |
| | | */ |
| | | private void processTask(String productKey, String deviceName, CommonFrame connectFrame) { |
| | | private void processTask(String productKey, String deviceName, CommonFrame frame) { |
| | | if (frame == null) { |
| | | return; |
| | | } |
| | | log.info("å¤ç订é
"); |
| | | log.info(frame.toString()); |
| | | if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_LIGHT_DATA.getCode())) { |
| | | // åç¯æ°æ®ä¸æ¥å¤ç |
| | | lightDataReportAnalysis(productKey, deviceName, frame); |
| | | } else if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_C3_DATA.getCode())) { |
| | | // C3å
çµæ¡©ä¸æ¥å¤ç |
| | | c3ChargingReportAnalysis(productKey, deviceName, frame); |
| | | } else if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_ATMOSPHERE_DATA.getCode())) { |
| | | // å¤§æ°æ°æ®æä»¤ä¸æ¥ |
| | | atmosphereAnalysis(productKey, deviceName, frame); |
| | | } |
| | | } |
| | | |
| | | private void c3ChargingReportAnalysis(String productKey, String deviceName, CommonFrame frame) { |
| | | String functionCode = frame.getPayload().substring(2, 4); |
| | | if (A5C3ReportEnum.NETWORK_REQUEST.getCode().equals(functionCode)) { |
| | | A5C3CommonReportInnerFrame netRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); |
| | | } else if (A5C3ReportEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) { |
| | | A5C3CommonReportInnerFrame codeRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); |
| | | } else if (A5C3ReportEnum.HEART_BEAT.getCode().equals(functionCode)) { |
| | | A5C3HeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5C3HeartbeatReportInnerFrame().transformFrame(frame.getPayload()); |
| | | } else if (A5C3ReportEnum.CHARGE_COMPLETE.getCode().equals(functionCode)) { |
| | | A5C3CommonReportInnerFrame completeRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); |
| | | |
| | | } else if (A5C3ReportEnum.CHARGE_STOP.getCode().equals(functionCode)) { |
| | | A5C3CommonReportInnerFrame stopRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); |
| | | |
| | | } else if (A5C3ReportEnum.ERROR_CODE.getCode().equals(functionCode)) { |
| | | A5C3ErrorCodeReportInnerFrame errorCodeRequestFrame = new A5C3ErrorCodeReportInnerFrame().transformFrame(frame.getPayload()); |
| | | |
| | | } |
| | | } |
| | | |
| | | private void atmosphereAnalysis(String productKey, String deviceName, CommonFrame frame) { |
| | | A5AtmosphereHeartbeatReportInnerFrame transformFrame = new A5AtmosphereHeartbeatReportInnerFrame().transformFrame(frame.getPayload()); |
| | | // log.info("大æ°å¿è·³ä¸æ¥"); |
| | | // log.info(transformFrame.toString()); |
| | | } |
| | | |
| | | private void lightDataReportAnalysis(String productKey, String deviceName, CommonFrame frame) { |
| | | String functionCode = frame.getPayload().substring(2, 4); |
| | | if (A5LightReportEnum.HeartBeat_Data.getCode().equals(functionCode)) { |
| | | // log.info("å¿è·³ç¸åº"); |
| | | A5LightHeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5LightHeartbeatReportInnerFrame().transformFrame(frame.getPayload()); |
| | | // log.info(heartbeatReportInnerFrame.toString()); |
| | | } else if (A5LightReportEnum.Time_Synchronized.getCode().equals(functionCode)) { |
| | | // log.info("è¯·æ±æ¶é´åæ¥"); |
| | | A5LightTimeSyncReportInnerFrame syncRespInnerFrame = new A5LightTimeSyncReportInnerFrame().transformFrame(frame.getPayload()); |
| | | // log.info(syncRespInnerFrame.toString()); |
| | | } else if (A5LightReportEnum.Error_Code.getCode().equals(functionCode)) { |
| | | // log.info("æ
éç 䏿¥"); |
| | | A5LightErrorCodeReportInnerFrame codeRespInnerFrame = new A5LightErrorCodeReportInnerFrame().transformFrame(frame.getPayload()); |
| | | // log.info(codeRespInnerFrame.toString()); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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-84-01 |
| | | * 大æ°å¿è·³å
åºç |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5AtmosphereHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5AtmosphereHeartbeatReportInnerFrame> { |
| | | |
| | | // ç®æ å°å 2 |
| | | private String destinationAddress; |
| | | // å¿è·³å
æ°æ® 58 |
| | | private HeartBeatDataPackage heartBeatDataPackage; |
| | | |
| | | private String originFrame; |
| | | |
| | | @Override |
| | | public A5AtmosphereHeartbeatReportInnerFrame 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, 12)); |
| | | |
| | | String heartBeatData = hex.substring(12, 76); |
| | | 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> { |
| | | // 设å¤åå· 2 |
| | | private String deviceType; |
| | | // 模åé¢çç¶ææ å¿ 1 |
| | | private String moduleWarmUpStatusFlag; |
| | | // æ¸©åº¦å¼ |
| | | private Double temperature; |
| | | // æ¹¿åº¦å¼ |
| | | private Double humidity; |
| | | // é£é |
| | | private Double windSpeed; |
| | | // é£å |
| | | private Double windDirection; |
| | | // 大æ°å |
| | | private Integer pressure; |
| | | // å
强 |
| | | private Integer lightIntensity; |
| | | // åªé³ |
| | | private Integer noise; |
| | | // PM2.5 |
| | | private Integer pm25; |
| | | // PM10 |
| | | private Integer pm10; |
| | | // æ»æ¬æµ®é¢ç²ç©ï¼TSPï¼ |
| | | private Integer tsp; |
| | | // SO2äºæ°§åç¡«/ç²éç¸å¯¹å¼ |
| | | private Integer so2; |
| | | private Integer ech2o; |
| | | // NO2äºæ°§åæ°®/TVOC |
| | | private Integer no2; |
| | | private Integer tvoc; |
| | | // CO䏿°§å碳 /äºæ°§å碳 |
| | | private Integer co; |
| | | private Integer co2; |
| | | // O3èæ°§ |
| | | private Integer o3; |
| | | // Fæ°åç© |
| | | private Integer fluoride; |
| | | |
| | | @Override |
| | | public HeartBeatDataPackage transformFrame(String hex) { |
| | | if (hex.length() != 64) { |
| | | return null; |
| | | } |
| | | Integer type = 0; |
| | | this.deviceType = hex.substring(0, 4); |
| | | if(this.deviceType.equals(DeviceType.SENSOR_V1.getType())) { |
| | | type = 1; |
| | | } |
| | | this.moduleWarmUpStatusFlag = hex.substring(4, 6); |
| | | this.temperature = Double.parseDouble( |
| | | parseVal(hex,6,8) |
| | | + "." |
| | | + parseVal(hex,8,10) |
| | | ); |
| | | this.humidity = Double.parseDouble( |
| | | parseVal(hex,10,12) |
| | | + "." |
| | | + parseVal(hex,12,14) |
| | | ); |
| | | this.windSpeed = parseVal(hex,14,18) * .1; |
| | | this.windDirection = parseVal(hex,18,22) * .1; |
| | | this.pressure = parseVal(hex,22,26); |
| | | this.lightIntensity = parseVal(hex,26,32); |
| | | this.noise = parseVal(hex,32, 36); |
| | | this.pm25 = parseVal(hex,36, 40); |
| | | this.pm10 = parseVal(hex,40,44); |
| | | this.tsp = parseVal(hex,44,48); |
| | | |
| | | /** |
| | | * 以ä¸åºåçæ¬ |
| | | */ |
| | | if(type.equals(1)) { |
| | | this.ech2o = parseVal(hex,48, 52); |
| | | this.tvoc = parseVal(hex,52, 56); |
| | | this.co2 = parseVal(hex,56, 60); |
| | | } else { |
| | | this.so2 = parseVal(hex,48, 52); |
| | | this.ech2o = parseVal(hex,48, 52); |
| | | this.tvoc = parseVal(hex,52, 56); |
| | | this.no2 = parseVal(hex,52, 56); |
| | | this.co = parseVal(hex,56, 60); |
| | | this.co2 = parseVal(hex,56, 60); |
| | | } |
| | | |
| | | this.o3 = parseVal(hex,60, 62); |
| | | this.fluoride = parseVal(hex,62, 64); |
| | | |
| | | return this; |
| | | } |
| | | |
| | | private Integer parseVal (String frame, int start, int end) { |
| | | return Integer.parseInt(frame.substring(start,end),16); |
| | | } |
| | | } |
| | | |
| | | public enum DeviceType { |
| | | |
| | | SENSOR_V1("0101"); |
| | | |
| | | private String type; |
| | | |
| | | DeviceType(String type) { |
| | | this.type = type; |
| | | } |
| | | |
| | | public String getType() { |
| | | return type; |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 18:20 |
| | | * A5-82-40/41/43/44 |
| | | * c3å
çµæ¡© 䏿¥ ç½ç»è¯·æ±/äºç»´ç 请æ±/䏿¥å
çµç»æ/䏿¥å
çµä¸æ |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5C3CommonReportInnerFrame extends BaseResponseInnerFrame<A5C3CommonReportInnerFrame> { |
| | | |
| | | // ç®æ å°å 4 |
| | | private String destinationAddress; |
| | | |
| | | @Override |
| | | public A5C3CommonReportInnerFrame 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)); |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 14:46 |
| | | * A5-81-42 |
| | | * åç¯ä¸æ¥ampq æ
éç |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5C3ErrorCodeReportInnerFrame extends BaseResponseInnerFrame<A5C3ErrorCodeReportInnerFrame> { |
| | | |
| | | /** |
| | | * ç®æ å°å 2 |
| | | */ |
| | | private String destinationAddress; |
| | | /** |
| | | * æ
éç |
| | | */ |
| | | private String errorCode; |
| | | |
| | | @Override |
| | | public A5C3ErrorCodeReportInnerFrame transformFrame(String hex) { |
| | | 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)); |
| | | |
| | | setErrorCode(hex.substring(16, hex.length() - 8)); |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = getFunctionCode() + getPayloadLength() + getDestinationAddress() + getErrorCode(); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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(16, 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.year = hex.substring(0, 2); |
| | | this.month = hex.substring(2, 4); |
| | | this.day = hex.substring(4, 6); |
| | | this.hour = hex.substring(6, 8); |
| | | this.min = hex.substring(8, 10); |
| | | this.sec = hex.substring(10, 12); |
| | | this.chargingPort = hex.substring(12, 16); |
| | | this.statusBit = hex.substring(16, 18); |
| | | this.deviceTemperature = hex.substring(18, 22); |
| | | this.gridVoltage = hex.substring(22, 26); |
| | | this.gridCurrent = hex.substring(26, 30); |
| | | this.frequency = hex.substring(30, 34); |
| | | this.powerFactor = hex.substring(34, 38); |
| | | this.activePower = hex.substring(38, 42); |
| | | this.reactivePower = hex.substring(42, 46); |
| | | this.chargedCapacity = hex.substring(46, 50); |
| | | this.reservedCapacity = hex.substring(50, 54); |
| | | this.remainingAmount = hex.substring(54, 58); |
| | | this.alreadyChargingTime = hex.substring(58, 64); |
| | | |
| | | return this; |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 14:46 |
| | | * A5-81-42 |
| | | * åç¯ä¸æ¥ampq æ
éç |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5LightErrorCodeReportInnerFrame extends BaseResponseInnerFrame<A5LightErrorCodeReportInnerFrame> { |
| | | |
| | | /** |
| | | * ç®æ å°å 2 |
| | | */ |
| | | private String destinationAddress; |
| | | /** |
| | | * æ
éç |
| | | */ |
| | | private String errorCode; |
| | | |
| | | @Override |
| | | public A5LightErrorCodeReportInnerFrame transformFrame(String hex) { |
| | | 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, 12)); |
| | | |
| | | setErrorCode(hex.substring(12, 16)); |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = getFunctionCode() + getPayloadLength() + getDestinationAddress() + getErrorCode(); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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-81-40 |
| | | * ç¯è¯»å¿è·³å
䏿¥ |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5LightHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5LightHeartbeatReportInnerFrame> { |
| | | |
| | | // ç®æ å°å 2 |
| | | private String destinationAddress; |
| | | // å¿è·³å
æ°æ® 58 |
| | | private HeartBeatDataPackage heartBeatDataPackage; |
| | | |
| | | private String originFrame; |
| | | |
| | | @Override |
| | | public A5LightHeartbeatReportInnerFrame 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, 12)); |
| | | |
| | | String heartBeatData = hex.substring(12, 108); |
| | | HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage(); |
| | | heartBeatDataPackage.transformFrame(heartBeatData); |
| | | setHeartBeatDataPackage(heartBeatDataPackage); |
| | | |
| | | setCrc32(hex.substring(108, 116)); |
| | | // æ ¡éª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> { |
| | | // å¹´RTC 1 |
| | | private String year; |
| | | // æRTC 1 |
| | | private String month; |
| | | // æ¥RTC 1 |
| | | private String day; |
| | | // æ¶RTC 1 |
| | | private String hour; |
| | | // åRTC 1 |
| | | private String min; |
| | | // ç§RTC 1 |
| | | private String sec; |
| | | // è®¾å¤æ¸©åº¦ 2 1åèæ´æ°1åèå°æ° |
| | | private String deviceTemperature; |
| | | // 亮度ç¾åæ¯ 1 |
| | | private String lightPercent; |
| | | // çµç½çµå 2 1åèæ´æ°1åèå°æ° |
| | | private String gridVol; |
| | | // çµç½çµæµ 2 1åèæ´æ°1åèå°æ° |
| | | private String gridCur; |
| | | // 赫å
¹ 2 1åèæ´æ°1åèå°æ° |
| | | private String hertz; |
| | | // åçå ç´ 2 1åèæ´æ°1åèå°æ° |
| | | private String powerFactor; |
| | | // æååç 2 1åèæ´æ°1åèå°æ° |
| | | private String activePower; |
| | | // æ ååç 2 1åèæ´æ°1åèå°æ° |
| | | private String reactivePower; |
| | | // æè¿ä¸æ¬¡äº®ç¯æ¶é´ 4 ç§ |
| | | private String recentlyLightSec; |
| | | // ç´¯è®¡äº®ç¯æ¶é´ 4 |
| | | private String totalLightTime; |
| | | // æè¿ä¸æ¬¡ç¨çµçµé 4 |
| | | private String recentlyUsingPower; |
| | | // 累计ç¨çµçµé 4 |
| | | private String totalUsingPower; |
| | | // ä¿ç 11 |
| | | private String retain; |
| | | // å帧 |
| | | private String originFrame; |
| | | |
| | | @Override |
| | | public HeartBeatDataPackage transformFrame(String hex) { |
| | | this.originFrame = hex; |
| | | this.year = hex.substring(0, 2); |
| | | this.month = hex.substring(2, 4); |
| | | this.day = hex.substring(4, 6); |
| | | this.hour = hex.substring(6, 8); |
| | | this.min = hex.substring(8, 10); |
| | | this.sec = hex.substring(10, 12); |
| | | |
| | | this.deviceTemperature = hex.substring(12, 16); |
| | | this.lightPercent = hex.substring(16, 18); |
| | | this.gridVol = hex.substring(18, 22); |
| | | this.gridCur = hex.substring(22, 26); |
| | | this.hertz = hex.substring(26, 30); |
| | | this.powerFactor = hex.substring(30, 34); |
| | | this.activePower = hex.substring(34, 38); |
| | | this.reactivePower = hex.substring(38, 42); |
| | | this.recentlyLightSec = hex.substring(42, 50); |
| | | this.totalLightTime = hex.substring(50, 58); |
| | | this.recentlyUsingPower = hex.substring(58, 66); |
| | | this.totalUsingPower = hex.substring(66, 74); |
| | | this.retain = hex.substring(74, 96); |
| | | return this; |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 14:46 |
| | | * A5-81-41 |
| | | * åç¯ä¸æ¥ampq è¯·æ±æ¶é´åæ¥ |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5LightTimeSyncReportInnerFrame extends BaseResponseInnerFrame<A5LightTimeSyncReportInnerFrame> { |
| | | |
| | | /** |
| | | * ç®æ å°å 2 |
| | | */ |
| | | private String destinationAddress; |
| | | /** |
| | | * 0x00ï¼è¯·æ±åæ¥ |
| | | */ |
| | | private String responseStatus; |
| | | |
| | | @Override |
| | | public A5LightTimeSyncReportInnerFrame transformFrame(String hex) { |
| | | 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, 12)); |
| | | |
| | | setResponseStatus(hex.substring(12, hex.length() - 8)); |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = getFunctionCode() + getPayloadLength() + getDestinationAddress() + getResponseStatus(); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | } |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.response; |
| | | |
| | | import cn.hutool.core.util.HexUtil; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 14:46 |
| | | * A1->0A/0B/0C |
| | | * A1->8A/8B/8C |
| | | * 设置é¿éäºä¸å
ç ProductKey DeviceName DeviceSecret ååºå
容 |
| | | */ |
| | | @Data |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.response; |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 14:46 |
| | | * ç¯äº®åº¦æ§å¶ åºç |
| | | * A5-81-01ç¯äº®åº¦æ§å¶ åºç |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | |
| | | |
| | | @Override |
| | | public A5LightBrightnessRespInnerFrame transformFrame(String hex) { |
| | | if (hex == null || hex.length() != 22) { |
| | | if (StrUtil.isBlank(hex)) { |
| | | return null; |
| | | } |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.response; |
| | | |
| | | 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; |
| | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 18:20 |
| | | * A5-81-02 |
| | | * ç¯è¯»å¿è·³å
åºç |
| | | */ |
| | | @Data |
| | |
| | | @Override |
| | | public A5LightHeartbeatRespInnerFrame transformFrame(String hex) { |
| | | // é¿åº¦ä¸ä¸è´æ¶ï¼è¿ånull |
| | | if (hex == null || hex.length() != 116) { |
| | | if (StrUtil.isBlank(hex)) { |
| | | return null; |
| | | } |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | |
| | | |
| | | setCrc32(hex.substring(108, 116)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(0, 14); |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.rrpc.enums; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * A5-84 大æ°ä¸æ¥ï¼ï¼MQTT弿¥ï¼ |
| | | */ |
| | | public enum A5AtmosphereReportEnum { |
| | | // 䏿¥å¿è·³å
|
| | | HeartBeat_Data("01"), |
| | | ; |
| | | |
| | | |
| | | A5AtmosphereReportEnum(String code) { |
| | | this.code = code; |
| | | } |
| | | |
| | | private final String code; |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.rrpc.enums; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * A5-83 C3å
çµæ¡©ä¸æ¥ï¼ï¼amqpï¼ |
| | | */ |
| | | public enum A5C3ReportEnum { |
| | | /** |
| | | *ç½ç»è¯·æ± |
| | | */ |
| | | NETWORK_REQUEST("40"), |
| | | /** |
| | | * äºç»´ç è¯·æ± |
| | | */ |
| | | QR_CODE_REQUEST("41"), |
| | | /** |
| | | * 䏿¥å¿è·³å
|
| | | */ |
| | | HEART_BEAT("42"), |
| | | /** |
| | | * 䏿¥å
çµç»æ |
| | | */ |
| | | CHARGE_COMPLETE("43"), |
| | | /** |
| | | * 䏿¥å
çµä¸æ |
| | | */ |
| | | CHARGE_STOP("44"), |
| | | /** |
| | | * 䏿¥æ
éç |
| | | */ |
| | | ERROR_CODE("45") |
| | | ; |
| | | |
| | | |
| | | A5C3ReportEnum(String code) { |
| | | this.code = code; |
| | | } |
| | | |
| | | private final String code; |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.rrpc.enums; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * A5-81 åç¯ä¸»å¨ä¸æ¥ï¼ï¼amqpï¼ |
| | | */ |
| | | public enum A5LightReportEnum { |
| | | // 䏿¥å¿è·³å
|
| | | HeartBeat_Data("40"), |
| | | // è¯·æ±æ¶é´åæ¥ |
| | | Time_Synchronized("41"), |
| | | // æ
éç |
| | | Error_Code("42"), |
| | | // æ¬å°å®æ¶/å
æ§å¼å
³ç¯å¨ä½ä¸æ¥ |
| | | Timing_LightSwitch_Report("43"), |
| | | // 请æ±é讯å议模å¼ï¼ä¸çµå10ç§ä¸æ¬¡ï¼å6æ¬¡ï¼ |
| | | Protocol_Model_Request("44"); |
| | | |
| | | |
| | | A5LightReportEnum(String code) { |
| | | this.code = code; |
| | | } |
| | | |
| | | private final String code; |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | } |