浏览代码

[Improve][Modularization][Module_OcppBackend20]

2021.04.20 / Folus Wen

Actions:
1. define.h extend datetime array size to 36 bytes.
2. OCPP20 implement certification signature logic.

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 年之前
父节点
当前提交
8fd32cfac2
共有 3 个文件被更改,包括 174 次插入65 次删除
  1. 138 36
      EVSE/Modularization/ocpp20/MessageHandler.c
  2. 5 5
      EVSE/Modularization/ocppfiles/MessageHandler.c
  3. 31 24
      EVSE/Projects/define.h

+ 138 - 36
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -6016,6 +6016,23 @@ void CheckSystemValue(void)
 		{
 			sendLogStatusNotificationRequest((char *)ShmOCPP20Data->LogStatusNotification.status);
 		}
+
+		//==========================================
+		// csu trigger SignCertificateReq
+		//==========================================
+		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP20Data->SpMsg.bits.SignCertificateReq == ON))
+		{
+			if((access("/Storage/OCPP/certCP.csr",F_OK) != -1) &&
+			   (strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignChargingStationCertificate]) == 0) )
+			{
+				sendSignCertificateRequest(CertificateSignedStatusEnumType_ChargingStationCertificate);
+			}
+			else if((access("/Storage/OCPP/certV2G.csr",F_OK) != -1) &&
+				  (strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[CertificateSignedStatusEnumType_V2GCertificate]) == 0))
+			{
+				sendSignCertificateRequest(CertificateSignedStatusEnumType_V2GCertificate);
+			}
+		}
 	}
 }
 
@@ -7935,7 +7952,7 @@ int sendSecurityEventNotificationRequest()
 	return result;
 }
 
-int sendSignCertificateRequest()
+int sendSignCertificateRequest(CertificateSigningUseEnumType certType)
 {
 	mtrace();
 	int result = FAIL;
@@ -7945,7 +7962,23 @@ int sendSignCertificateRequest()
 	json_object *SignCertificate = json_object_new_object();
 	DEBUG_INFO("sendSignCertificateRequest...\n");
 
+	// Read csr file content
+	memset(ShmOCPP20Data->SignCertificate.csr, 0x00, ARRAY_SIZE(ShmOCPP20Data->SignCertificate.csr));
+	FILE *fp=fopen(((certType == CertificateSignedStatusEnumType_V2GCertificate)?"/Storage/OCPP/certV2G.csr":"/Storage/OCPP/certCP.csr"),"r");
+	char *line = NULL;
+	size_t len = 0;
+	while(getline(&line, &len, fp) != -1)
+	{
+		if((strstr(line, "BEGIN CERTIFICATE REQUEST") == NULL) && (strstr(line, "END CERTIFICATE REQUEST") == NULL))
+		{
+			memcpy(&ShmOCPP20Data->SignCertificate.csr[strlen((char*)ShmOCPP20Data->SignCertificate.csr)], line, (strlen(line)-1));
+		}
+	}
+	fclose(fp);
+
 	json_object_object_add(SignCertificate, "csr", json_object_new_string((char*)ShmOCPP20Data->SignCertificate.csr));
+
+	sprintf((char*)ShmOCPP20Data->SignCertificate.certificateType, CertificateSigningUseEnumTypeStr[certType]);
 	json_object_object_add(SignCertificate, "certificateType", json_object_new_string((char*)ShmOCPP20Data->SignCertificate.certificateType));
 
 	random_uuid(guid);
@@ -9096,11 +9129,21 @@ int sendCertificateSignedConfirmation(char *uuid)
 	int result = FAIL;
 	char message[4096]={0};
 	json_object *CertificateSigned = json_object_new_object();
+	json_object *statusInfo = json_object_new_object();
 
 	DEBUG_INFO("sendCertificateSignedConfirmation...\n");
 
 	json_object_object_add(CertificateSigned, "status", json_object_new_string((char*)ShmOCPP20Data->CertificateSigned.Response_status));
 
+	if(strlen((char*)ShmOCPP20Data->CertificateSigned.Response_statusInfo.reasonCode) > 0)
+	{
+		json_object_object_add(statusInfo, "reasonCode", json_object_new_string((char*)ShmOCPP20Data->CertificateSigned.Response_statusInfo.reasonCode));
+
+		if(strlen((char*)ShmOCPP20Data->CertificateSigned.Response_statusInfo.additionalInfo) > 0)
+			json_object_object_add(statusInfo, "statadditionalInfous", json_object_new_string((char*)ShmOCPP20Data->CertificateSigned.Response_statusInfo.additionalInfo));
+	}
+	json_object_object_add(CertificateSigned, "statusInfo", statusInfo);
+
 	sprintf(message,"[%d,\"%s\",%s]"
 								,MESSAGE_TYPE_CALLRESULT
 								,uuid
@@ -10293,18 +10336,7 @@ int handleCertificateSignedRequest(char *uuid, char *payload)
 		memset(&ShmOCPP20Data->CertificateSigned, 0, sizeof(struct CertificateSigned_20));
 		memcpy(&ShmOCPP20Data->CertificateSigned.guid, uuid, ARRAY_SIZE(ShmOCPP20Data->CertificateSigned.guid));
 		// Required data
-		if(json_object_array_length(json_object_object_get(CertificateSigned, "certificate")) <= ARRAY_SIZE(ShmOCPP20Data->CertificateSigned.certificate))
-		{
-			for(int idx=0;idx<json_object_array_length(json_object_object_get(CertificateSigned, "certificate"));idx++)
-			{
-				sprintf((char*)ShmOCPP20Data->CertificateSigned.certificate[idx], "%s", json_object_get_string(json_object_array_get_idx(json_object_object_get(CertificateSigned, "certificateType"), idx)));
-
-				/*
-				 * TODO:
-				 * 	1. Certificate install response
-				 */
-			}
-		}
+		sprintf((char*)ShmOCPP20Data->CertificateSigned.certificateChain, "%s", json_object_get_string(json_object_object_get(CertificateSigned, "certificateChain")));
 
 		// Optional data
 		if(json_object_object_get(CertificateSigned, "certificateType") != NULL)
@@ -10313,17 +10345,28 @@ int handleCertificateSignedRequest(char *uuid, char *payload)
 
 			if(strcmp((char*)ShmOCPP20Data->CertificateSigned.certificateType, CertificateSigningUseEnumTypeStr[CertificateSignedStatusEnumType_ChargingStationCertificate]) == 0)
 			{
-
+				FILE *fp = fopen("/Storage/OCPP/certCP.crt", "w");
+				fprintf(fp, "%s", ShmOCPP20Data->CertificateSigned.certificateChain);
+				fclose(fp);
 			}
 			else if(strcmp((char*)ShmOCPP20Data->CertificateSigned.certificateType, CertificateSigningUseEnumTypeStr[CertificateSignedStatusEnumType_V2GCertificate]) == 0)
 			{
-
+				FILE *fp = fopen("/Storage/OCPP/certV2G.crt", "w");
+				fprintf(fp, "%s", ShmOCPP20Data->CertificateSigned.certificateChain);
+				fclose(fp);
 			}
-			else
-			{
+		}
+		else
+		{
+			FILE *fp = fopen("/Storage/OCPP/certCP.crt", "w");
+			fprintf(fp, "%s", ShmOCPP20Data->CertificateSigned.certificateChain);
+			fclose(fp);
 
-			}
+			fp = fopen("/Storage/OCPP/certV2G.crt", "w");
+			fprintf(fp, "%s", ShmOCPP20Data->CertificateSigned.certificateChain);
+			fclose(fp);
 		}
+		system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
 
 		strcpy((char*)ShmOCPP20Data->CertificateSigned.Response_status, CertificateSignedStatusEnumTypeStr[CertificateSignedStatusEnumType_Accepted]);
 	}
@@ -14967,7 +15010,6 @@ int handleTriggerMessageRequest(char *uuid, char *payload)
 	int result = FAIL;
 	int connectorIdIsNULL = FALSE;
 	int connectorIdInt =0;
-	char requestedMessagestr[40]={0};
 	json_object *TriggerMessage;
 
 	DEBUG_INFO("handleTriggerMessageRequest\n");
@@ -15002,17 +15044,17 @@ int handleTriggerMessageRequest(char *uuid, char *payload)
 
 	if((connectorIdIsNULL == TRUE) || ((connectorIdIsNULL == FALSE) && ((connectorIdInt > 0)  && (connectorIdInt <= gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/ ))) )
 	{
-		if((strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_BootNotification]) != 0) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_LogStatusNotification]) != 0) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_FirmwareStatusNotification]) != 0 ) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_Heartbeat]) != 0) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_MeterValues]) != 0) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignChargingStationCertificate]) != 0 ) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignV2GCertificate]) != 0 ) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_StatusNotification]) != 0 ) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_TransactionEvent]) != 0 ) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignCombinedCertificate]) != 0 ) &&
-			(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_PublishFirmwareStatusNotification]) != 0 ))
+		if((strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_BootNotification]) != 0) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_LogStatusNotification]) != 0) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_FirmwareStatusNotification]) != 0 ) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_Heartbeat]) != 0) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_MeterValues]) != 0) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignChargingStationCertificate]) != 0 ) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignV2GCertificate]) != 0 ) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_StatusNotification]) != 0 ) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_TransactionEvent]) != 0 ) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignCombinedCertificate]) != 0 ) &&
+			(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_PublishFirmwareStatusNotification]) != 0 ))
 		{
 			sprintf((char*)ShmOCPP20Data->TriggerMessage.Response_status, "%s",TriggerMessageStatusEnumTypeStr[TriggerMessageStatusEnumType_NotImplemented] );
 			sendTriggerMessageConfirmation(uuid);
@@ -15034,7 +15076,7 @@ int handleTriggerMessageRequest(char *uuid, char *payload)
 	//==========================
 	// Trigger message
 	//==========================
-	if( strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_FirmwareStatusNotification]) == 0)
+	if( strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_FirmwareStatusNotification]) == 0)
 	{
 		if((strlen((char*)ShmOCPP20Data->FirmwareStatusNotification.status) == 0) ||
 		   ((FirmwareStatusNotificationStatus != FirmwareStatusEnumType_Downloading) && (FirmwareStatusNotificationStatus != FirmwareStatusEnumType_Downloaded) && (FirmwareStatusNotificationStatus != FirmwareStatusEnumType_Idle) && (FirmwareStatusNotificationStatus != FirmwareStatusEnumType_Installing)))
@@ -15044,22 +15086,22 @@ int handleTriggerMessageRequest(char *uuid, char *payload)
 
 		ShmOCPP20Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
 	}
-	else if(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_LogStatusNotification]) == 0 )
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_LogStatusNotification]) == 0 )
 	{
 		if(strlen((char*)ShmOCPP20Data->LogStatusNotification.status) == 0)
 			sprintf((char*)ShmOCPP20Data->LogStatusNotification.status, "%s", UploadLogStatusEnumTypeStr[UploadLogStatusEnumType_Idle]);
 		ShmOCPP20Data->SpMsg.bits.LogStatusNotificationReq = ON;
 	}
-	else if(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_BootNotification]) == 0 )
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_BootNotification]) == 0 )
 	{
 		if(DB_updateBootType(BootReasonEnumType_Triggered))
 			server_sign = FALSE;
 	}
-	else if(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_Heartbeat]) == 0 )
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_Heartbeat]) == 0 )
 	{
 		clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP20Data->BootNotification.Response_interval);
 	}
-	else if (strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_MeterValues]) == 0 )
+	else if (strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_MeterValues]) == 0 )
 	{
 		if(connectorIdIsNULL == FALSE)
 		{
@@ -15078,7 +15120,7 @@ int handleTriggerMessageRequest(char *uuid, char *payload)
 			}
 		}
 	}
-	else if(strcmp(requestedMessagestr, MessageTriggerEnumTypeStr[MessageTriggerEnumType_StatusNotification]) == 0 )
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_StatusNotification]) == 0 )
 	{
 		if(connectorIdIsNULL == FALSE)
 		{
@@ -15093,6 +15135,57 @@ int handleTriggerMessageRequest(char *uuid, char *payload)
 				cpinitateMsg.bits[idx].StatusNotificationReq = ON;
 		}
 	}
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignChargingStationCertificate]) == 0 )
+	{
+		ShmOCPP20Data->SpMsg.bits.SignCertificateReq = ON;
+
+		if(access("/Storage/OCPP/certCP.csr",F_OK) == -1)
+		{
+			system("openssl req -newkey rsa:2048 -out /Storage/OCPP/certCP.csr -nodes -keyout /Storage/OCPP/certCP.key -subj \"/C=TW/ST=Taiwan/L=Taoyuan/O=Phihong Technology/OU=IT/CN=phihong.com\" &");
+		}
+	}
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignV2GCertificate]) == 0 )
+	{
+		ShmOCPP20Data->SpMsg.bits.SignCertificateReq = ON;
+
+		if(access("/Storage/OCPP/certV2G.csr",F_OK) == -1)
+		{
+			system("openssl req -newkey rsa:2048 -out /Storage/OCPP/certV2G.csr -nodes -keyout /Storage/OCPP/certV2G.key -subj \"/C=TW/ST=Taiwan/L=Taoyuan/O=Phihong Technology/OU=IT/CN=phihong.com\" &");
+		}
+	}
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_TransactionEvent]) == 0 )
+	{
+		if(connectorIdIsNULL == FALSE)
+		{
+			if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
+			{
+				cpinitateMsg.bits[connectorIdInt -1].TransactionEventReq = ON;
+			}
+		}
+		else
+		{
+			for(int idx=0;idx< gunTotalNumber;idx++)
+				cpinitateMsg.bits[idx].TransactionEventReq = ON;
+		}
+	}
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_SignCombinedCertificate]) == 0 )
+	{
+		ShmOCPP20Data->SpMsg.bits.SignCertificateReq = ON;
+
+		if(access("/Storage/OCPP/certCP.csr",F_OK) == -1)
+		{
+			system("openssl req -newkey rsa:2048 -out /Storage/OCPP/certCP.csr -nodes -keyout /Storage/OCPP/certCP.key -subj \"/C=TW/ST=Taiwan/L=Taoyuan/O=Phihong Technology/OU=IT/CN=phihong.com\" &");
+		}
+
+		if(access("/Storage/OCPP/certV2G.csr",F_OK) == -1)
+		{
+			system("openssl req -newkey rsa:2048 -out /Storage/OCPP/certV2G.csr -nodes -keyout /Storage/OCPP/certV2G.key -subj \"/C=TW/ST=Taiwan/L=Taoyuan/O=Phihong Technology/OU=IT/CN=phihong.com\" &");
+		}
+	}
+	else if(strcmp((char*)ShmOCPP20Data->TriggerMessage.requestedMessage, MessageTriggerEnumTypeStr[MessageTriggerEnumType_PublishFirmwareStatusNotification]) == 0 )
+	{
+		ShmOCPP20Data->MsMsg.bits.PublishFirmwareReq = ON;
+	}
 
 	return result;
 }
@@ -15915,6 +16008,15 @@ void hanldeSignCertificateResponse(char *payload, int gun_index)
 		// Required data
 		if(json_object_object_get(SignCertificate,"status") != NULL)
 			sprintf((char*)ShmOCPP20Data->SignCertificate.Response_status, json_object_get_string(json_object_object_get(SignCertificate,"status")));
+
+		// Optional data
+		if(json_object_object_get(json_object_object_get(SignCertificate,"statusInfo"), "reasonCode") != NULL)
+		{
+			sprintf((char*)ShmOCPP20Data->SignCertificate.Response_statusInfo.reasonCode, json_object_get_string(json_object_object_get(json_object_object_get(SignCertificate,"statusInfo"), "reasonCode")));
+
+			if(json_object_object_get(json_object_object_get(SignCertificate,"statusInfo"), "additionalInfo") != NULL)
+				sprintf((char*)ShmOCPP20Data->SignCertificate.Response_statusInfo.additionalInfo, json_object_get_string(json_object_object_get(json_object_object_get(SignCertificate,"statusInfo"), "additionalInfo")));
+		}
 	}
 	json_object_put(SignCertificate);
 

+ 5 - 5
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -3472,7 +3472,7 @@ void CheckSystemValue(void)
 			ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = 0;
 		}
 
-		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.SignCertificateReq == 1) && (access("/Storage/OCPP/cert.csr",F_OK) != -1))
+		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.SignCertificateReq == 1) && (access("/Storage/OCPP/certCP.csr",F_OK) != -1))
 		{
 			sendSignCertificateRequest();
 		}
@@ -6311,7 +6311,7 @@ int sendSignCertificateRequest()
 
 	// Read csr file content
 	memset(ShmOCPP16Data->SignCertificate.csr, 0x00, ARRAY_SIZE(ShmOCPP16Data->SignCertificate.csr));
-	FILE *fp=fopen("/Storage/OCPP/cert.csr","r");
+	FILE *fp=fopen("/Storage/OCPP/certCP.csr","r");
 	char *line = NULL;
 	size_t len = 0;
 	while(getline(&line, &len, fp) != -1)
@@ -11935,7 +11935,7 @@ int handleCertificateSignedRequest(char *uuid, char *payload)
 	}
 	json_object_put(CertificateSigned);
 
-	FILE *fp = fopen("/Storage/OCPP/cert.crt", "w");
+	FILE *fp = fopen("/Storage/OCPP/certCP.crt", "w");
 	fprintf(fp, "%s", ShmOCPP16Data->CertificateSigned.certificateChain);
 	fclose(fp);
 	system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
@@ -12077,9 +12077,9 @@ int handleExtendedTriggerMessageRequest(char *uuid, char *payload)
 	{
 		ShmOCPP16Data->SpMsg.bits.SignCertificateReq = 1;
 
-		if(access("/Storage/OCPP/cert.csr",F_OK) == -1)
+		if(access("/Storage/OCPP/certCP.csr",F_OK) == -1)
 		{
-			system("openssl req -newkey rsa:2048 -out /Storage/OCPP/cert.csr -nodes -keyout /Storage/OCPP/cert.key -subj \"/C=TW/ST=Taiwan/L=Taoyuan/O=Phihong Technology/OU=IT/CN=phihong.com\" &");
+			system("openssl req -newkey rsa:2048 -out /Storage/OCPP/certCP.csr -nodes -keyout /Storage/OCPP/certCP.key -subj \"/C=TW/ST=Taiwan/L=Taoyuan/O=Phihong Technology/OU=IT/CN=phihong.com\" &");
 		}
 	}
 	else if(strcmp((char*)ShmOCPP16Data->ExtendedTriggerMessage.requestedMessage, MessageTriggerStr[StatusNotification]) == 0 )

+ 31 - 24
EVSE/Projects/define.h

@@ -3833,7 +3833,7 @@ struct LedModuleData
 /**************************************************************************************/
 struct StructIdTagInfo
 {
-	unsigned char 	ExpiryDate[28];
+	unsigned char 	ExpiryDate[36];
 	unsigned char 	ParentIdTag[21];
 	unsigned char 	Status[16];		//Accepted, Blocked, Expired, Invalid, ConcurrentTx
 };
@@ -3904,7 +3904,7 @@ struct StructSampledValue
 };
 struct StructMeterValue
 {
-	unsigned char 				TimeStamp[28];
+	unsigned char 				TimeStamp[36];
 	struct StructSampledValue	SampledValue[20];
 };
 struct StructConfigurationKeyItems
@@ -3926,7 +3926,7 @@ struct StructChargingSchedulePeriod
 struct StructChargingSchedule
 {
 	int											Duration;
-	unsigned char 								StartSchedule[28];
+	unsigned char 								StartSchedule[36];
 	unsigned char 								ChargingRateUnit[4];		//A, W
 	struct StructChargingSchedulePeriod			ChargingSchedulePeriod[10];
 	float 										MinChargingRate;			//0.1;
@@ -3939,8 +3939,8 @@ struct StructChargingProfile
 	unsigned char 					ChargingProfilePurpose[24];	//ChargePointMaxProfile, TxDefaultProfile, TxProfile
 	unsigned char 					ChargingProfileKind[12];		//Absolute, Recurring, Relative
 	unsigned char 					RecurrencyKind[8];			//Daily, Weekly
-	unsigned char 					ValidFrom[28];
-	unsigned char 					ValidTo[28];
+	unsigned char 					ValidFrom[36];
+	unsigned char 					ValidTo[36];
 	struct StructChargingSchedule	ChargingSchedule;
 };
 
@@ -3956,13 +3956,13 @@ struct StructBootNotification
 	unsigned char CpMeterType[25];			//meterType
 	unsigned char CpMeterSerialNumber[25];	//meterSerialNumber
 	unsigned char ResponseStatus[16];			//Accepted, Pending, Rejected
-	unsigned char ResponseCurrentTime[28];	//currentTime					//mandatory
+	unsigned char ResponseCurrentTime[36];	//currentTime					//mandatory
 	int 			ResponseHeartbeatInterval;	//interval						//mandatory
 
 };
 struct StructHeartbeat
 {
-	unsigned char 				ResponseCurrentTime[28];
+	unsigned char 				ResponseCurrentTime[36];
 };
 struct StructAuthorize
 {
@@ -3975,7 +3975,7 @@ struct StructStartTransaction
 	unsigned char 				IdTag[21];
 	int 						MeterStart;
 	int 						ReservationId;
-	unsigned char 				Timestamp[28];
+	unsigned char 				Timestamp[36];
 	struct StructIdTagInfo		ResponseIdTagInfo;
 	int 						ResponseTransactionId;
 };
@@ -3983,7 +3983,7 @@ struct StructStopTransaction
 {
 	unsigned char 				IdTag[21];
 	int 						MeterStop;
-	unsigned char 				Timestamp[28];
+	unsigned char 				Timestamp[36];
 	int 						TransactionId;
 	unsigned char 				StopReason[20];				/*	"EmergencyStop",
 															"EVDisconnected",
@@ -4034,7 +4034,7 @@ struct StructStatusNotification
 								                "Faulted"
 								            */
 
-	unsigned char 	Timestamp[28];
+	unsigned char 	Timestamp[36];
 	unsigned char 	VendorId[256];
 	unsigned char 	VendorErrorCode[50];
 };
@@ -4094,7 +4094,7 @@ struct StructGetCompositeSchedule
 	unsigned char					ChargingRateUnit[4];		//A,W
 	unsigned char 					ResponseStatus[12];			//Accepted,Rejected
 	int 							ResponseConnectorId;
-	unsigned char					ResponseScheduleStart[28];
+	unsigned char					ResponseScheduleStart[36];
 	struct StructChargingSchedule	ResponseChargingSchedule;
 };
 struct StructGetConfiguration
@@ -4109,8 +4109,8 @@ struct StructGetDiagnostics
 	unsigned char 			Location[256];
 	int 					Retries;
 	int						RetryInterval;
-	unsigned char 			StartTime[28];
-	unsigned char 			StopTime[28];
+	unsigned char 			StartTime[36];
+	unsigned char 			StopTime[36];
 	unsigned char 			ResponseFileName[256];
 };
 struct StructGetLocalListVersion
@@ -4139,7 +4139,7 @@ struct StructRemoteStopTransaction
 struct StructReserveNow
 {
 	int			 		ConnectorId;
-	unsigned char 		ExpiryDate[28];
+	unsigned char 		ExpiryDate[36];
 	unsigned char 		IdTag[21];
 	unsigned char 		ParentIdTag[21];
 	int					ReservationId;
@@ -4188,7 +4188,7 @@ struct StructUpdateFirmware
 {
 	unsigned char 		Location[256];
 	int					Retries;
-	unsigned char 		RetrieveDate[28];
+	unsigned char 		RetrieveDate[36];
 	int 				RetryInterval;
 };
 
@@ -4211,7 +4211,7 @@ struct OCPP16ConfigurationTable
 
 struct StrcutSetUserPrice
 {
-    unsigned char   idToken[20];
+    unsigned char   idToken[21];
     unsigned char   price[256];
 };
 
@@ -4239,15 +4239,15 @@ struct CertificateHashDataType
 struct LogParametersType
 {
 	unsigned char remoteLocation[513];								// Required. The URL of the location at the remote system where the log should be stored.
-	unsigned char oldestTimestamp[28];								// Optional. This contains the date and time of the oldest logging information to include in the diagnostics.
-	unsigned char latestTimestamp[28];								// Optional. This contains the date and time of the latest logging information to include in the diagnostics.
+	unsigned char oldestTimestamp[36];								// Optional. This contains the date and time of the oldest logging information to include in the diagnostics.
+	unsigned char latestTimestamp[36];								// Optional. This contains the date and time of the latest logging information to include in the diagnostics.
 };
 
 struct FirmwareType
 {
 	unsigned char location[513];									// Required. URI defining the origin of the firmware.
-	unsigned char retrieveDateTime[28];								// Required. Date and time at which the firmware shall be retrieved.
-	unsigned char installDateTime[28];								// Optional. Date and time at which the firmware shall be installed.
+	unsigned char retrieveDateTime[36];								// Required. Date and time at which the firmware shall be retrieved.
+	unsigned char installDateTime[36];								// Optional. Date and time at which the firmware shall be installed.
 	unsigned char signingCertificate[5501];							// Optional. Certificate with which the firmware was signed. X.509 certificate, first DER encoded into binary, and then Base64 encoded.
 	unsigned char signature[801];									// Optional. Base64 encoded firmware signature.
 };
@@ -5079,6 +5079,11 @@ struct TransactionType
 	unsigned int remoteStartId;										// Optional. The ID given to remote start request (RequestStartTransactionRequest.
 };
 
+struct StatusInfoType
+{
+	unsigned char reasonCode[21];									// Required. A predefined code for the reason why thestatus is returned in this response. The string is case-insensitive.
+	unsigned char additionalInfo[513];								// Optional. Additional text to provide detailed information.
+};
 /*
  * =============== Message ===============
  */
@@ -5108,9 +5113,10 @@ struct CancelReservation_20
 
 struct CertificateSigned_20
 {
-	unsigned char certificate[10][5500];							// Required. The signed X.509 certificate, first DER encoded into binary, and then Base64 encoded. This can also contain the necessary sub CA certificates. In that case, the order should follow the certificate chain, starting from the leaf certificate.
+	unsigned char certificateChain[10001];							// Required. Required. The signed PEM encoded X.509 certificate.This can also contain the necessary sub CA certificates.In that case, the order of the bundle should follow thecertificate chain, starting from the leaf certificate.The Configuration Variable MaxCertificateChainSize canbe used to limit the maximum size of this field.
 	unsigned char certificateType[32];								// Optional. Indicates the type of the signed certificate that is returned.
 	unsigned char Response_status[16];								// Required. Returns whether certificate signing has been accepted, otherwise rejected.
+	struct StatusInfoType Response_statusInfo;						// Optional. Detailed status information.
 	unsigned char guid[37];											// Save guid from server request
 };
 
@@ -5219,7 +5225,7 @@ struct GetCertificateStatus_20
 {
 	struct OCSPRequestDataType ocspRequestData;						// Required. Indicates the certificate of which the status is requested.
 	unsigned char Response_status[16];								// Required. This indicates whether the charging station was able to retrieve the OCSP certificate status.
-	unsigned char Response_ocspResult[5500];						// Optional. OCSPResponse class as defined in IETF RFC 6960. DER encoded (as defined in IETF RFC 6960), and then base64 encoded. MAY only be omitted when status is not Accepted.
+	unsigned char Response_ocspResult[5501];						// Optional. OCSPResponse class as defined in IETF RFC 6960. DER encoded (as defined in IETF RFC 6960), and then base64 encoded. MAY only be omitted when status is not Accepted.
 };
 
 struct GetChargingProfiles_20
@@ -5318,7 +5324,7 @@ struct Heartbeat_20
 struct InstallCertificate_20
 {
 	unsigned char certificateType[32];								// Required. Indicates the certificate type that is sent.
-	unsigned char certificate[5500];								// Required. A X.509 certificate, first DER encoded into binary, and then Base64 encoded.
+	unsigned char certificate[5501];								// Required. A X.509 certificate, first DER encoded into binary, and then Base64 encoded.
 	unsigned char Response_status[16];								// Required. Charging Station indicates if installation was successful.
 	unsigned char guid[37];											// Save guid from server request
 };
@@ -5541,9 +5547,10 @@ struct SetVariables_20
 
 struct SignCertificate_20
 {
-	unsigned char csr[5500];										// Required. The Charging Station SHALL send the public key in form of a Certificate Signing Request (CSR) as described in RFC 2986 [22] using the SignCertificateRequest message.
+	unsigned char csr[5501];										// Required. The Charging Station SHALL send the public key in form of a Certificate Signing Request (CSR) as described in RFC 2986 [22] using the SignCertificateRequest message.
 	unsigned char certificateType[32];								// Optional. Indicates the type of certificate that is to be signed. When omitted the certificate is to be used for both the 15118 connection (if implemented) and the Charging Station to CSMS connection.
 	unsigned char Response_status[16];								// Required. Specifies whether the CSMS can process the request.
+	struct StatusInfoType Response_statusInfo;						// Optional. Detailed status information.
 };
 
 struct StatusNotification_20