2021与蓝度共同重构项目,服务端
zhanzhiqin
2022-08-15 edbb2fe4eabbb7c526fb2f7313bead37d38928e2
充电桩上电请求
已修改4个文件
已添加2个文件
220 ■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3EndOfTheSynchronizationReqInnerFrame.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetRateReqInnerFrame.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5OrderEnum.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/SupplementUtils.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java
@@ -73,11 +73,11 @@
            if (codeRequestFrame.isValidate()) {
                if (deviceName != null) {
                    C3mCharging c3mCharging = SpringContextHolder.getBean(C3ChargingService.class).
                            getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, codeRequestFrame.getDestinationAddress()).last("limit 1"));
                    if (c3mCharging == null) {
                        SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, codeRequestFrame.getMcuUdid(), codeRequestFrame.getDestinationAddress());
                    }
//                    C3mCharging c3mCharging = SpringContextHolder.getBean(C3ChargingService.class).
//                            getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, codeRequestFrame.getDestinationAddress()).last("limit 1"));
//                    if (c3mCharging == null) {
//                        SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, codeRequestFrame.getMcuUdid(), codeRequestFrame.getDestinationAddress());
//                    }
                    //设置二维码
                    Pole pole = SpringContextHolder.getBean(PoleService.class).getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, deviceName));
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3EndOfTheSynchronizationReqInnerFrame.java
@@ -19,7 +19,7 @@
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.EndOfTheSynchronization.getCode();
        String payloadLength = "0006";
        String payloadLength = "0004";
        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/C3SetRateReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
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 com.sandu.ximon.admin.utils.SupplementUtils;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import java.text.DecimalFormat;
import java.util.List;
/**
 * @author ZZQ
 * @date 2022/8/15 11:23
 */
public class C3SetRateReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3SetRateReqInnerFrame(String c3Mac, List<C3mChargingCharge> list) {
        StringBuffer buffer = new StringBuffer();
        for (C3mChargingCharge bean : list) {
            //时间
            String hour = SupplementUtils.suppleZero(hex10To16(bean.getHour()), 2);
            String min = SupplementUtils.suppleZero(hex10To16(bean.getMin()), 2);
            //费率
            double chargeValue = bean.getCharge() * 10;
            String chargeHex = hex10To16(
                    Integer.parseInt(new DecimalFormat("0").format(chargeValue)));
            String charge;
            if (chargeHex.length() > 2) {
                charge = "FF";
            } else {
                charge = SupplementUtils.suppleZero(chargeHex, 2);
            }
            buffer = buffer.append(hour);
            buffer = buffer.append(min);
            buffer = buffer.append(charge);
        }
        //添加默认的无效费率
        for (int i = 0; i < (5 - list.size()); i++) {
            //时间
            buffer = buffer.append("FFFF");
            //费率
            buffer = buffer.append("FF");
        }
        this.payload = c3Mac + buffer;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.SetRate.getCode();
        String payloadLength = "0013";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
    /**
     * åè¿›åˆ¶è½¬16进制
     *
     * @param value
     * @return
     */
    private String hex10To16(int value) {
        return String.format("%02X", value);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5OrderEnum.java
@@ -12,8 +12,6 @@
    REQUEST_LIGHT_DATA("01"),
    //  å¤§æ°”数据指令
    REQUEST_ATMOSPHERE_DATA("04"),
    //  å……电桩C2数据指令
    REQUEST_C2_DATA("03"),
    //  å……电桩C3数据指令
    REQUEST_C3_DATA("02"),
    //  æ†ä½“监测数据指令
@@ -23,13 +21,13 @@
    //  GPS模块数据指令
    REQUEST_GPS_DATA("07"),
    //-------------------------------------------- è®¾å¤‡ä¸ŠæŠ¥----------------------------------------------------//
    //  å•灯数据指令上报
    RESPONSE_LIGHT_DATA("81"),
    //  å¤§æ°”数据指令上报
    RESPONSE_ATMOSPHERE_DATA("84"),
    //  å……电桩C2数据指令上报
    RESPONSE_C2_DATA("83"),
    //  å……电桩C3数据指令上报
    RESPONSE_C3_DATA("82"),
    //  æ†ä½“监测数据指令上报
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.domain.CommonPage;
@@ -21,10 +22,7 @@
import com.sandu.ximon.admin.param.C3ChargingAddParam;
import com.sandu.ximon.admin.param.C3ChargingParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.ListPagingUtils;
import com.sandu.ximon.admin.utils.LogUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.admin.utils.*;
import com.sandu.ximon.admin.vo.EquipmentInfomation;
import com.sandu.ximon.dao.bo.C3ChargingBo;
import com.sandu.ximon.dao.domain.*;
@@ -92,35 +90,9 @@
            one.setC3Mac(c3Mac);
            flag = updateById(one);
        }
        //设置费率
        C3mCharging c3mCharging1 = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
        List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, c3mCharging1.getC3Id()));
        if (list.size() == 0) {//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
            c3mChargingChargeService.initCharge((c3mCharging1.getC3Id()).intValue());
        }
//        /**
//         * æ·»åŠ ç»‘å®šå…³ç³»å¼€å§‹
//         */
//        Pole pole = poleService.getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, deviceName));
//        if (pole == null) {
//            Pole pole1 = new Pole();
//            pole1.setDeviceCode(deviceName);
//            pole1.setPoleName(deviceName);
//            pole1.setPoleCode(poleService.generatePoleCode());
//            poleService.save(pole1);
//        }
//
//        Long poleId = poleService.getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, deviceName)).getId();
//        PoleBindingParam poleBindingParam = new PoleBindingParam();
//        poleBindingParam.setDeviceType(2);
//        poleBindingParam.setDeviceCode(mcuUdid);
//        bindingService.bindPole(poleId, poleBindingParam);
        /**
         * æ·»åŠ ç»‘å®šå…³ç³»ç»“æŸ
         */
        //同步时间戳
        System.out.println("同步时间戳开始");
        String date = new SimpleDateFormat("yyMMddHHmmss").format(new Date());
        String s = SetCalendar(c3Mac, Integer.parseInt(date.substring(0, 2)), Integer.parseInt(date.substring(2, 4)),
                Integer.parseInt(date.substring(4, 6)), Integer.parseInt(date.substring(6, 8)),
@@ -129,10 +101,23 @@
            LogUtils.error("发送设置C3时间同步失败!");
            return false;
        }
        System.out.println("同步时间戳结束");
        //设置费率
        System.out.println("设置费率开始");
        C3mCharging c3mCharging1 = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
        List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, c3mCharging1.getC3Id()));
        if (list.size() == 0) {//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
            c3mChargingChargeService.initCharge((c3mCharging1.getC3Id()).intValue());
        }
        String rateState = setRate(c3Mac, list);
        System.out.println("设置费率结果:" + rateState);
        System.out.println("设置费率结束");
        /**  è·³åŒ…时间同步
         * è®¾ç½®æ—¶é—´è§„则:充电时为1倍,非充电状态为1.5倍时间
         */
        System.out.println("设置心跳包间隔时间开始");
        Set<String> keys = RedisUtils.getBean().keys(C3mRedisConstant.C3_STATUS.getCode() + "*");
        C3mRedisConfig.reFlushTime(keys.size());
@@ -140,11 +125,13 @@
        LogUtils.error("C3空闲心跳包时间同步响应结果:" + time1);
        String time2 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME), true);
        LogUtils.error("C3充电时心跳包时间同步响应结果:" + time2);
        System.out.println("设置心跳包间隔时间结束");
        /**
         * èŽ·å–å¿ƒè·³åŒ…ï¼Œåˆ¤æ–­åœ¨çº¿
         */
        System.out.println("获取心跳包开始");
        A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = ReadTheHeartbeatPackage(c3Mac);
        if (aPackage == null) {
            LogUtils.error("读取心跳包为空");
@@ -156,15 +143,19 @@
                JSON.toJSONString(aPackage),
                C3mRedisConfig.OUTLINE_TIME
        );
        System.out.println("获取心跳包结束");
        /**
         * finally、同步结束
         */
        System.out.println("同步结束  å¼€å§‹");
        String end = EndOfTheSynchronization(c3Mac);
        if (!"操作成功".equals(end)) {
            LogUtils.error("C3同步结束响应结果" + end);
            return false;
        }
        System.out.println("同步结束  ç»“束");
        return flag;
    }
@@ -891,6 +882,40 @@
    }
    /**
     * è®¾ç½®è´¹çއ
     *
     * @param c3Mac
     * @param list
     * @return
     */
    public String setRate(String c3Mac, List<C3mChargingCharge> list) {
        if (StringUtil.strIsNullOrEmpty(c3Mac)) {
            throw new BusinessException("C3Mac地址不能为空!");
        }
        if (list.isEmpty()) {
            throw new BusinessException("费率数据不能为空!");
        }
        C3SetRateReqInnerFrame c3SetRateReqInnerFrame = new C3SetRateReqInnerFrame(c3Mac, list);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3SetRateReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置费率", a5Frame, commonFrame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * æ•…障码上报清除
     *
     * @param c3Mac
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/SupplementUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.sandu.ximon.admin.utils;
/**
 * è¡¥ä½
 */
public class SupplementUtils {
    public static String suppleZero(String hex,Integer totalBit){
        if (hex.length()>totalBit) {
            return hex.substring(0, totalBit);
        } else if (hex.length()==totalBit){
            return hex;
        }
        totalBit = totalBit - hex.length();
        for(int i=0;i<totalBit;i++){
            hex = "0" + hex;
        }
        return hex;
    }
    public static String suppleZero(Integer hexInt,Integer totalBit){
        String hex = hexInt+"";
        if (hex.length()>totalBit) {
            return hex.substring(0, totalBit);
        } else if (hex.length()==totalBit){
            return hex;
        }
        totalBit = totalBit - hex.length();
        for(int i=0;i<totalBit;i++){
            hex = "0" + hex;
        }
        return hex;
    }
}