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