2021与蓝度共同重构项目,服务端
liuhaonan
2022-03-22 4ec08cdfd39c2407733c65b64e63cedabc885bca
Merge remote-tracking branch 'origin/master'
已修改4个文件
已添加2个文件
240 ■■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3HeartbeatReportInnerFrame.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetConstantReqInnerFrame.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetHeartbeatPacketTimeReqInnerFrame.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3ChargingParam.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java
@@ -6,6 +6,7 @@
import com.sandu.ximon.admin.param.C3ChargingParam;
import com.sandu.ximon.admin.service.C3ChargingService;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
@@ -124,6 +125,33 @@
        return ResponseUtil.success(c3ChargingService.ReadTheHeartbeatPackage(c3ChargingParam.getC3Mac()));
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)-充电状态时
     */
    @PostMapping("/SetHeartbeatPacketTimeCharging")
    public ResponseVO<Object> SetHeartbeatPacketTimeCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), true));
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)-非充电状态时
     */
    @PostMapping("/SetHeartbeatPacketTimeNotCharging")
    public ResponseVO<Object> SetHeartbeatPacketTimeNotCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), false));
    }
    /**
     * è®¾ç½®ç”µåŽ‹/电流常数(各一字节)(默认值0xBC64)
     */
    @PostMapping("/SetConstant")
    public ResponseVO<Object> SetConstant(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetConstant(c3ChargingParam.getC3Mac(), c3ChargingParam.getConstant()));
    }
    /**
     * è½¯é‡å¯
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3HeartbeatReportInnerFrame.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
import cn.hutool.core.util.HexUtil;
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;
@@ -106,17 +107,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.deviceTemperature = temperatureTransition(hex.substring(26, 30)) + "";
            this.gridVoltage = (parseVal(hex, 30, 34) * 0.01) + "";
            this.gridCurrent = (parseVal(hex, 34, 38) * 0.01 + "");
            this.frequency = (parseVal(hex, 38, 42) * 0.01 + "");
            this.powerFactor = (parseVal(hex, 42, 46) * 0.01 + "");
            this.activePower = (parseVal(hex, 46, 50) * 0.01 + "");
            this.reactivePower = (parseVal(hex, 50, 54) * 0.01 + "");
            this.chargedCapacity = (parseVal(hex, 54, 58) * 0.01 + "");
            this.reservedCapacity = (parseVal(hex, 58, 62) * 0.01 + "");
            this.remainingAmount = (parseVal(hex, 62, 66) * 0.01 + "");
            this.alreadyChargingTime = parseVal(hex.substring(66, 72));
            //72-80保留,暂未使用
            return this;
        }
@@ -128,5 +130,46 @@
        private String parseVal(String hex) {
            return Integer.parseInt(hex, 16) + "";
        }
        /**
         * å°†16进制转成2进制,进行补码(反码基础上+1),得到正确数值
         * ä¼ å…¥16进制的温度,类型为String
         * å¦‚F500
         */
        public Double temperatureTransition(String temperature) {
            //将传进来的16进制的转为2进制
            String twoBinStr = hexStr2BinStr(temperature);
            if ("1".equals(twoBinStr.substring(0, 1))) {
                //最高位是1,为负数,将16进制的进行补码,返回
                int max = 0b1111111111111111;
                double result = (max - HexUtil.hexToInt(temperature)) * (-0.01);
                return result;
            } else if ("0".equals(twoBinStr.substring(0, 1))) {
                //最高位是0,正数,直接返回
                double result = (HexUtil.hexToInt(temperature)) * (0.01);
                return result;
            }
            //
            return 0.00;
        }
        /**
         * 16进制字符串转为二进制
         */
        public String hexStr2BinStr(String hexStr) {
            if (hexStr == null || hexStr.length() % 2 != 0) {
                return null;
            }
            String bString = "", tmp;
            for (int i = 0; i < hexStr.length(); i++) {
                tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexStr.substring(i, i + 1), 16));
                bString += tmp.substring(tmp.length() - 4);
            }
            return bString;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetConstantReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3SetConstantReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3SetConstantReqInnerFrame(String c3Mac, String constant) {
        payload = c3Mac + constant;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.SetConstant.getCode();
        String payloadLength = "0006";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetHeartbeatPacketTimeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import java.text.DecimalFormat;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3SetHeartbeatPacketTimeReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    //用于判断是设置 å……电时 å¿ƒè·³åŒ…间隔时间或者设置 éžå……电时 å¿ƒè·³åŒ…间隔时间
    private boolean flag;
    public C3SetHeartbeatPacketTimeReqInnerFrame(String c3Mac, int time, boolean flag) {
        String data = Integer.toHexString(time);
        switch (data.length()) {
            case 1:
                data = "000" + data;
                break;
            case 2:
                data = "00" + data;
                break;
            case 3:
                data = "0" + data;
                break;
            default:
        }
        payload = c3Mac + data;
        this.flag = flag;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode;
        if (flag) {
            //充电时
            functionCode = C3ChargingEnum.SetHeartbeatPacketTimeCharging.getCode();
        } else {
            //非充电时
            functionCode = C3ChargingEnum.SetHeartbeatPacketTimeNotCharging.getCode();
        }
        String payloadLength = "0006";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3ChargingParam.java
@@ -3,6 +3,7 @@
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
 * @author ZZQ
@@ -16,12 +17,14 @@
    private String c3Mac = "";
    //充电量
//    @NotEmpty(message = "充电量不能为空")
    private Integer chargingCapacity;
    //充电金额
//    @NotEmpty(message = "充电金额不能为空")
    private Double chargeAmount;
    //设置心跳包间隔时间(秒)
    private int time;
    //设置电压/电流常数(各一字节)(默认值0xBC64)
    private String constant = "BC64";
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -5,7 +5,6 @@
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.manager.iot.amqp.processor.c3ChargingProcessor;
import com.sandu.ximon.admin.manager.iot.frame.A5Frame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3HeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3OperationReportInnerFrame;
@@ -13,9 +12,7 @@
import com.sandu.ximon.admin.manager.iot.frame.inner.request.*;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import com.sandu.ximon.dao.mapper.C3mChargingMapper;
@@ -45,7 +42,7 @@
    public boolean saveReportData(String deviceName, A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, deviceName));
        List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, one.getC3Id()));
        if(list.size()==0){//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
        if (list.size() == 0) {//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
            c3mChargingChargeService.initCharge((one.getC3Id()).intValue());
        }
@@ -298,6 +295,60 @@
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)-充电状态时/非充电状态时
     *
     * @param c3Mac
     * @param setTime
     * @return
     */
    public String SetHeartbeatPacketTimeCharging(String c3Mac, int setTime, boolean flag) {
        if (setTime <= 0) {
            throw new BusinessException("设置的心跳包间隔时间错误!");
        }
        C3SetHeartbeatPacketTimeReqInnerFrame setHeartbeatPacketTimeChargingReqInnerFrame =
                new C3SetHeartbeatPacketTimeReqInnerFrame(c3Mac, setTime, flag);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), setHeartbeatPacketTimeChargingReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®ç”µåŽ‹/电流常数(各一字节)(默认值0xBC64)
     *
     * @param c3Mac
     * @param constant
     * @return
     */
    public String SetConstant(String c3Mac, String constant) {
        C3SetConstantReqInnerFrame setConstantReqInnerFrame =
                new C3SetConstantReqInnerFrame(c3Mac, constant);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), setConstantReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è½¯é‡å¯
     *
     * @param c3Mac