diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java index 56c38842..c8bc8c69 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java @@ -186,6 +186,21 @@ public class XhpcChargingPileController extends BaseController { } + // 远程重启桩 + @GetMapping("/restart") + public AjaxResult pileRestart(String serialNumber) { + + if(serialNumber==null || "".equals(serialNumber)){ + return AjaxResult.error("桩号为空"); + } + R r = powerPileService.pileRestart(serialNumber); + if(r.getCode() !=200){ + return AjaxResult.error(r.getMsg()); + } + return AjaxResult.success(r.getMsg()); + } + + @GetMapping("/configRmReplyMessage") public AjaxResult configRmReplyMessage(String serialNumber) { if(serialNumber==null || "".equals(serialNumber)){ diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PowerPileService.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PowerPileService.java index e3e9ffb1..daa476ba 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PowerPileService.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PowerPileService.java @@ -46,4 +46,8 @@ public interface PowerPileService { @PostMapping("/pile/{pileNo}/softwareUpgrade") R pileSoftwareUpgrade(@PathVariable("pileNo") String pileNo); + + + @PostMapping("/pile/{pileNo}/restart") + R pileRestart(@PathVariable("pileNo") String pileNo); } diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PowerPileFallbackFactory.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PowerPileFallbackFactory.java index 5b44b643..5ddc8a49 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PowerPileFallbackFactory.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PowerPileFallbackFactory.java @@ -69,6 +69,12 @@ public class PowerPileFallbackFactory implements FallbackFactory cachePile = REDIS.getCacheMap(pkey); + R r = checkPile(cachePile); + if (r.getCode() == 200) { + String svcSrv = (String) cachePile.get("svcSrv"); + String response = HttpUtils.post(fmt(svcSrv).concat("/native/pile/").concat(pileNo).concat("/restart")); + r = getRR(response); + } + return r; + } + + + @PostMapping("native/pile/{pileNo}/restart") + public R nativePileRestart(@PathVariable("pileNo") String pileNo) { + + ClientHandler handler = getHandler(pileNo); + + R r = R.fail("充电桩重启失败,充电桩未注册."); + if (handler != null && handler.isOpen()) { + if (!handler.isOpen()) { + log.error("send message failed. [{}]({}) connection lost", handler.getName(), pileNo); + removeHandler(pileNo); + r = R.fail("充电桩连接已断开,请稍后再试."); + } else { + String gkPattern = ("gun:").concat(pileNo).concat("*"); + Collection gks = REDIS.keys(gkPattern); + boolean charging = false; + for (String gk : gks) { + if (gk.length() == 20 && isInteger(REDIS.getCacheMapValue(gk, "status"))) { + charging = true; + break; + } + } + int runFlag = charging ? 2: 1; + try { + String rsmsg = RemoteRestartDataLogic.translate(pileNo, runFlag); + + handler.sendClientBinary(HexUtils.toBytes(rsmsg)); + r = R.ok("充电桩重启下发成功."); + + XhpcDeviceMessage deviceMessage = new XhpcDeviceMessage(); + deviceMessage.setType(StationDeviceEnum.PILE.getCode()); + deviceMessage.setSerialNumber(pileNo); + deviceMessage.setRemark("充电桩主动下发远程重启"); + deviceMessage.setStatus(0); + deviceMessage.setContent(rsmsg); + deviceMessageMapper.insertByDomain(deviceMessage); + + } catch (Exception e) { + r = R.fail("充电桩重启下发失败,请重试."); + } + + } + } + return r; + } + + + @PostMapping("pile/{pileNo}/softwareUpgrade") public R pileSoftwareUpgrade(@PathVariable("pileNo") String pileNo) { diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RegisterLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RegisterLogic.java index c9e28806..ae54b135 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RegisterLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RegisterLogic.java @@ -7,7 +7,6 @@ import com.xhpc.pp.mapper.XhpcDeviceMessageMapper; import com.xhpc.pp.tx.ServiceParameter; import com.xhpc.pp.tx.ServiceResult; import com.xhpc.pp.tx.logic.ServiceLogic; -import com.xhpc.pp.utils.HexUtils; import com.xhpc.pp.utils.security.CRCCalculator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -106,4 +105,10 @@ public class RegisterLogic implements ServiceLogic { REDIS.setCacheSet(svcSrvKey, svcPileGuns); } + + public static void main(String[] args) { + String version = new String(toBytes("332E340000000000")); + + System.out.println("version: " + version); + } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteRestartDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteRestartDataLogic.java new file mode 100644 index 00000000..755c179a --- /dev/null +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteRestartDataLogic.java @@ -0,0 +1,70 @@ +package com.xhpc.pp.logic; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.xhpc.common.enums.StationDeviceEnum; +import com.xhpc.pp.domain.XhpcDeviceMessage; +import com.xhpc.pp.mapper.XhpcDeviceMessageMapper; +import com.xhpc.pp.tx.ServiceParameter; +import com.xhpc.pp.tx.ServiceResult; +import com.xhpc.pp.tx.logic.ServiceLogic; +import com.xhpc.pp.utils.HexUtils; +import com.xhpc.pp.utils.security.CRCCalculator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; +import static com.xhpc.common.data.redis.StaticBeanUtil.seqHex; + +@Lazy +@Component("RemoteRestartDataLogic") +public class RemoteRestartDataLogic implements ServiceLogic { + + private static final Logger log = LoggerFactory.getLogger(RemoteRestartDataLogic.class); + + @Resource + XhpcDeviceMessageMapper deviceMessageMapper; + + + @Override + public ServiceResult service(ServiceParameter sp) throws Exception { + Map req = sp.getParameters(); + String pileNo = (String) req.get("pileNo"); + Map cachePile = REDIS.getCacheMap("pile:".concat(pileNo)); + if(!"已注册".equals(cachePile.get("status").toString())){ + ObjectMapper mapper = new ObjectMapper(); + ObjectNode json = mapper.createObjectNode(); + json.put("error", "桩未注册"); + return new ServiceResult(null, ServiceResult.FAIL, json); + } + + String resultStr = translate(pileNo, 2); + + String remark = "充电桩主动下发远程重启"; + XhpcDeviceMessage deviceMessage = new XhpcDeviceMessage(); + deviceMessage.setType(StationDeviceEnum.PILE.getCode()); + deviceMessage.setSerialNumber(sp.getPileNo()); + deviceMessage.setRemark(remark); + deviceMessage.setStatus(0); + deviceMessage.setContent(resultStr); + deviceMessageMapper.insertByDomain(deviceMessage); + return new ServiceResult(HexUtils.toBytes(resultStr), ServiceResult.OK); + } + + public static String translate(String pileNo, int runFlag) { + + String skey = "pile:".concat(pileNo).concat(".seqhex"); + + String resultStr = "680C".concat(seqHex(skey)).concat("0092") + .concat(pileNo).concat(String.format("%02x", runFlag)); + + resultStr = resultStr.concat(CRCCalculator.calcCrc(resultStr)); + return resultStr; + } + +}