2021与蓝度共同重构项目,服务端
chenjiantian
2021-12-08 b7cf4a3e5e89e6b39347bf12e6eafff258a84494
通信协议完善
已修改5个文件
已添加10个文件
782 ■■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/AmqpMessageListener.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5AtmosphereHeartbeatReportInnerFrame.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3CommonReportInnerFrame.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3ErrorCodeReportInnerFrame.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3HeartbeatReportInnerFrame.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightTimeSyncReportInnerFrame.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1DeviceMacRespInnerFrame.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1TernaryCodeRespInnerFrame.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightBrightnessRespInnerFrame.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightHeartbeatRespInnerFrame.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5AtmosphereReportEnum.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5C3ReportEnum.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightReportEnum.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/AmqpMessageListener.java
@@ -1,8 +1,12 @@
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;
@@ -76,11 +80,68 @@
    /**
     * å¤„理任务
     *
     * @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());
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5AtmosphereHeartbeatReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
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;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3CommonReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
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;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3ErrorCodeReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
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;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3HeartbeatReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
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;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
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;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
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;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightTimeSyncReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
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;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1DeviceMacRespInnerFrame.java
@@ -1,6 +1,5 @@
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;
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1TernaryCodeRespInnerFrame.java
@@ -8,7 +8,7 @@
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * A1->0A/0B/0C
 * A1->8A/8B/8C
 * è®¾ç½®é˜¿é‡Œäº‘三元码 ProductKey DeviceName DeviceSecret å“åº”内容
 */
@Data
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightBrightnessRespInnerFrame.java
@@ -1,5 +1,6 @@
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;
@@ -8,7 +9,7 @@
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * ç¯äº®åº¦æŽ§åˆ¶ åº”ç­”
 * A5-81-01灯亮度控制 åº”ç­”
 */
@Data
@ToString(callSuper = true)
@@ -25,7 +26,7 @@
    @Override
    public A5LightBrightnessRespInnerFrame transformFrame(String hex) {
        if (hex == null || hex.length() != 22) {
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightHeartbeatRespInnerFrame.java
@@ -1,5 +1,6 @@
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;
@@ -9,6 +10,7 @@
/**
 * @author chenjiantian
 * @date 2021/12/6 18:20
 * A5-81-02
 * ç¯è¯»å¿ƒè·³åŒ… åº”ç­”
 */
@Data
@@ -25,7 +27,7 @@
    @Override
    public A5LightHeartbeatRespInnerFrame transformFrame(String hex) {
        //  é•¿åº¦ä¸ä¸€è‡´æ—¶ï¼Œè¿”回null
        if (hex == null || hex.length() != 116) {
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
@@ -44,7 +46,7 @@
        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;
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5AtmosphereReportEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
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;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5C3ReportEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
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;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightReportEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
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;
    }
}