From fa8fd1965e6f2046db4e2f1561fd522ecd46c036 Mon Sep 17 00:00:00 2001 From: ZZ Date: Tue, 27 Jul 2021 18:41:10 +0800 Subject: [PATCH] =?UTF-8?q?WIP:=E5=90=AF=E5=8A=A8=E5=85=85=E7=94=B5,Redis?= =?UTF-8?q?=E8=87=AA=E5=A2=9E=E6=BA=A2=E5=87=BA=E9=87=8D=E7=BD=AE=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8F=B7=20TODO:HBLogic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xhpc-modules/xhpc-common/pom.xml | 4 ++ .../com/xhpc/common/data/redis/SeqUtil.java | 48 ++++++++++++++ .../com/xhpc/pp/config/EarlierBeanConf.java | 11 ++-- .../pp/controller/ChargingController.java | 62 +++++++++++++++++-- .../java/com/xhpc/pp/logic/RegisterLogic.java | 9 +-- .../pp/server/ChargingPileBinaryHandler.java | 23 +++++-- .../xhpc/pp/server/ChargingPileServer.java | 4 +- 7 files changed, 138 insertions(+), 23 deletions(-) create mode 100644 xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/data/redis/SeqUtil.java diff --git a/xhpc-modules/xhpc-common/pom.xml b/xhpc-modules/xhpc-common/pom.xml index 92e639e3..ec9c88ba 100644 --- a/xhpc-modules/xhpc-common/pom.xml +++ b/xhpc-modules/xhpc-common/pom.xml @@ -24,6 +24,10 @@ com.ruoyi ruoyi-common-core + + com.ruoyi + ruoyi-common-redis + ${project.artifactId} diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/data/redis/SeqUtil.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/data/redis/SeqUtil.java new file mode 100644 index 00000000..ff9908b8 --- /dev/null +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/data/redis/SeqUtil.java @@ -0,0 +1,48 @@ +package com.xhpc.common.data.redis; + +import com.ruoyi.common.redis.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.support.atomic.RedisAtomicLong; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class SeqUtil { + + public static RedisService REDIS; + + @Autowired + public RedisService redisService; + + @PostConstruct + public void init() { + + REDIS = redisService; + } + + public synchronized static String seqHex(String key) { + + String upperCode = ""; + RedisAtomicLong counter = new RedisAtomicLong(key, REDIS.redisTemplate.getConnectionFactory()); + long result = counter.incrementAndGet(); + upperCode = String.format("%04X", result); + if (upperCode.equals("FFFF")) { + REDIS.deleteObject(key); + } + return upperCode; + } + + public synchronized static String seqDec(String key, int len) { + + String upperCode = ""; + RedisAtomicLong counter = new RedisAtomicLong(key, REDIS.redisTemplate.getConnectionFactory()); + long result = counter.incrementAndGet(); + upperCode = String.format("%04d", result); + if (upperCode.equals("9999")) { + REDIS.deleteObject(key); + } + return upperCode; + } + +} diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/config/EarlierBeanConf.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/config/EarlierBeanConf.java index d5011592..0e4acd17 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/config/EarlierBeanConf.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/config/EarlierBeanConf.java @@ -4,7 +4,6 @@ import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; -import com.xhpc.pp.logic.RegisterLogic; import com.xhpc.pp.utils.SpringContextHolder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @@ -13,6 +12,7 @@ import java.util.List; import java.util.Map; import static com.ruoyi.common.core.utils.GetIpAndPort.getLocalIP; +import static com.xhpc.pp.logic.RegisterLogic.DISCONNECTED; import static com.xhpc.pp.server.ChargingPileServer.REDIS; @Configuration @@ -32,15 +32,16 @@ public class EarlierBeanConf { public static boolean ifreg(String pileNo) throws NacosException { Map cachePile = REDIS.getCacheMap("pile:".concat(pileNo)); - String server = (String) cachePile.get("server"); - if (server != null) { + if (!cachePile.isEmpty()) { + String server = (String) cachePile.get("svcSrv"); + if (server == null) return true; String nacosServer = REDIS.getCacheObject("nacos").toString(); NamingService namingService = NacosFactory.createNamingService(nacosServer); List ppInstances = namingService.getAllInstances("xhpc-power-pile"); String status = (String) cachePile.get("status"); - for (Instance i : ppInstances) { + for (Instance i : ppInstances) { // todo make HBLogic work if (i.getIp().concat("#").concat(Integer.valueOf(i.getPort()).toString()).equals(server)) { - if (!RegisterLogic.DISCONNECTED.equals(status)) { + if (!DISCONNECTED.equals(status)) { return false; } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java index 2fee6217..cf1ac987 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java @@ -1,14 +1,21 @@ package com.xhpc.pp.controller; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.HttpUtils; import com.xhpc.common.api.PowerPileService; import com.xhpc.common.data.down.StartChargingData; import com.xhpc.common.data.up.OrderData; import com.xhpc.pp.logic.FieldLogic; import com.xhpc.pp.server.ChargingPileServer; +import com.xhpc.pp.tx.ServiceResult; +import com.xhpc.pp.utils.security.CRCCalculator; import com.xhpc.pp.utils.security.HexUtils; import org.apache.commons.lang3.ArrayUtils; import org.quickserver.net.server.ClientHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; @@ -16,13 +23,19 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; +import java.util.Map; +import static com.xhpc.common.data.redis.SeqUtil.seqHex; +import static com.xhpc.pp.logic.RegisterLogic.REGISTERED; +import static com.xhpc.pp.server.ChargingPileServer.REDIS; import static com.xhpc.pp.server.ChargingPileServer.default_version; import static com.xhpc.pp.utils.security.HexUtils.toHexInt; @RestController public class ChargingController { + private static final Logger log = LoggerFactory.getLogger(ChargingController.class); + @Autowired private PowerPileService powerPileService; @Autowired @@ -39,10 +52,44 @@ public class ChargingController { @PostMapping("charging/start") public Object startCharging(@Validated @RequestBody StartChargingData startChargingData) { - byte[] msg = translate(startChargingData); - ClientHandler clientHandler = ChargingPileServer.getHandler(startChargingData.getPileNo()); - if (clientHandler == null) return R.fail(); + String pileNo = startChargingData.getPileNo(); + String pileKey = "pile:".concat(pileNo); + Map cachePile = REDIS.getCacheMap(pileKey); + if (cachePile.isEmpty()) { + return R.fail("充电桩未注册"); + } + String status = cachePile.get("status"); + if (!REGISTERED.equals(status)) { + return R.fail("充电桩离线"); + } + String svcSrv = cachePile.get("svcSrv"); + JSONObject json = (JSONObject) JSON.toJSON(startChargingData); + String response = HttpUtils.post(fmt(svcSrv).concat("/native/charging/start"), json); + JSONObject responseJson = (JSONObject) JSON.parse(response); + int code = responseJson.getInteger("code"); + if (code != 200) { + return R.fail(code, responseJson.getString("msg")); + } + return R.ok(responseJson.get("data"), responseJson.getString("msg")); + } + + private String fmt(String svcSrv) { + + String[] split = svcSrv.split("#"); + return "http://".concat(split[0]).concat(":").concat(split[1]); + } + + @PostMapping("native/charging/start") + public Object nativeStartCharging(@Validated @RequestBody StartChargingData startChargingData) { + + String pileNo = startChargingData.getPileNo(); + ClientHandler clientHandler = ChargingPileServer.getHandler(pileNo); + if (clientHandler == null) return R.fail("充电桩没有连接到上次注册的服务器"); try { + String gunKey = "gun:".concat(pileNo).concat(startChargingData.getGunId()); + String skey = gunKey.concat(".seqhex"); + String seq = seqHex(skey); + byte[] msg = translateSucc(startChargingData, seq); clientHandler.sendClientBinary(msg); return R.ok(); } catch (IOException e) { @@ -51,10 +98,11 @@ public class ChargingController { } } - private byte[] translate(StartChargingData startChargingData) { + + private byte[] translateSucc(StartChargingData startChargingData, String seq) { byte[] data = new byte[0]; - data = ArrayUtils.addAll(data, HexUtils.toBytes("6830007C0034")); + data = ArrayUtils.addAll(data, HexUtils.toBytes("6830".concat(seq).concat("0034"))); String version = startChargingData.getVersion(); if (default_version.equals(version)) { data = ArrayUtils.addAll(data, HexUtils.toBytes(startChargingData.getOrderNo())); @@ -66,7 +114,9 @@ public class ChargingController { } else { // not defined or implemented yet } - return data; + String msg = HexUtils.toHex(data).concat(ServiceResult.HEX_OK); + log.info("msg2bsent2pile:{}", msg); + return HexUtils.toBytes(msg.concat(CRCCalculator.calcCrc(msg))); } } 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 29a54aaa..4b76b67c 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 @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; import java.util.Map; import java.util.Set; +import static com.xhpc.pp.config.EarlierBeanConf.getLocalIPAndPort; import static com.xhpc.pp.server.ChargingPileServer.REDIS; @Lazy @@ -38,10 +39,10 @@ public class RegisterLogic implements ServiceLogic { int gunNum = Integer.parseInt(req.get("gunNum").toString()); for (int gunN = 1; gunN <= gunNum; gunN++) { String gunId = String.format("%02d", (int) gunN); - String pileGun = "gun:".concat(pileNo.concat(gunId)); - Map cacheGun = REDIS.getCacheMap(pileGun); - cacheGun.put("seq", 0); - REDIS.setCacheMap(pileGun, cacheGun); + String gunKey = "gun:".concat(pileNo.concat(gunId)); + Map cacheGun = REDIS.getCacheMap(gunKey); + cacheGun.put("svcSrv", getLocalIPAndPort()); + REDIS.setCacheMap(gunKey, cacheGun); } String resultStr = "680C00000002".concat(pileNo).concat(hexCode); resultStr = resultStr.concat(CRCCalculator.calcCrc(resultStr)); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java index 6a8427f0..acf3fc29 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java @@ -88,7 +88,7 @@ public class ChargingPileBinaryHandler implements ClientBinaryHandler { if (SERVICE_REGISTER.equals(serviceName) && OK.equals(resultCode)) { reg(handler, pileNo, req); } /*else if (SERVICE_HB.equals(serviceName)) { - +// TODO: 2021/7/28 }*/ if (result.getBinary() != null) { log.info("server send msg >>>> [{}] |{}|", pileNo, HexUtils.toHex(result.getBinary())); @@ -107,15 +107,26 @@ public class ChargingPileBinaryHandler implements ClientBinaryHandler { String pileKey = "pile:".concat(pileNo); Map pileCache = REDIS.getCacheMap(pileKey); pileCache.put("status", REGISTERED); - pileCache.put("server", getLocalIPAndPort()); + pileCache.put("svcSrv", getLocalIPAndPort()); REDIS.setCacheMap(pileKey, pileCache); - String svcKey = "ppSvcSrv:".concat(getLocalIPAndPort()); - Set svcPiles = REDIS.getCacheSet(svcKey); - svcPiles.add(pileKey); - REDIS.setCacheSet(svcKey, svcPiles); + cachePileGunSvcSrv("svcSrvPile:", pileNo); + int gunNum = Integer.parseInt(req.get("gunNum").toString()); + for (int gunN = 1; gunN <= gunNum; gunN++) { + String gunId = String.format("%02d", (int) gunN); + String gunKey = pileNo.concat(gunId); + cachePileGunSvcSrv("svcSrvGun:", gunKey); + } log.info("pile registering >>>> [{}] ", pileNo); } + private void cachePileGunSvcSrv(String prefix, String key) { + + String svcKey = prefix.concat(getLocalIPAndPort()); + Set svcPileGuns = REDIS.getCacheSet(svcKey); + svcPileGuns.add(key); + REDIS.setCacheSet(svcKey, svcPileGuns); + } + private List parseDataList(byte[] data) { List dataList = new ArrayList<>(); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileServer.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileServer.java index 2a457121..4ef3b8be 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileServer.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/ChargingPileServer.java @@ -131,9 +131,9 @@ public class ChargingPileServer { return version; } - public static ClientHandler getHandler(String pileNo) { + public static ClientHandler getHandler(String pile) { - return handlerMap.get(pileNo); + return handlerMap.get(pile); } public static String getPileNo(ClientHandler handler) {