|
@@ -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;
|