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