diff --git a/xhpc-modules/xhpc-power-pole/pom.xml b/xhpc-modules/xhpc-power-pole/pom.xml index 66a555ef..b023bec8 100644 --- a/xhpc-modules/xhpc-power-pole/pom.xml +++ b/xhpc-modules/xhpc-power-pole/pom.xml @@ -75,6 +75,12 @@ 1.6 + + leaf-boot-starter + com.sankuai.inf.leaf + 1.0.1-RELEASE + + diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/domain/ServiceField.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/domain/ServiceField.java index f40a46cb..d40b7ab6 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/domain/ServiceField.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/domain/ServiceField.java @@ -7,8 +7,6 @@ public class ServiceField { private String version; - private String name; - private String code; private Integer len; @@ -43,14 +41,6 @@ public class ServiceField { this.version = version; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - public String getCode() { return code; } diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPBinaryHandler.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java similarity index 76% rename from xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPBinaryHandler.java rename to xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java index d679aac8..1eabffbd 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPBinaryHandler.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileBinaryHandler.java @@ -18,11 +18,11 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.*; -public class PPPBinaryHandler implements ClientBinaryHandler { +public class ChargingPileBinaryHandler implements ClientBinaryHandler { - private static final Logger log = LoggerFactory.getLogger(PPPBinaryHandler.class); + private static final Logger log = LoggerFactory.getLogger(ChargingPileBinaryHandler.class); - private static final String SERVICE_REGISTER = "1001"; + private static final String SERVICE_REGISTER = "01"; private static final String SERVICE_LOGOUT = "1002"; private static final String DATA_TYPE_STRING = "string"; @@ -32,53 +32,47 @@ public class PPPBinaryHandler implements ClientBinaryHandler { private ServiceMainLogic servicemainLogic; - public PPPBinaryHandler() { + public ChargingPileBinaryHandler() { servicemainLogic = SpringContextHolder.getBean("ServiceMainLogic"); } @Override public void handleBinary(ClientHandler handler, byte[] data) throws IOException { + String dataStr = HexUtils.toHex(data); - String poleNo = PPPServer.getPoleNo(handler); - if (poleNo==null) { - log.info("received message <<<< {}, len[{}]", dataStr, data.length); - } else if (!dataStr.startsWith("00101005000100040000000000000000")) { - log.info("received pole [{}] message <<<< {}, len[{}]", poleNo, dataStr, data.length); + String poleNo = ChargingPileServer.getPoleNo(handler); + if (data.length <= 2|| !dataStr.startsWith("68")) { + log.info("received invalid data <<<< {}, len[{}]", dataStr, data.length); + return; + } else { + log.info("received data <<<< {}, from pole <<<< {}", dataStr, poleNo); } try { - // CRC校验和 - byte[] data2 = Arrays.copyOfRange(data, 2, data.length-2); - String crc1 = CRCCalculator.ModbusCRC(data2, data2.length); - // 检验长度 - if (data.length <= 2) { - log.error("input data invalid. " + data); - return; - } int len = HexUtils.toInteger(data, 1, 2); if (data.length < len) { - log.error("input data length. " + data.length); + log.error("incorrect input data length {}", data.length); + return; + } + byte[] data2 = Arrays.copyOfRange(data, 2, data.length-2); + String crc = CRCCalculator.ModbusCRC(data2); + if (!dataStr.endsWith(crc)) { + log.error("incorrect input data crc {}", crc); return; } - - // 处理粘包 List dataList = parseDataList(data); - for (byte[] d : dataList) { process(handler, d); } - } catch (TxException e) { log.error(e.getMessage(), e); } - } - // private void process(ClientHandler handler, byte[] data) throws TxException, IOException { String serviceName = HexUtils.toHex(data, 5, 6); - String version = PPPServer.getVersion(handler.getName()); - String poleNo = PPPServer.getPoleNo(handler); + String version = ChargingPileServer.getVersion(handler.getName()); + String poleNo = ChargingPileServer.getPoleNo(handler); Map req = analysis(data, serviceName, version); // log.info("pole [{}] status: |{}|", StringUtils.isNotBlank(poleNo) ? poleNo : "null", req.get("status") != null ? MQPole.PoleStatus.toString((Long) req.get("status")) : "N/A"); ServiceParameter sp = new ServiceParameter(serviceName, poleNo, req); @@ -96,16 +90,14 @@ public class PPPBinaryHandler implements ClientBinaryHandler { log.info("server send msg >>>> [{}] |{}|", poleNo, HexUtils.toHex(result.getBinary())); handler.sendClientBinary(result.getBinary()); } - // 注册成功后需要将当前handler与设备关联 if (SERVICE_REGISTER.equals(serviceName)) { - PPPServer.putHandler((String) req.get("poleNo"), handler); - PPPServer.putVersion(handler.getName(), (String) req.get("version")); + ChargingPileServer.putHandler((String) req.get("poleNo"), handler); + ChargingPileServer.putVersion(handler.getName(), (String) req.get("version")); } - // 注销后将桩号对应关系解除 if (SERVICE_LOGOUT.equals(serviceName)) { - PPPServer.removeHandler(poleNo); + ChargingPileServer.removeHandler(poleNo); } } @@ -117,7 +109,7 @@ public class PPPBinaryHandler implements ClientBinaryHandler { int start = 0; while (start < data.length) { if (len > data.length) { - log.error("input data[{}] len[{}]", data, data.length); + log.error("incorrect input data[{}] len[{}]", data, data.length); break; } dataList.add(ArrayUtils.subarray(data, start, len)); @@ -126,7 +118,7 @@ public class PPPBinaryHandler implements ClientBinaryHandler { } if (dataList.size() > 1) { - log.info("detection stick package size[{}]", dataList.size()); + log.info("detected stick package size[{}]", dataList.size()); } return dataList; @@ -139,13 +131,10 @@ public class PPPBinaryHandler implements ClientBinaryHandler { throw TxException.INNER_ERROR("field mapper not found"); Map result = new HashMap(); - int pos = 4; - // TODO 终止充电详情原因 + int pos = 6; for (ServiceField field : fieldList) { - // 判断长度 某些报文不同版本长度不同 if (pos >= data.length || pos + field.getLen() > data.length) break; - switch (field.getDataType()) { case DATA_TYPE_STRING: result.put(field.getCode(), HexUtils.toString(data, pos, pos + field.getLen())); @@ -161,7 +150,6 @@ public class PPPBinaryHandler implements ClientBinaryHandler { } pos += field.getLen(); } - // 原始报文 result.put("hex", HexUtils.toHex(data)); return result; } diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPCommandHandler.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileCommandHandler.java similarity index 70% rename from xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPCommandHandler.java rename to xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileCommandHandler.java index 6234612c..574e8b8b 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPCommandHandler.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileCommandHandler.java @@ -10,11 +10,11 @@ import java.io.IOException; import java.net.SocketTimeoutException; @Repository -public class PPPCommandHandler implements ClientCommandHandler { +public class ChargingPileCommandHandler implements ClientCommandHandler { - private static final Logger log = LoggerFactory.getLogger(PPPCommandHandler.class); + private static final Logger log = LoggerFactory.getLogger(ChargingPileCommandHandler.class); - public PPPCommandHandler() { + public ChargingPileCommandHandler() { } @Override diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPEventHandler.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileEventHandler.java similarity index 79% rename from xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPEventHandler.java rename to xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileEventHandler.java index 284f72ec..79d26c2e 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPEventHandler.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileEventHandler.java @@ -12,10 +12,10 @@ import java.net.SocketTimeoutException; @Lazy(false) @Component -public class PPPEventHandler implements ClientEventHandler { - private static final Logger log = LoggerFactory.getLogger(PPPEventHandler.class); +public class ChargingPileEventHandler implements ClientEventHandler { + private static final Logger log = LoggerFactory.getLogger(ChargingPileEventHandler.class); - public PPPEventHandler() { + public ChargingPileEventHandler() { } @Override @@ -27,11 +27,11 @@ public class PPPEventHandler implements ClientEventHandler { @Override public void lostConnection(ClientHandler handler) { - String poleNo = PPPServer.getPoleNo(handler); + String poleNo = ChargingPileServer.getPoleNo(handler); log.info("lost connection -> [{}] {} <- {}", poleNo, handler.getName(), handler.getSocket().getRemoteSocketAddress().toString()); if (poleNo != null) { - PPPServer.removeHandler(poleNo); + ChargingPileServer.removeHandler(poleNo); } } diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPServer.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileServer.java similarity index 87% rename from xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPServer.java rename to xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileServer.java index f3329e92..8e08f474 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/PPPServer.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/server/ChargingPileServer.java @@ -1,5 +1,6 @@ package com.xhpc.pp.server; +import com.xhpc.pp.service.FieldService; import com.xhpc.pp.utils.security.HexUtils; import org.quickserver.net.server.ClientHandler; import org.quickserver.net.server.DataMode; @@ -24,17 +25,20 @@ import java.util.Map; */ @Lazy(false) @Component -public class PPPServer { +public class ChargingPileServer { public static final String default_version = "0A"; - private static final Logger log = LoggerFactory.getLogger(PPPServer.class); + private static final Logger log = LoggerFactory.getLogger(ChargingPileServer.class); private static Map handlerMapper = new HashMap<>(); private static Map versionMapper = new HashMap<>(); private static Map poleMapper = new HashMap<>(); private QuickServer server; @Autowired - public PPPServer(@Value("${ppsvc.server}") String host, @Value("${ppsvc.port}") int port) { + private FieldService fieldService; + + @Autowired + public ChargingPileServer(@Value("${ppsvc.server}") String host, @Value("${ppsvc.port}") int port) { try { QuickServerConfig config; server = new QuickServer(); @@ -44,9 +48,9 @@ public class PPPServer { mode.setDataMode(DataMode.BINARY, DataType.IN); mode.setDataMode(DataMode.BINARY, DataType.OUT); config.setDefaultDataMode(mode); - config.setClientEventHandler(PPPEventHandler.class.getName()); - config.setClientCommandHandler(PPPCommandHandler.class.getName()); - config.setClientBinaryHandler(PPPBinaryHandler.class.getName()); + config.setClientEventHandler(ChargingPileEventHandler.class.getName()); + config.setClientCommandHandler(ChargingPileCommandHandler.class.getName()); + config.setClientBinaryHandler(ChargingPileBinaryHandler.class.getName()); config.getServerMode().setBlocking(true); config.setPort(port); config.setBindAddr(host); @@ -61,7 +65,6 @@ public class PPPServer { } public static void putHandler(String poleNo, ClientHandler handler) { - poleNo = HexUtils.toIntString(poleNo, 4); handlerMapper.put(poleNo, handler); poleMapper.put(handler.getName(), poleNo); } diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/FieldService.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/FieldService.java index 28bee365..0cefbc35 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/FieldService.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/FieldService.java @@ -2,7 +2,7 @@ package com.xhpc.pp.service; import com.xhpc.pp.domain.ServiceField; import com.xhpc.pp.mapper.ServiceFieldMapper; -import com.xhpc.pp.server.PPPServer; +import com.xhpc.pp.server.ChargingPileServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -23,18 +23,20 @@ public class FieldService { @Autowired public FieldService(ServiceFieldMapper fieldMapper) { + + versionMapFields = new HashMap<>(); FieldService.fieldMapper = fieldMapper; - FieldService.refreshCache(); + FieldService.init(); } public static void refreshCache() { + versionMapFields.clear(); init(); } public static void init() { - versionMapFields = new HashMap<>(); List list = fieldMapper.query(null); for (ServiceField field : list) { String version = field.getVersion(); @@ -47,21 +49,13 @@ public class FieldService { public static List fieldList(String version, String service) { Map> vermap = versionMapFields.get(version); - - // 充电桩上送的版本未维护,使用默认版本 if (vermap == null) - vermap = versionMapFields.get(PPPServer.default_version); - - if (vermap == null) - return null; - - // 上送的版本当前接口未维护,使用默认版本 + vermap = versionMapFields.get(ChargingPileServer.default_version); List fieldList = vermap.get(service); if (fieldList == null || fieldList.isEmpty()) { - vermap = versionMapFields.get(PPPServer.default_version); + vermap = versionMapFields.get(ChargingPileServer.default_version); fieldList = vermap.get(service); } - return fieldList; } diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/ServiceMainLogic.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/ServiceMainLogic.java index 1607015c..4a920f30 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/ServiceMainLogic.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/service/ServiceMainLogic.java @@ -20,27 +20,17 @@ public class ServiceMainLogic { private Map serviceLogics; public ServiceResult process(ServiceParameter param) { + ServiceResult result; try { - - // 调用具体业务逻辑的创建逻辑 ServiceLogic logic = getServiceLogic(param.getServiceName()); - // 开启事务 startTransaction(param); - - // 开始服务 result = logic.service(param); - - // 提交事务 commitTransaction(param); } catch (TxException e) { log.error("服务请求失败:错误码[" + e.getReturnCode() + "],错误:{" + e.getMessage() + "}"); - - // 记录错误日志 // saveErrorLog(param, e); - try { - // 回滚事务 terminateTransaction(param); result = new ServiceResult(e.getReturnCode(), e.getMessage()); } catch (Exception e1) { @@ -50,8 +40,6 @@ public class ServiceMainLogic { e.printStackTrace(); result = new ServiceResult(null, e.getMessage()); } - - // 处理结果 return result; } diff --git a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/utils/security/CRCCalculator.java b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/utils/security/CRCCalculator.java index e384c9f8..21402537 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/utils/security/CRCCalculator.java +++ b/xhpc-modules/xhpc-power-pole/src/main/java/com/xhpc/pp/utils/security/CRCCalculator.java @@ -2,16 +2,15 @@ package com.xhpc.pp.utils.security; public class CRCCalculator { - public static String ModbusCRC(byte[] pData, int len) { + public static String ModbusCRC(byte[] pData) { int crc = 0xFFFF; - for (int pos = 0; pos < len; pos++) { - crc ^= (int)pData[pos] & 0xFF; // XOR byte into least sig. byte of crc + for (byte pDatum : pData) { + crc ^= (int) pDatum & 0xFF; // XOR byte into least sig. byte of crc for (int i = 8; i != 0; i--) { // Loop over each bit if ((crc & 0x0001) != 0) { // If the LSB is set crc >>= 1; // Shift right and XOR 0xA001 crc ^= 0xA001; - } - else // Else LSB is not set + } else // Else LSB is not set crc >>= 1; // Just shift right } } diff --git a/xhpc-modules/xhpc-power-pole/src/main/resources/mapper/ServiceFieldMapper.xml b/xhpc-modules/xhpc-power-pole/src/main/resources/mapper/ServiceFieldMapper.xml index 7f2859e0..2f0e6072 100644 --- a/xhpc-modules/xhpc-power-pole/src/main/resources/mapper/ServiceFieldMapper.xml +++ b/xhpc-modules/xhpc-power-pole/src/main/resources/mapper/ServiceFieldMapper.xml @@ -5,7 +5,6 @@ - @@ -15,7 +14,7 @@ id - , service_name, version, name, code, len, seq, remark, data_type + , service_name, version, code, len, seq, remark, data_type