فهرست منبع

[Improve][Moduralization][Module_OcppBackend / Module_OcppBackend20]

2021.11.17 / Folus Wen

Actions:
1. Websocket ping/pong interval change without reconnect server.
2. WebsocketPingInterval reject 1~9 configuration value.

Files:
1. As follow commit history

Image version: D0.00.XX.XXXX.XX
Image checksum: XXXXXXXX

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen 3 سال پیش
والد
کامیت
16db50e079

+ 0 - 6
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -839,7 +839,6 @@ static int HeartBeatCountPerHour = 0;
 
 sqlite3 *db;
 
-extern void  ChageWebSocketPingInterval(int WebSocketPingInterval);
 int TransactionMessageAttemptsGet(void);
 int TransactionMessageRetryIntervalGet(void);
 int GetOcppConnStatus(void);
@@ -17009,11 +17008,6 @@ int handleSetVariablesRequest(char *uuid, char *payload)
 							else
 								strcpy((char*)ShmOCPP20Data->SetVariables.Response_setVariableResult[idx].attributeStatus, SetVariableStatusEnumTypeStr[SetVariableStatusEnumType_Accepted]);
 
-							if((strstr((char*)ShmOCPP20Data->SetVariables.setVariableData[idx].component.name, "OCPPCommCtrlr") != NULL) && (strstr((char*)ShmOCPP20Data->SetVariables.setVariableData[idx].variable.name, "WebSocketPingInterval") != NULL))
-							{
-								ChageWebSocketPingInterval(atoi((char*)ShmOCPP20Data->ControllerComponentVariable[idx_var].variableAttribute[0].value));
-							}
-
 							if((strstr((char*)ShmOCPP20Data->SetVariables.setVariableData[idx].component.name, "OCPPCommCtrlr") != NULL) && (strstr((char*)ShmOCPP20Data->SetVariables.setVariableData[idx].variable.name, "HeartbeatInterval") != NULL))
 							{
 								HeartBeatWaitTime = (atoi((char*)ShmOCPP20Data->ControllerComponentVariable[idx_var].variableAttribute[0].value)<5) ? 5 : atoi((char*)ShmOCPP20Data->ControllerComponentVariable[idx_var].variableAttribute[0].value);

+ 36 - 21
EVSE/Modularization/ocpp20/Module_OcppBackend20.c

@@ -16,6 +16,7 @@ struct StartTime
 	struct timespec reConnect;
 	struct timespec startTimeDog;
 	struct timespec startTimeQueue;
+	struct timespec pingOn;
 }startTime;
 
 struct QueueOpInfo queueOpInfo;
@@ -76,6 +77,15 @@ int SendData(struct lws *wsi)
     return n;
 }
 
+int SendPing(struct lws *wsi)
+{
+	uint8_t ping[LWS_PRE + 125];
+
+	DEBUG_OCPPMESSAGE_INFO("===========> Set PING packet.\n");
+
+	return lws_write(wsi, ping + LWS_PRE, 0, LWS_WRITE_PING);
+}
+
 static int OCPP20Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
 {
 	char 	buf[256]={0}, hash[20]={0}, key_b64[40]={0}, tempin[WEBSOCKET_BUFFER_SIZE]={0}, sstr[WEBSOCKET_BUFFER_SIZE]={0};
@@ -192,7 +202,8 @@ static int OCPP20Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			//connected
 			ConnectionEstablished=1;
 			SetOcppConnStatus(TRUE);
-
+			refreshStartTimer(&startTime.pingOn);
+			queueOpInfo.PreTransactionMessageResend = 0;
 			break;
 		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
 			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR %s\n", (char *)in );
@@ -242,9 +253,12 @@ static int OCPP20Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			ConnectionEstablished=0;
 			break;
 		case LWS_CALLBACK_CLIENT_WRITEABLE://10
-			//if(need to send message and its relevant data already store into SendBuffer)
-			SendData(wsi);
-			//lws_rx_flow_control( wsi, 1 );
+			if((0 < GetWebSocketPingInterval()) && (GetWebSocketPingInterval() <= getDiffSecNow(startTime.pingOn)) && (GetServerSign() == TRUE))
+			{
+				SendPing(wsi);
+			}
+			else
+				SendData(wsi);
 			break;
 
 		case LWS_CALLBACK_CLIENT_RECEIVE://8
@@ -285,10 +299,12 @@ static int OCPP20Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 
 		  	ReceivedMessage((void *)strtrim(tempin), strlen(tempin));
 		  	isWebsocketSendable = 1;
+		  	refreshStartTimer(&startTime.pingOn);
 			break;
 		case LWS_CALLBACK_CLIENT_RECEIVE_PONG:
 			DEBUG_INFO("LWS_CALLBACK_CLIENT_RECEIVE_PONG\n");
 			DEBUG_OCPPMESSAGE_INFO("<==== Get PONG packet.\n");
+			refreshStartTimer(&startTime.pingOn);
 			break;
 		case LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION:
 			DEBUG_INFO("LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION\n");
@@ -401,7 +417,7 @@ void* ConnectWsServer(void* data)  //int ConnectWsServer()
 
 	ContextInfo.protocols = protocols;
 	ContextInfo.timeout_secs = GetBackendConnectionTimeout();
-	ContextInfo.ws_ping_pong_interval = GetWebSocketPingInterval();
+	//ContextInfo.ws_ping_pong_interval = GetWebSocketPingInterval();
 	ContextInfo.ka_time = 20;
 	ContextInfo.keepalive_timeout = 5;
 	ContextInfo.ka_probes = 2;
@@ -947,7 +963,7 @@ void* processWatchdog()
 			if(counterLwsRestart >= 2)
 			{
 				DEBUG_INFO("LWS watch dog timeout over 3 count.\n");
-				system("pkill OcppBackend");
+				system("pkill OcppBackend20");
 			}
 			else
 				counterLwsRestart++;
@@ -958,7 +974,7 @@ void* processWatchdog()
 		if(counterConnect >= 2)
 		{
 			DEBUG_INFO("Connect OCPP server timeout over 3 count.\n");
-			system("pkill OcppBackend");
+			system("pkill OcppBackend20");
 		}
 
 		/*
@@ -968,7 +984,18 @@ void* processWatchdog()
 			system("/root/Module_PhBackend &");
 		}*/
 
-		sleep(1);
+		if((0 < GetWebSocketPingInterval()) && ((GetWebSocketPingInterval()+5) <= getDiffSecNow(startTime.pingOn)) && (wsi_client != NULL) && (GetServerSign() == TRUE))
+		{
+			DEBUG_WARN("Pong packet receive timeout.\n");
+			system("pkill OcppBackend20");
+		}
+		else if((0 < GetWebSocketPingInterval()) && (GetWebSocketPingInterval() <= getDiffSecNow(startTime.pingOn)) && (wsi_client != NULL) && (GetServerSign() == TRUE))
+		{
+			lws_callback_on_writable(wsi_client);
+		}
+
+
+		usleep(500000);
 	}
 	pthread_exit(NULL); //
 }
@@ -1074,12 +1101,6 @@ int removeMessageSentFile(void)
 	return 0;
 }
 
-static int changeChageWebSocketPingInterval = FALSE;
-void  ChageWebSocketPingInterval(int  WebSocketPingInterval)
-{
-	changeChageWebSocketPingInterval = TRUE;
-}
-
 //================================================
 // Main process
 //================================================
@@ -1177,18 +1198,12 @@ int main(void)
 					DEBUG_WARN("Heartbeat re-send over 30 count.\n");
 				}
 
-				if((changeChageWebSocketPingInterval == TRUE) || (GetOcppConnStatus() == 0))
+				if((GetOcppConnStatus() == 0))
 				{
 					if(getDiffSecNow(startTime.reConnect) >= 3)
 					{
 						DEBUG_INFO("GetOcppConnStatus() = %d\n", GetOcppConnStatus());
 
-						if(changeChageWebSocketPingInterval)
-						{
-							DEBUG_INFO("Websocket ping interval changed request.\n");
-							changeChageWebSocketPingInterval = FALSE;
-						}
-
 						lws_context_destroy(context);
 						ConnectionEstablished = 0;
 						context = NULL;

+ 7 - 8
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -95,7 +95,6 @@ static struct OCPPAuthLocalElemet
 //============================================
 static int HeartBeatWithNOResponse = 0;
 
-extern void  ChageWebSocketPingInterval(int WebSocketPingInterval);
 extern sqlite3 *db;
 
 int TransactionMessageAttemptsGet(void);
@@ -9331,11 +9330,6 @@ int handleChangeConfigurationRequest(char *uuid, char *payload)
     sendChangeConfigurationConfirmation(uuid, comfirmstr);
 	ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
 
-	if((strcmp(keystr,"WebSocketPingInterval")==0) && (strcmp(comfirmstr,"Accepted")==0))
-	{
-		ChageWebSocketPingInterval(atoi(valuestr));
-	}
-
 	if(((strcmp(keystr,"AuthorizationKey")==0) || (strcmp(keystr,"SecurityProfile")==0)) && (strcmp(comfirmstr,"Accepted")==0))
 	{
 		StoreUsrConfigData(&ShmSysConfigAndInfo->SysConfig);
@@ -18111,8 +18105,13 @@ int setKeyValue(char *key, char *value)
     		}
     		else
     		{
-        		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
-        		isSuccess = ConfigurationStatus_Accepted;
+    			if((atoi(value) == 0) || (atoi(value) >= 10))
+    			{
+    				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
+					isSuccess = ConfigurationStatus_Accepted;
+    			}
+    			else
+    				isSuccess = ConfigurationStatus_Rejected;
     		}
     	}
     	else

+ 34 - 22
EVSE/Modularization/ocppfiles/Module_OcppBackend.c

@@ -16,6 +16,7 @@ struct StartTime
 	struct timespec reConnect;
 	struct timespec startTimeDog;
 	struct timespec startTimeQueue;
+	struct timespec pingOn;
 }startTime;
 
 struct QueueOpInfo queueOpInfo;
@@ -130,6 +131,15 @@ int SendData(struct lws *wsi)
     return n;
 }
 
+int SendPing(struct lws *wsi)
+{
+	uint8_t ping[LWS_PRE + 125];
+
+	DEBUG_OCPPMESSAGE_INFO("===========> Set PING packet.\n");
+
+	return lws_write(wsi, ping + LWS_PRE, 0, LWS_WRITE_PING);
+}
+
 static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
 {
 	char 	buf[256]={0}, hash[20]={0}, key_b64[40]={0}, tempin[WEBSOCKET_BUFFER_SIZE]={0}, sstr[WEBSOCKET_BUFFER_SIZE]={0};
@@ -248,7 +258,7 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			//connected
 			ConnectionEstablished=1;
 			SetOcppConnStatus(TRUE);
-
+			refreshStartTimer(&startTime.pingOn);
 			queueOpInfo.TransactionMessageResend = 0;
 			break;
 		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
@@ -299,9 +309,13 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			ConnectionEstablished=0;
 			break;
 		case LWS_CALLBACK_CLIENT_WRITEABLE://10
-			//if(need to send message and its relevant data already store into SendBuffer)
-			SendData(wsi);
-			//lws_rx_flow_control( wsi, 1 );
+			if((0 < GetWebSocketPingInterval()) && (GetWebSocketPingInterval() <= getDiffSecNow(startTime.pingOn)) && (GetServerSign() == TRUE))
+			{
+				SendPing(wsi);
+			}
+			else
+				SendData(wsi);
+
 			break;
 
 		case LWS_CALLBACK_CLIENT_RECEIVE://8
@@ -342,10 +356,12 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 
 		  	ReceivedMessage((void *)strtrim(tempin), strlen(tempin));
 		  	isWebsocketSendable = 1;
+		  	refreshStartTimer(&startTime.pingOn);
 			break;
 		case LWS_CALLBACK_CLIENT_RECEIVE_PONG:
 			DEBUG_INFO("LWS_CALLBACK_CLIENT_RECEIVE_PONG\n");
 			DEBUG_OCPPMESSAGE_INFO("<===== Get PONG packet.\n");
+			refreshStartTimer(&startTime.pingOn);
 			isWebsocketSendable = 1;
 			break;
 		case LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION:
@@ -463,7 +479,7 @@ void* ConnectWsServer(void* data)  //int ConnectWsServer()
 
 	ContextInfo.protocols = protocols;
 	ContextInfo.timeout_secs = GetBackendConnectionTimeout();
-	ContextInfo.ws_ping_pong_interval = GetWebSocketPingInterval();
+	//ContextInfo.ws_ping_pong_interval = GetWebSocketPingInterval();
 	ContextInfo.ka_time = 20;
 	ContextInfo.keepalive_timeout = 5;
 	ContextInfo.ka_probes = 2;
@@ -1253,7 +1269,18 @@ void* processWatchdog()
 			system("/root/Module_PhBackend &");
 		}*/
 
-		sleep(1);
+		if((0 < GetWebSocketPingInterval()) && ((GetWebSocketPingInterval()+5) <= getDiffSecNow(startTime.pingOn)) && (wsi_client != NULL) && (GetServerSign() == TRUE))
+		{
+			DEBUG_WARN("Pong packet receive timeout.\n");
+			system("pkill OcppBackend");
+		}
+		else if((0 < GetWebSocketPingInterval()) && (GetWebSocketPingInterval() <= getDiffSecNow(startTime.pingOn)) && (wsi_client != NULL) && (GetServerSign() == TRUE))
+		{
+			lws_callback_on_writable(wsi_client);
+		}
+
+
+		usleep(500000);
 	}
 	pthread_exit(NULL); //
 }
@@ -1359,13 +1386,6 @@ int removeMessageSentFile(void)
 	return 0;
 }
 
-static int changeChageWebSocketPingInterval = FALSE;
-
-void  ChageWebSocketPingInterval(int  WebSocketPingInterval)
-{
-	changeChageWebSocketPingInterval = TRUE;
-}
-
 //================================================
 // Main process
 //================================================
@@ -1446,7 +1466,6 @@ int main(void)
 		DEBUG_INFO( "Opened OcppAuthLocal table successfully\n");
 	}
 
-
 	// Create Table Transaction
 	if(sqlite3_exec(db, sqlTransaction, 0, 0, &errMsg) != SQLITE_OK)
 	{
@@ -1521,18 +1540,11 @@ int main(void)
 					DEBUG_WARN("Heartbeat re-send over 30 count.\n");
 				}
 
-				if((changeChageWebSocketPingInterval == TRUE) || (GetOcppConnStatus() == 0))
+				if((GetOcppConnStatus() == 0))
 				{
 					if(getDiffSecNow(startTime.reConnect) >= 3)
 					{
 						DEBUG_INFO("GetOcppConnStatus() = %d\n", GetOcppConnStatus());
-
-						if(changeChageWebSocketPingInterval)
-						{
-							DEBUG_INFO("Websocket ping interval changed request.\n");
-							changeChageWebSocketPingInterval = FALSE;
-						}
-
 						lws_context_destroy(context);
 						ConnectionEstablished = 0;
 						context = NULL;

+ 7 - 6
EVSE/Modularization/ocppph/MessageHandler.c

@@ -96,7 +96,6 @@ static struct OCPPAuthLocalElemet
 //============================================
 static int HeartBeatWithNOResponse = 0;
 
-extern void  ChageWebSocketPingInterval(int WebSocketPingInterval);
 extern sqlite3 *db;
 
 int TransactionMessageAttemptsGet(void);
@@ -9069,11 +9068,6 @@ int handleChangeConfigurationRequest(char *uuid, char *payload)
     sendChangeConfigurationConfirmation(uuid, comfirmstr);
 	ShmOCPP16DataPH->MsMsg.bits.ChangeConfigurationConf = 1;
 
-	if((strcmp(keystr,"WebSocketPingInterval")==0) && (strcmp(comfirmstr,"Accepted")==0))
-	{
-		ChageWebSocketPingInterval(atoi(valuestr));
-	}
-
 	if(((strcmp(keystr,"AuthorizationKey")==0) || (strcmp(keystr,"SecurityProfile")==0)) && (strcmp(comfirmstr,"Accepted")==0))
 	{
 		StoreUsrConfigData(&ShmSysConfigAndInfo->SysConfig);
@@ -17734,6 +17728,13 @@ int setKeyValue(char *key, char *value)
     		{
         		sprintf((char *)ShmOCPP16DataPH->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
         		isSuccess = ConfigurationStatus_Accepted;
+        		if((atoi(value) == 0) || (atoi(value) >= 10))
+        		{
+        			sprintf((char *)ShmOCPP16DataPH->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
+        		    isSuccess = ConfigurationStatus_Accepted;
+        		}
+        		else
+        			isSuccess = ConfigurationStatus_Rejected;
     		}
     	}
     	else

+ 35 - 19
EVSE/Modularization/ocppph/Module_OcppBackend.c

@@ -16,6 +16,7 @@ struct StartTime
 	struct timespec reConnect;
 	struct timespec startTimeDog;
 	struct timespec startTimeQueue;
+	struct timespec pingOn;
 }startTime;
 
 struct QueueOpInfo queueOpInfo;
@@ -130,6 +131,16 @@ int SendData(struct lws *wsi)
     return n;
 }
 
+int SendPing(struct lws *wsi)
+{
+	uint8_t ping[LWS_PRE + 125];
+
+	DEBUG_OCPPMESSAGE_INFO("===========> Set PING packet.\n");
+
+    return lws_write(wsi, ping + LWS_PRE, 0, LWS_WRITE_PING);
+}
+
+
 static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
 {
 	char 	buf[256]={0}, hash[20]={0}, key_b64[40]={0}, tempin[WEBSOCKET_BUFFER_SIZE]={0}, sstr[WEBSOCKET_BUFFER_SIZE]={0};
@@ -249,6 +260,7 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			ConnectionEstablished=1;
 			SetOcppConnStatus(TRUE);
 
+			refreshStartTimer(&startTime.pingOn);
 			queueOpInfo.TransactionMessageResend = 0;
 			break;
 		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
@@ -299,9 +311,13 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			ConnectionEstablished=0;
 			break;
 		case LWS_CALLBACK_CLIENT_WRITEABLE://10
-			//if(need to send message and its relevant data already store into SendBuffer)
-			SendData(wsi);
-			//lws_rx_flow_control( wsi, 1 );
+			if((0 < GetWebSocketPingInterval()) && (GetWebSocketPingInterval() <= getDiffSecNow(startTime.pingOn)) && (GetServerSign() == TRUE))
+			{
+				SendPing(wsi);
+			}
+			else
+				SendData(wsi);
+
 			break;
 
 		case LWS_CALLBACK_CLIENT_RECEIVE://8
@@ -342,10 +358,12 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 
 		  	ReceivedMessage((void *)strtrim(tempin), strlen(tempin));
 		  	isWebsocketSendable = 1;
+		  	refreshStartTimer(&startTime.pingOn);
 			break;
 		case LWS_CALLBACK_CLIENT_RECEIVE_PONG:
 			DEBUG_INFO("LWS_CALLBACK_CLIENT_RECEIVE_PONG\n");
 			DEBUG_OCPPMESSAGE_INFO("<===== Get PONG packet.\n");
+			refreshStartTimer(&startTime.pingOn);
 			isWebsocketSendable = 1;
 			break;
 		case LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION:
@@ -464,7 +482,7 @@ void* ConnectWsServer(void* data)  //int ConnectWsServer()
 
 	ContextInfo.protocols = protocols;
 	ContextInfo.timeout_secs = GetBackendConnectionTimeout();
-	ContextInfo.ws_ping_pong_interval = GetWebSocketPingInterval();
+	//ContextInfo.ws_ping_pong_interval = GetWebSocketPingInterval();
 	ContextInfo.ka_time = 20;
 	ContextInfo.keepalive_timeout = 5;
 	ContextInfo.ka_probes = 2;
@@ -1254,7 +1272,18 @@ void* processWatchdog()
 			system("/root/Module_PhBackend &");
 		}*/
 
-		sleep(1);
+		if((0 < GetWebSocketPingInterval()) && ((GetWebSocketPingInterval()+5) <= getDiffSecNow(startTime.pingOn)) && (wsi_client != NULL) && (GetServerSign() == TRUE))
+		{
+			DEBUG_WARN("Pong packet receive timeout.\n");
+			system("pkill OcppBackend");
+		}
+		else if((0 < GetWebSocketPingInterval()) && (GetWebSocketPingInterval() <= getDiffSecNow(startTime.pingOn)) && (wsi_client != NULL) && (GetServerSign() == TRUE))
+		{
+			lws_callback_on_writable(wsi_client);
+		}
+
+
+		usleep(500000);
 	}
 	pthread_exit(NULL); //
 }
@@ -1360,13 +1389,6 @@ int removeMessageSentFile(void)
 	return 0;
 }
 
-static int changeChageWebSocketPingInterval = FALSE;
-
-void  ChageWebSocketPingInterval(int  WebSocketPingInterval)
-{
-	changeChageWebSocketPingInterval = TRUE;
-}
-
 //================================================
 // Main process
 //================================================
@@ -1522,18 +1544,12 @@ int main(void)
 					DEBUG_WARN("Heartbeat re-send over 30 count.\n");
 				}
 
-				if((changeChageWebSocketPingInterval == TRUE) || (GetOcppConnStatus() == 0))
+				if((GetOcppConnStatus() == 0))
 				{
 					if(getDiffSecNow(startTime.reConnect) >= 3)
 					{
 						DEBUG_INFO("GetOcppConnStatus() = %d\n", GetOcppConnStatus());
 
-						if(changeChageWebSocketPingInterval)
-						{
-							DEBUG_INFO("Websocket ping interval changed request.\n");
-							changeChageWebSocketPingInterval = FALSE;
-						}
-
 						lws_context_destroy(context);
 						ConnectionEstablished = 0;
 						context = NULL;