Quellcode durchsuchen

Minor changes in transport layer classes and main method

Marc Mültin vor 8 Jahren
Ursprung
Commit
ee5756c592

+ 1 - 6
RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/main/StartEVCC.java

@@ -24,7 +24,6 @@
 package org.v2gclarity.risev2g.evcc.main;
 
 import org.v2gclarity.risev2g.evcc.session.V2GCommunicationSessionHandlerEVCC;
-import org.v2gclarity.risev2g.evcc.transportLayer.UDPClient;
 import org.v2gclarity.risev2g.shared.enumerations.GlobalValues;
 import org.v2gclarity.risev2g.shared.utils.MiscUtils;
 
@@ -33,11 +32,7 @@ public class StartEVCC {
 	public static void main(String[] args) {
 		MiscUtils.setV2gEntityConfig(GlobalValues.EVCC_CONFIG_PROPERTIES_PATH.toString());
 		
-		UDPClient udpClient = UDPClient.getInstance();
-		
-		if (udpClient.initialize()) {
-			V2GCommunicationSessionHandlerEVCC sessionHandler = new V2GCommunicationSessionHandlerEVCC();
-		}
+		new V2GCommunicationSessionHandlerEVCC();
 	}
 
 }

+ 6 - 3
RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/session/V2GCommunicationSessionHandlerEVCC.java

@@ -75,13 +75,14 @@ public class V2GCommunicationSessionHandlerEVCC implements Observer {
 		
 		setSessionRetryCounter(0);
 		
-		if (!initialize()) {
-			// TODO ja, was tun?
-		};
+		initialize();
 	}
 	
 	
 	private boolean initialize() {
+		UDPClient udpClient = UDPClient.getInstance();
+		udpClient.initialize();
+		
 		byte[] udpResponse = null;
 		SECCDiscoveryRes seccDiscoveryRes = null;
 		setSessionRetryCounter(getSeccDiscoveryRequestCounter() + 1);
@@ -237,7 +238,9 @@ public class V2GCommunicationSessionHandlerEVCC implements Observer {
 	}
 	
 	private void terminate(TerminateSession terminationObject) {
+		getTransportLayerThread().interrupt();
 		setV2gCommunicationSessionEVCC(null);
+		UDPClient.getInstance().stop();;
 		
 		if (!terminationObject.isSuccessfulTermination()) {
 			// TODO should there be a retry of the communication session, and if yes, how often?

+ 3 - 1
RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/transportLayer/TCPClient.java

@@ -94,7 +94,7 @@ public class TCPClient extends StatefulTransportLayerClient {
 	
 	@Override
 	public void run() {
-		while (!Thread.interrupted()) { 
+		while (!Thread.currentThread().isInterrupted()) { 
 			if (getTimeout() > 0) {
 				try {
 					getSocketToServer().setSoTimeout(getTimeout());
@@ -110,6 +110,8 @@ public class TCPClient extends StatefulTransportLayerClient {
 				}
 			}
 		}
+		
+		stop();
 	}
 	
 	

+ 3 - 1
RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/transportLayer/TLSClient.java

@@ -161,7 +161,7 @@ public class TLSClient extends StatefulTransportLayerClient {
 	
 	@Override
 	public void run() {
-		while (!Thread.interrupted()) { 
+		while (!Thread.currentThread().isInterrupted()) { 
 			if (getTimeout() >= 0) {
 				try {
 					getTlsSocketToServer().setSoTimeout(getTimeout());
@@ -180,6 +180,8 @@ public class TLSClient extends StatefulTransportLayerClient {
 				break;
 			}
 		}
+		
+		stop();
 	}
 	
 	

+ 2 - 1
RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/transportLayer/UDPClient.java

@@ -142,7 +142,8 @@ public class UDPClient {
 	
 
 	public void stop() {
-		// the UDPClient is not supposed to be stopped
+		getSocketToUDPServer().close();
+		getLogger().debug("UDP client stopped");
 	}
 	
 	

+ 1 - 2
RISE-V2G-SECC/src/main/java/org/v2gclarity/risev2g/secc/session/V2GCommunicationSessionHandlerSECC.java

@@ -197,8 +197,7 @@ public class V2GCommunicationSessionHandlerSECC implements Observer {
 			// Remove HashMap entry
 			getConnectionHandlerMap().remove(connectionHandler);
 			
-			getLogger().debug("Thread '" + connectionThread.getName() + 
-							  "' has been interrupted and removed" );
+			getLogger().debug("Thread '" + connectionThread.getName() + "' has been interrupted and removed\n\n" );
 		} else {
 			String address = connectionHandler.getAddress();
 			int port = connectionHandler.getPort(); 

+ 2 - 5
RISE-V2G-SECC/src/main/java/org/v2gclarity/risev2g/secc/states/WaitForChargeParameterDiscoveryReq.java

@@ -35,6 +35,7 @@ import org.v2gclarity.risev2g.shared.enumerations.V2GMessages;
 import org.v2gclarity.risev2g.shared.messageHandling.ReactionToIncomingMessage;
 import org.v2gclarity.risev2g.shared.messageHandling.TerminateSession;
 import org.v2gclarity.risev2g.shared.misc.TimeRestrictions;
+import org.v2gclarity.risev2g.shared.utils.SleepUtils;
 import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.ACEVChargeParameterType;
 import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.BodyBaseType;
 import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.ChargeParameterDiscoveryReqType;
@@ -92,11 +93,7 @@ public class WaitForChargeParameterDiscoveryReq extends ServerState {
 				
 				// Wait a bit and check if the schedule has already been provided
 				// TODO is this the best way?
-				try {
-					Thread.sleep(TimeRestrictions.getV2G_EVCC_Msg_Timeout(V2GMessages.CHARGE_PARAMETER_DISCOVERY_RES)-1000);
-				} catch (InterruptedException e) {
-					return new TerminateSession("InterruptedException while waiting for schedule");
-				}
+				SleepUtils.safeSleep(TimeRestrictions.getV2G_EVCC_Msg_Timeout(V2GMessages.CHARGE_PARAMETER_DISCOVERY_RES)-1000);
 				
 				if (chargeParameterDiscoveryReq.getRequestedEnergyTransferMode().toString().startsWith("AC")) 
 					chargeParameterDiscoveryRes.setEVSEChargeParameter(

+ 1 - 1
RISE-V2G-SECC/src/main/java/org/v2gclarity/risev2g/secc/transportLayer/TCPServer.java

@@ -61,7 +61,7 @@ public final class TCPServer extends StatefulTransportLayerServer {
 	@Override
 	public void run() {
 		try {
-			while (!Thread.interrupted()) {
+			while (!Thread.currentThread().isInterrupted()) {
 				getLogger().debug("Waiting for new TCP client connection ...");
 				setTcpClientSocket(getTcpServerSocket().accept());
 				

+ 1 - 1
RISE-V2G-SECC/src/main/java/org/v2gclarity/risev2g/secc/transportLayer/TLSServer.java

@@ -105,7 +105,7 @@ public final class TLSServer extends StatefulTransportLayerServer {
 	@Override
 	public void run() {
 		try {
-			while (!Thread.interrupted()) {
+			while (!Thread.currentThread().isInterrupted()) {
 				getLogger().debug("Waiting for new TLS client connection ...");
 				setTlsClientSocket((SSLSocket) getTlsServerSocket().accept());
 				

+ 3 - 1
RISE-V2G-SECC/src/main/java/org/v2gclarity/risev2g/secc/transportLayer/UDPServer.java

@@ -101,7 +101,7 @@ public class UDPServer extends Observable implements Runnable {
 
 
 	public void run() {
-		while (!Thread.interrupted()) {
+		while (!Thread.currentThread().isInterrupted()) {
 	        setUdpClientPacket(new DatagramPacket(udpClientRequest, udpClientRequest.length));
 	        
 	        try {
@@ -118,6 +118,8 @@ public class UDPServer extends Observable implements Runnable {
 				getUdpServerSocket().close();
 			}  
 	    }
+		
+		stop();
 	}
 
 	

+ 2 - 0
RISE-V2G-Shared/src/main/java/org/v2gclarity/risev2g/shared/messageHandling/MessageHandler.java

@@ -296,6 +296,8 @@ public class MessageHandler {
 			 * XSD would require to always set a so-called target namespace, in this case GlobalValues.V2G_CI_MSG_BODY_NAMESPACE.
 			 * But you could also use the empty namespace "" and would still be conform to the standard.
 			 * The choice of the namespace heavily influences interoperability as the resulting digest values will be different.
+			 * 
+			 * I recommend using the namespace GlobalValues.V2G_CI_MSG_BODY_NAMESPACE as this seems to be adopted by the industry.
 			 */
 			switch (messageName) {
 			case "CertificateChain":

+ 6 - 3
RISE-V2G-Shared/src/main/java/org/v2gclarity/risev2g/shared/utils/SecurityUtils.java

@@ -719,6 +719,7 @@ public final class SecurityUtils {
 		dhPublicKey.setId("id1"); 
 		
 		byte[] uncompressedDHpublicKey = getUncompressedSubjectPublicKey((ECPublicKey) ecdhKeyPair.getPublic());
+		
 		getLogger().debug("Created DHpublickey: " + ByteUtils.toHexString(uncompressedDHpublicKey));
 		dhPublicKey.setValue(uncompressedDHpublicKey);
 		
@@ -1437,6 +1438,7 @@ public final class SecurityUtils {
 			byte[] encryptedKeyWithIV = new byte[ivParamSpec.getIV().length + encryptedKey.length];
 			System.arraycopy(ivParamSpec.getIV(), 0, encryptedKeyWithIV, 0, ivParamSpec.getIV().length);
 			System.arraycopy(encryptedKey, 0, encryptedKeyWithIV, ivParamSpec.getIV().length, encryptedKey.length);
+			getLogger().debug("Encrypted private key: " + ByteUtils.toHexString(encryptedKeyWithIV));
 			
 			return encryptedKeyWithIV;
 		} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | 
@@ -1623,9 +1625,10 @@ public final class SecurityUtils {
 
 		for(Rdn rdn : ln.getRdns()) {
 		    if (rdn.getType().equalsIgnoreCase("CN")) {
-		    	// Optional hyphens used for better human readability must be omitted here
-		    	emaid.setId("id1");
-		    	emaid.setValue(rdn.getValue().toString().replace("-", ""));
+			    	// Optional hyphens used for better human readability must be omitted here
+			    	emaid.setId("id1");
+			    	emaid.setValue(rdn.getValue().toString().replace("-", ""));
+			    	
 		        break;
 		    }
 		}

+ 20 - 0
RISE-V2G-Shared/src/main/java/org/v2gclarity/risev2g/shared/utils/SleepUtils.java

@@ -0,0 +1,20 @@
+package org.v2gclarity.risev2g.shared.utils;
+
+import java.util.concurrent.TimeUnit;
+
+public final class SleepUtils {
+
+	public static void safeSleep(final TimeUnit timeUnit, final long duration) {
+		safeSleep(timeUnit.toMillis(duration));
+	}
+	
+	public static void safeSleep(final long durationInMilliSecs) {
+		try {
+			Thread.sleep(durationInMilliSecs);
+		} catch (final InterruptedException e) {
+			Thread.currentThread().interrupt();
+		}
+	}
+	
+	private SleepUtils() {}
+}