#include "plat_comm/ocpp/bs_ocpp_json_data.h" #include "plat_comm/plat_comm_task.h" #if BS_OCPP_EN //OCPP平台使能 const char ocpp_str_null[] = "str_null"; const char ocpp_cmd_str[][30] = { "null", "BootNotification", //引导通知 桩->平台 "StatusNotification", //状态通知 桩->平台 "Heartbeat", //心跳 桩->平台 "Authorize", //授权 桩->平台 "MeterValues", //采样信息上传 桩->平台 "StartTransaction", //充电准备通知 桩->平台 "StopTransaction", //停止充电 桩->平台 "RemoteStartTransaction",//平台下发启动充电 平台->桩 "RemoteStopTransaction", //平台下发停止充电 平台->桩 "UnlockConnector", //解枪锁 平台->桩 "UpdateFirmware", //固件升级 平台->桩 "Reset", //重启 平台->桩 "CancelReservation", //取消已经预定的充电桩 平台->桩 "ChangeAvailability", //设置枪可用状态 平台->桩 "ChangeConfiguration", //更改参数配置 平台->桩 "TriggerMessage", //平台下发数据召测 平台->桩 "GetConfiguration", //平台获取参数配置 平台->桩 "ClearCache", //清楚桩内缓存 一般为白名单 平台->桩 "SendLocalList", //平台下发本地缓存列表 "GetLocalListVersion", //获取卡号版本 "GetDiagnostics", //获取诊断日志文件 "DiagnosticsStatusNotification", /* 诊断上传状态 桩->平台 */ "FirmwareStatusNotification" /* 固件升级状态 桩->平台 */ }; //状态错误信息 const char *StatusNotification_ocpp_errorCode[] = { "ConnectorLockFailure", //连接器锁定故障 "EVCommunicationError", //EV通讯故障 "GroundFailure", //接地故障 "HighTemperature", //高温 "InternalError", //内部错误 "LocalListConflict", //本地列表冲突 "NoError", //无错误 "OtherError", //其他错误 "OverCurrentFailure", //过电流故障 "PowerMeterFailure", //功率表故障 "PowerSwitchFailure", //电源开关故障 "ReaderFailure", //读卡器故障 "ResetFailure", //重置失败 "UnderVoltage", //电压过低 "OverVoltage", //电压过高 "WeakSignal" //信号弱 }; //状态信息 const char *StatusNotification_statusCode[] = { "Available", //空闲 "Preparing", //准备 "Charging", //充电 "SuspendedEVSE", //暂停EVSE "SuspendedEV", //暂停EV "Finishing", //完成 "Reserved", //预留 "Unavailable", //不空闲 "Faulted" //故障 }; //平台启动充电 应答回复 const char *RemoteStartTransactionResponse_statusCode[] = { "Accepted", //接受, "Rejected" //拒绝 }; //平台停止充电 应答回复 const char *StopTransactionRequest_reason[] = { "EmergencyStop", //紧急停止 "EVDisconnected", //电动汽车断开连接 "HardReset", //硬重置 "Local", //本地操作 "Other", //其他原因 "PowerLoss", //断电 "Reboot", //重启 "Remote", //远程操作 "SoftReset", //软重置 "UnlockCommand", //解锁命令 "DeAuthorized" //取消授权 }; //接枪锁 应答回复 const char *UnlockConnectorResponse_stateCode[] = { "Unlocked", "UnlockFailed", "NotSupported" }; /* DiagnosticsStatusNotification.status:与 BS_ocpp_ctrl.h 中 OCPP_DIAG_NOTIFY_PENDING_E 取值一致 */ const char *DiagnosticsStatusNotification_status[] = { "Idle", "Uploading", "Uploaded", "UploadFailed" }; /* FirmwareStatusNotification.status:与 BS_ocpp_ctrl.h 中 OCPP_FW_NOTIFY_PENDING_E 取值一致 */ const char *FirmwareStatusNotification_status[] = { "Idle", //空闲 "Downloading", //下载中 "Downloaded", //下载完成 "Installing", //安装中 "Installed", //安装完成 "DownloadFailed", //下载失败 "InstallationFailed" //安装失败 }; #if 1 //发送组帧 cJSON* BootNotification_json(BootNotificationRequest *json_data) { cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "chargePointVendor", json_data->chargePointVendor); cJSON_AddStringToObject(body, "chargePointModel", json_data->chargePointModel); //选择项 if(strlen(json_data->chargePointSerialNumber) != 0) cJSON_AddStringToObject(body, "chargePointSerialNumber", json_data->chargePointSerialNumber); if(strlen(json_data->chargeBoxSerialNumber) != 0) cJSON_AddStringToObject(body, "chargeBoxSerialNumber", json_data->chargeBoxSerialNumber); if(strlen(json_data->firmwareVersion) != 0) cJSON_AddStringToObject(body, "firmwareVersion", json_data->firmwareVersion); if(strlen(json_data->iccid) != 0) cJSON_AddStringToObject(body, "iccid", json_data->iccid); if(strlen(json_data->imsi) != 0) cJSON_AddStringToObject(body, "imsi", json_data->imsi); if(strlen(json_data->meterType) != 0) cJSON_AddStringToObject(body, "meterType", json_data->meterType); if(strlen(json_data->meterSerialNumber) != 0) cJSON_AddStringToObject(body, "meterSerialNumber", json_data->meterSerialNumber); return body; } cJSON* StatusNotification_json(StatusNotificationRequest *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddNumberToObject(body, "connectorId", json_data->connectorId);//连接器ID cJSON_AddStringToObject(body, "errorCode", json_data->errorCode); cJSON_AddStringToObject(body, "status", json_data->status); //可选(OCPP 1.6:info 非 required;无有效字符串时不输出键,禁止字面量 "null") if (strlen(json_data->info) != 0 && strcmp(json_data->info, "null") != 0) cJSON_AddStringToObject(body, "info", json_data->info); if(strlen(json_data->timestamp) != 0) cJSON_AddStringToObject(body, "timestamp", json_data->timestamp); if(strlen(json_data->vendorId) != 0) cJSON_AddStringToObject(body, "vendorId", json_data->vendorId); if(strlen(json_data->vendorErrorCode) != 0) cJSON_AddStringToObject(body, "vendorErrorCode", json_data->vendorErrorCode); return body; } cJSON* MeterValues_json(MeterValuesRequest *json_data){ int i,k; cJSON* body,*meterValueArray,*meterValueItem ,*sampledValueArray,*sampledValueItem; //必须项 body = cJSON_CreateObject(); cJSON_AddNumberToObject(body, "connectorId", json_data->connectorId);//连接器ID cJSON_AddNumberToObject(body, "transactionId", json_data->transactionId);//可选 当前充电事务的唯一标识符。这是可选字段,只有在当前有正在进行的充电事务时才有值。 meterValueArray = cJSON_CreateArray(); //创建 meterValue 数组 cJSON_AddItemToObject(body,"meterValue", meterValueArray); for (k = 0; k < MeterValuesRequest_MV_NUM; k++) { if(strlen(json_data->meterValue[k].timestamp) == 0) break; meterValueItem = cJSON_CreateObject(); //向 meterValue 数组添加一个对象(含 timestamp 和 sampledValue) cJSON_AddItemToArray(meterValueArray, meterValueItem); cJSON_AddStringToObject(meterValueItem, "timestamp", json_data->meterValue[k].timestamp); sampledValueArray = cJSON_CreateArray(); cJSON_AddItemToObject(meterValueItem, "sampledValue", sampledValueArray); for (i = 0; i < MeterValuesRequest_SV_NUM; i++) { if(strlen(json_data->meterValue[k].sampledValue[i].value) == 0) break; sampledValueItem = cJSON_CreateObject(); cJSON_AddItemToArray(sampledValueArray, sampledValueItem); if(strlen((char *)json_data->meterValue[k].sampledValue[i].value) != 0) cJSON_AddStringToObject(sampledValueItem, "value", json_data->meterValue[k].sampledValue[i].value); if(strlen((char *)json_data->meterValue[k].sampledValue[i].context) != 0) cJSON_AddStringToObject(sampledValueItem, "context", json_data->meterValue[k].sampledValue[i].context); if(strlen((char *)json_data->meterValue[k].sampledValue[i].format) != 0) cJSON_AddStringToObject(sampledValueItem, "format", json_data->meterValue[k].sampledValue[i].format); if(strlen((char *)json_data->meterValue[k].sampledValue[i].measurand) != 0) cJSON_AddStringToObject(sampledValueItem, "measurand", json_data->meterValue[k].sampledValue[i].measurand); if(strlen((char *)json_data->meterValue[k].sampledValue[i].phase) != 0) cJSON_AddStringToObject(sampledValueItem, "phase", json_data->meterValue[k].sampledValue[i].phase); if(strlen((char *)json_data->meterValue[k].sampledValue[i].location) != 0) cJSON_AddStringToObject(sampledValueItem, "location", json_data->meterValue[k].sampledValue[i].location); if(strlen((char *)json_data->meterValue[k].sampledValue[i].unit) != 0) cJSON_AddStringToObject(sampledValueItem, "unit", json_data->meterValue[k].sampledValue[i].unit); } } return body; } cJSON* RemoteStartTransaction_json(RemoteStartTransactionResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* RemoteStopTransaction_json(RemoteStopTransactionResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* StartTransaction_json(StartTransactionRequest *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddNumberToObject(body, "connectorId", json_data->connectorId); cJSON_AddNumberToObject(body, "meterStart", json_data->meterStart); cJSON_AddStringToObject(body, "idTag", json_data->idTag); cJSON_AddStringToObject(body, "timestamp", json_data->timestamp); //可选 if(json_data->reservationId != 0) cJSON_AddNumberToObject(body, "reservationId", json_data->reservationId); return body; } cJSON* StopTransaction_json(StopTransactionRequest *json_data){ int i,k; cJSON *body,*transactionDataArray,*transactionDataTtem,*sampledValueArray,*sampledValueItem; //必须项 body = cJSON_CreateObject(); cJSON_AddNumberToObject(body, "meterStop", json_data->meterStop); cJSON_AddNumberToObject(body, "transactionId", json_data->transactionId); cJSON_AddStringToObject(body, "timestamp", json_data->timestamp); //可选 cJSON_AddStringToObject(body, "idTag", json_data->idTag); cJSON_AddStringToObject(body, "reason", json_data->reason); //return body; transactionDataArray = cJSON_CreateArray(); //创建 数组 cJSON_AddItemToObject(body,"transactionData", transactionDataArray); for (k = 0; k < StopTransactionRequest_TD_NUM; k++) { if(strlen(json_data->transactionData[k].timestamp) == 0) break; transactionDataTtem = cJSON_CreateObject(); //向 meterValue 数组添加一个对象(含 timestamp 和 sampledValue) cJSON_AddItemToArray(transactionDataArray, transactionDataTtem); cJSON_AddStringToObject(transactionDataTtem, "timestamp", json_data->transactionData[k].timestamp); sampledValueArray = cJSON_CreateArray(); cJSON_AddItemToObject(transactionDataTtem, "sampledValue", sampledValueArray); for (i = 0; i < StopTransactionRequest_SV_NUM; i++) { if(strlen(json_data->transactionData[k].sampledValue[i].value) == 0) break; sampledValueItem = cJSON_CreateObject(); cJSON_AddItemToArray(sampledValueArray, sampledValueItem); cJSON_AddStringToObject(sampledValueItem, "value", json_data->transactionData[k].sampledValue[i].value); if(strlen(json_data->transactionData[k].sampledValue[i].context) != 0) cJSON_AddStringToObject(sampledValueItem, "context", json_data->transactionData[k].sampledValue[i].context); if(strlen(json_data->transactionData[k].sampledValue[i].format) != 0) cJSON_AddStringToObject(sampledValueItem, "format", json_data->transactionData[k].sampledValue[i].format); if(strlen(json_data->transactionData[k].sampledValue[i].measurand) != 0) cJSON_AddStringToObject(sampledValueItem, "measurand", json_data->transactionData[k].sampledValue[i].measurand); if(strlen(json_data->transactionData[k].sampledValue[i].phase) != 0) cJSON_AddStringToObject(sampledValueItem, "phase", json_data->transactionData[k].sampledValue[i].phase); if(strlen(json_data->transactionData[k].sampledValue[i].location) != 0) cJSON_AddStringToObject(sampledValueItem, "location", json_data->transactionData[k].sampledValue[i].location); if(strlen(json_data->transactionData[k].sampledValue[i].unit) != 0) cJSON_AddStringToObject(sampledValueItem, "unit", json_data->transactionData[k].sampledValue[i].unit); } } return body; } cJSON* Authorize_json(AuthorizeRequest *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "idTag", json_data->idTag); //可选 return body; } cJSON* UnlockConnector_json(UnlockConnectorResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); return body; } cJSON* UpdateFirmware_json(){ cJSON* body; //必须项 body = cJSON_CreateObject(); return body; } cJSON* Reset_json(ResetResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* CancelReservation_json(CancelReservationResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* ChangeAvailability_json(ChangeAvailabilityResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* ChangeConfiguration_json(ChangeConfigurationResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* TriggerMessage_json(TriggerMessageResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* GetConfiguration_json(GetConfigurationResponse *json_data){ cJSON* body,*unknownKeyArray,*configurationKeyArry,*configurationKeyItem; int k; //必须项 body = cJSON_CreateObject(); unknownKeyArray = cJSON_CreateArray(); //创建 meterValue 数组 cJSON_AddItemToObject(body,"unknownKey", unknownKeyArray); for (k = 0; k < GetConfiguration_NUM; k++) { if(strlen(json_data->unknownKey[k]) == 0) break; cJSON_AddItemToArray(unknownKeyArray, cJSON_CreateString(json_data->unknownKey[k])); } configurationKeyArry = cJSON_CreateArray(); //创建 meterValue 数组 cJSON_AddItemToObject(body,"configurationKey", configurationKeyArry); for (k = 0; k < GetConfiguration_NUM; k++) { if(strlen(json_data->configurationKey[k].key) == 0) break; configurationKeyItem = cJSON_CreateObject(); cJSON_AddItemToArray(configurationKeyArry, configurationKeyItem); cJSON_AddStringToObject(configurationKeyItem,"key", json_data->configurationKey[k].key); cJSON_AddBoolToObject(configurationKeyItem,"readonly", json_data->configurationKey[k].readonly ? 1 : 0); cJSON_AddStringToObject(configurationKeyItem,"value", json_data->configurationKey[k].value); } //可选 return body; } cJSON* ClearCache_json(ClearCacheResponse *json_data){ cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* SendLocalList_json(SendLocalListResponse *json_data) { cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "status", json_data->status); //可选 return body; } cJSON* GetLocalListVersion_json(GetLocalListVersionResponse *json_data) { cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddNumberToObject(body, "listVersion", json_data->listVersion); //可选 return body; } cJSON* GetDiagnostics_json(GetDiagnosticsResponse *json_data) { cJSON* body; //必须项 body = cJSON_CreateObject(); cJSON_AddStringToObject(body, "fileName", json_data->fileName); //可选 return body; } cJSON* DiagnosticsStatusNotification_json(DiagnosticsStatusNotificationRequest *json_data) { cJSON *body = cJSON_CreateObject(); if (body != NULL && json_data != NULL) { cJSON_AddStringToObject(body, "status", json_data->status); } return body; } cJSON* FirmwareStatusNotification_json(FirmwareStatusNotificationRequest *json_data) { return DiagnosticsStatusNotification_json((DiagnosticsStatusNotificationRequest *)json_data); } cJSON* j_get_ocpp_json(OCPP_CMD cmd , void *data){ cJSON* body; switch (cmd) { case OCPP_BootNotification: body = BootNotification_json((BootNotificationRequest *)data); break; case OCPP_StatusNotification: body = StatusNotification_json((StatusNotificationRequest *)data); break; case OCPP_MeterValues: body = MeterValues_json((MeterValuesRequest *)data); break; case OCPP_StartTransaction: body = StartTransaction_json((StartTransactionRequest *)data); break; case OCPP_StopTransaction: body = StopTransaction_json((StopTransactionRequest *)data); break; case OCPP_Authorize: body = Authorize_json((AuthorizeRequest *)data); break; case OCPP_UnlockConnector: body = UnlockConnector_json((UnlockConnectorResponse *)data); break; case OCPP_RemoteStartTransaction: body = RemoteStartTransaction_json((RemoteStartTransactionResponse *)data); break; case OCPP_RemoteStopTransaction: body = RemoteStopTransaction_json((RemoteStopTransactionResponse *)data); break; case OCPP_UpdateFirmware: body = UpdateFirmware_json(); break; case OCPP_Reset: body = Reset_json((ResetResponse *)data); break; case OCPP_CancelReservation: body = CancelReservation_json((CancelReservationResponse *)data); break; case OCPP_ChangeAvailability: body = ChangeAvailability_json((ChangeAvailabilityResponse *)data); break; case OCPP_ChangeConfiguration: body = ChangeConfiguration_json((ChangeConfigurationResponse *)data); break; case OCPP_TriggerMessage: body = TriggerMessage_json((TriggerMessageResponse *)data); break; case OCPP_GetConfiguration: body = GetConfiguration_json((GetConfigurationResponse *)data); break; case OCPP_ClearCache: body = ClearCache_json((ClearCacheResponse *)data); break; case OCPP_SendLocalList: body = SendLocalList_json((SendLocalListResponse *)data); break; case OCPP_GetLocalListVersion: body = GetLocalListVersion_json((GetLocalListVersionResponse *)data); break; case OCPP_GetDiagnostics: body = GetDiagnostics_json((GetDiagnosticsResponse *)data); break; case OCPP_DiagnosticsStatusNotification: body = DiagnosticsStatusNotification_json((DiagnosticsStatusNotificationRequest *)data); break; case OCPP_FirmwareStatusNotification: body = FirmwareStatusNotification_json((FirmwareStatusNotificationRequest *)data); break; default: break; } return body; } #endif #if 1 // 接收解帧 //登录数据解析 static int ocpp_register_res(cJSON* root , BootNotificationResponse *data) { cJSON *mag; memset(data , 0,sizeof(BootNotificationResponse)); mag = cJSON_GetObjectItem(root,"currentTime"); if(mag != NULL) { memcpy(data->currentTime , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----currentTime = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"interval"); if(mag != NULL) { data->interval = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----interval = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"status"); if(mag != NULL) { memcpy(data->status , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----status = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //平台下发启动充电命令数据解析 static int ocpp_RemoteStartTransaction_unpack(cJSON* root , RemoteStartTransactionRequest *data) { cJSON *mag; memset(data , 0,sizeof(RemoteStartTransactionRequest)); mag = cJSON_GetObjectItem(root,"idTag"); if(mag != NULL) { memcpy(data->idTag , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----idTag = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"connectorId"); if(mag != NULL) { data->connectorId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----connectorId = %d\n",mag->valueint); #endif } cJSON *chargingProfile = cJSON_GetObjectItem(root,"chargingProfile"); if(chargingProfile == NULL) return 1; mag = cJSON_GetObjectItem(chargingProfile,"chargingProfileId"); if(mag != NULL) { data->chargingProfile.chargingProfileId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----chargingProfileId = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(chargingProfile,"transactionId"); if(mag != NULL) { data->chargingProfile.transactionId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----transactionId = %d\n",mag->valueint); #endif } mag = cJSON_GetObjectItem(chargingProfile,"stackLevel"); if(mag != NULL) { data->chargingProfile.stackLevel = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----stackLevel = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(chargingProfile,"chargingProfilePurpose"); if(mag != NULL) { memcpy(data->chargingProfile.chargingProfilePurpose , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----chargingProfilePurpose = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(chargingProfile,"chargingProfileKind"); if(mag != NULL) { memcpy(data->chargingProfile.chargingProfileKind , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----chargingProfileKind = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(chargingProfile,"recurrencyKind"); if(mag != NULL) { memcpy(data->chargingProfile.recurrencyKind , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----recurrencyKind = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(chargingProfile,"validFrom"); if(mag != NULL) { memcpy(data->chargingProfile.validFrom , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----validFrom = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(chargingProfile,"validTo"); if(mag != NULL) { memcpy(data->chargingProfile.validTo , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----validTo = %s\n",mag->valuestring); #endif } cJSON *chargingSchedule = cJSON_GetObjectItem(chargingProfile,"chargingSchedule"); if(chargingSchedule == NULL) return 1; mag = cJSON_GetObjectItem(chargingSchedule,"duration"); if(mag != NULL) { data->chargingProfile.chargingSchedule.duration = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----duration = %d\n",mag->valueint); #endif } mag = cJSON_GetObjectItem(chargingSchedule,"startSchedule"); if(mag != NULL) { memcpy(data->chargingProfile.chargingSchedule.startSchedule , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----startSchedule = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(chargingSchedule,"chargingRateUnit"); if(mag != NULL) { memcpy(data->chargingProfile.chargingSchedule.chargingRateUnit , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----chargingRateUnit = %s\n",mag->valuestring); #endif } cJSON *chargingSchedulePeriod = cJSON_GetObjectItem(chargingSchedule,"chargingSchedulePeriod"); if(chargingSchedulePeriod == NULL) return 1; int periodCount = cJSON_GetArraySize(chargingSchedulePeriod); // if (periodCount > MAX_PERIODS) { // printf("Too many charging periods (max %d)\n", MAX_PERIODS); // return false; // } for (int i = 0; i < periodCount; i++) { cJSON* period = cJSON_GetArrayItem(chargingSchedulePeriod, i); mag = cJSON_GetObjectItem(period,"startPeriod"); if(mag != NULL) { data->chargingProfile.chargingSchedule.chargingSchedulePeriod[i].startPeriod = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----startPeriod = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(period,"limit"); if(mag != NULL) { data->chargingProfile.chargingSchedule.chargingSchedulePeriod[i].limit = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----limit = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(period,"numberPhases"); if(mag != NULL) { data->chargingProfile.chargingSchedule.chargingSchedulePeriod[i].numberPhases = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----numberPhases = %d\n",mag->valueint); #endif } } return 1; } //平台下发停止充电命令数据解析 static int ocpp_RemoteStopTransaction_unpack(cJSON* root , RemoteStopTransactionRequest *data) { cJSON *mag; memset(data , 0,sizeof(RemoteStopTransactionRequest)); mag = cJSON_GetObjectItem(root,"transactionId"); if(mag != NULL) { data->transactionId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----transactionId = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //启动充电命令应答数据解析 static int ocpp_StartTransaction_unpack(cJSON* root , StartTransactionResponse *data) { cJSON *mag; memset(data , 0,sizeof(StartTransactionResponse)); mag = cJSON_GetObjectItem(root,"transactionId"); if(mag != NULL) { data->transactionId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----transactionId = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } cJSON *idTagInfo = cJSON_GetObjectItem(root,"idTagInfo"); if(idTagInfo == NULL) return 0; mag = cJSON_GetObjectItem(idTagInfo,"status"); if(mag != NULL) { memcpy(data->idTagInfo.status , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----status = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(idTagInfo,"expiryDate"); if(mag != NULL) { memcpy(data->idTagInfo.expiryDate , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----expiryDate = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(idTagInfo,"parentIdTag"); if(mag != NULL) { memcpy(data->idTagInfo.parentIdTag , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----parentIdTag = %s\n",mag->valuestring); #endif } return 1; } //停止充电命令应答数据解析 static int ocpp_StopTransaction_unpack(cJSON* root , StopTransactionResponse *data) { cJSON *mag; memset(data , 0,sizeof(StopTransactionResponse)); cJSON *idTagInfo = cJSON_GetObjectItem(root,"idTagInfo"); if(idTagInfo == NULL) return 1; mag = cJSON_GetObjectItem(idTagInfo,"status"); if(mag != NULL) { memcpy(data->idTagInfo.status , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----status = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(idTagInfo,"expiryDate"); if(mag != NULL) { memcpy(data->idTagInfo.expiryDate , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----expiryDate = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(idTagInfo,"parentIdTag"); if(mag != NULL) { memcpy(data->idTagInfo.parentIdTag , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----parentIdTag = %s\n",mag->valuestring); #endif } return 1; } //鉴权数据应答数据解析 static int ocpp_Authorize_unpack(cJSON* root , AuthorizeResponse *data) { cJSON *mag; memset(data , 0,sizeof(AuthorizeResponse)); cJSON *idTagInfo = cJSON_GetObjectItem(root,"idTagInfo"); if(idTagInfo == NULL) return 0; mag = cJSON_GetObjectItem(idTagInfo,"status"); if(mag != NULL) { memcpy(data->idTagInfo.status , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----status = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(idTagInfo,"expiryDate"); if(mag != NULL) { memcpy(data->idTagInfo.expiryDate , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----expiryDate = %s\n",mag->valuestring); #endif } mag = cJSON_GetObjectItem(idTagInfo,"parentIdTag"); if(mag != NULL) { memcpy(data->idTagInfo.parentIdTag , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----parentIdTag = %s\n",mag->valuestring); #endif } return 1; } //固件升级 static int ocpp_UpdateFirmware_unpack(cJSON* root , UpdateFirmwareRequest *data) { cJSON *mag; memset(data , 0,sizeof(UpdateFirmwareRequest)); mag = cJSON_GetObjectItem(root,"location"); if(mag != NULL) { memcpy(data->location , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----location = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"retrieveDate"); if(mag != NULL) { memcpy(data->retrieveDate , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----retrieveDate = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"retries"); if(mag != NULL) { data->retries = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----retries = %d\n",mag->valueint); #endif } mag = cJSON_GetObjectItem(root,"retryInterval"); if(mag != NULL) { data->retryInterval = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----retryInterval = %d\n",mag->valueint); #endif } return 1; } //远程重启 static int ocpp_ResetRequest_unpack(cJSON* root , ResetRequest *data) { cJSON *mag; memset(data , 0,sizeof(ResetRequest)); mag = cJSON_GetObjectItem(root,"type"); if(mag != NULL) { memcpy(data->type , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----type = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //取消充电枪预定 static int ocpp_CancelReservation_unpack(cJSON* root , CancelReservationRequest *data) { cJSON *mag; memset(data , 0,sizeof(CancelReservationRequest)); mag = cJSON_GetObjectItem(root,"reservationId"); if(mag != NULL) { data->reservationId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----reservationId = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //设置枪可用状态 static int ocpp_ChangeAvailability_unpack(cJSON* root , ChangeAvailabilityRequest *data) { cJSON *mag; memset(data , 0,sizeof(ChangeAvailabilityRequest)); mag = cJSON_GetObjectItem(root,"connectorId"); if(mag != NULL) { data->connectorId = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----connectorId = %d\n",mag->valueint); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"type"); if(mag != NULL) { memcpy(data->type , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----type = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //更改参数配置 static int ocpp_ChangeConfiguration_unpack(cJSON* root , ChangeConfigurationRequest *data) { cJSON *mag; memset(data , 0,sizeof(ChangeConfigurationRequest)); mag = cJSON_GetObjectItem(root,"key"); if(mag != NULL) { memcpy(data->key , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----key = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } mag = cJSON_GetObjectItem(root,"value"); if(mag != NULL) { memcpy(data->value , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----value = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //平台下发数据召测命令 static int ocpp_TriggerMessage_unpack(cJSON* root , TriggerMessageRequest *data) { cJSON *mag; memset(data , 0,sizeof(TriggerMessageRequest)); mag = cJSON_GetObjectItem(root,"connectorId"); if(mag != NULL) { data->connectorId = mag->valueint; //memcpy(data->connectorId , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----connectorId = %d\n",mag->valueint); #endif } mag = cJSON_GetObjectItem(root,"requestedMessage"); if(mag != NULL) { memcpy(data->requestedMessage , mag->valuestring , strlen(mag->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----requestedMessage = %s\n",mag->valuestring); #endif } else { return 0; //没有必选项 则直接退出 } return 1; } //平台下发读取参数命令 static int ocpp_GetConfiguration_unpack(cJSON* root , GetConfigurationRequest *data) { cJSON *mag,*mag1; int key_size; memset(data , 0,sizeof(GetConfigurationRequest)); mag = cJSON_GetObjectItem(root,"key"); key_size = cJSON_GetArraySize(mag); for (int i = 0; i < key_size; i++) { mag1 = cJSON_GetArrayItem(mag,i); //获取秘钥 memcpy(data->key[i],mag1->valuestring,strlen(mag1->valuestring)); #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----key = %d,%s\n",i,mag1->valuestring); #endif } return 1; } static int ocpp_SendLocalList_unpack(cJSON* root, SendLocalListRequest *data) { cJSON *mag, *mag1, *localListArray, *listItem, *idTagInfoObj; int i; // 清零初始化 memset(data, 0, sizeof(SendLocalListRequest)); // 解析必选字段 listVersion mag = cJSON_GetObjectItem(root, "listVersion"); if (mag != NULL) { data->listVersion = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----listVersion = %d\n", mag->valueint); #endif } else { #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("Error: Missing required field 'listVersion'\n"); #endif return 0; // 必选字段缺失,返回错误 } // 解析必选字段 updateType mag = cJSON_GetObjectItem(root, "updateType"); if (mag != NULL && mag->valuestring != NULL) { int updateTypeLen = strlen(mag->valuestring); int maxLen = OCPP_CiString30 - 1; // 预留1字节给'\0' int copyLen = (updateTypeLen < maxLen) ? updateTypeLen : maxLen; memcpy(data->updateType, mag->valuestring, copyLen); data->updateType[copyLen] = '\0'; // 确保字符串以'\0'结尾 #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----updateType = %s\n", data->updateType); #endif } else { #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("Error: Missing required field 'updateType'\n"); #endif return 0; // 必选字段缺失,返回错误 } // 解析可选的 localAuthorizationList 数组 localListArray = cJSON_GetObjectItem(root, "localAuthorizationList"); if (localListArray != NULL && cJSON_IsArray(localListArray)) { int arraySize = cJSON_GetArraySize(localListArray); data->List_num = arraySize; if (arraySize > 0) { // 动态分配内存 data->list = (LocalAuthorizationList*)OCPP_MALLOC(arraySize * sizeof(LocalAuthorizationList)); if (data->list == NULL) { #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("Error: Memory allocation failed for localAuthorizationList\n"); #endif data->List_num = 0; return 0; // 内存分配失败 } // 清零分配的内存 memset(data->list, 0, arraySize * sizeof(LocalAuthorizationList)); // 遍历数组,解析每个元素 for (i = 0; i < arraySize; i++) { listItem = cJSON_GetArrayItem(localListArray, i); if (listItem == NULL) { continue; // 跳过无效项 } // 解析 idTag mag = cJSON_GetObjectItem(listItem, "idTag"); if (mag != NULL && mag->valuestring != NULL) { int idTagLen = strlen(mag->valuestring); int maxIdTagLen = OCPP_CiString30 - 1; int copyIdTagLen = (idTagLen < maxIdTagLen) ? idTagLen : maxIdTagLen; memcpy(data->list[i].idTag, mag->valuestring, copyIdTagLen); data->list[i].idTag[copyIdTagLen] = '\0'; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----item[%d].idTag = %s\n", i, data->list[i].idTag); #endif } else { #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("Warning: Missing required field 'idTag' in item %d\n", i); #endif // idTag是必须的,如果缺失,跳过此元素但保留已分配的空间 continue; } // 解析可选的 idTagInfo idTagInfoObj = cJSON_GetObjectItem(listItem, "idTagInfo"); if (idTagInfoObj != NULL) { // 解析 expiryDate mag = cJSON_GetObjectItem(idTagInfoObj, "expiryDate"); if (mag != NULL && mag->valuestring != NULL) { int expiryDateLen = strlen(mag->valuestring); int maxExpiryDateLen = OCPP_DATE_LEN - 1; int copyExpiryDateLen = (expiryDateLen < maxExpiryDateLen) ? expiryDateLen : maxExpiryDateLen; memcpy(data->list[i].idTagInfo.expiryDate, mag->valuestring, copyExpiryDateLen); data->list[i].idTagInfo.expiryDate[copyExpiryDateLen] = '\0'; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----item[%d].idTagInfo.expiryDate = %s\n", i, data->list[i].idTagInfo.expiryDate); #endif } // 解析 parentIdTag mag = cJSON_GetObjectItem(idTagInfoObj, "parentIdTag"); if (mag != NULL && mag->valuestring != NULL) { int parentIdTagLen = strlen(mag->valuestring); int maxParentIdTagLen = OCPP_CiString20 - 1; int copyParentIdTagLen = (parentIdTagLen < maxParentIdTagLen) ? parentIdTagLen : maxParentIdTagLen; memcpy(data->list[i].idTagInfo.parentIdTag, mag->valuestring, copyParentIdTagLen); data->list[i].idTagInfo.parentIdTag[copyParentIdTagLen] = '\0'; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----item[%d].idTagInfo.parentIdTag = %s\n", i, data->list[i].idTagInfo.parentIdTag); #endif } // 解析 status (必需字段) mag = cJSON_GetObjectItem(idTagInfoObj, "status"); if (mag != NULL && mag->valuestring != NULL) { int statusLen = strlen(mag->valuestring); int maxStatusLen = OCPP_CiString20 - 1; int copyStatusLen = (statusLen < maxStatusLen) ? statusLen : maxStatusLen; memcpy(data->list[i].idTagInfo.status, mag->valuestring, copyStatusLen); data->list[i].idTagInfo.status[copyStatusLen] = '\0'; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----item[%d].idTagInfo.status = %s\n", i, data->list[i].idTagInfo.status); #endif } else { #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("Warning: Missing required field 'status' in idTagInfo for item %d\n", i); #endif // status是idTagInfo中的必需字段,但idTagInfo本身是可选的,所以如果存在idTagInfo但缺少status,我们继续处理 } } } } } else { // localAuthorizationList 是可选的,不存在时正常处理 data->List_num = 0; data->list = NULL; } return 1; // 成功 } static int ocpp_GetDiagnostics_unpack(cJSON* root, GetDiagnosticsRequest *data) { cJSON *mag; // 解析必选字段 location mag = cJSON_GetObjectItem(root, "location"); if (mag != NULL && cJSON_IsString(mag)) { strncpy(data->location, mag->valuestring, sizeof(data->location)-1); data->location[sizeof(data->location)-1] = '\0'; // 确保字符串终止 #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----location = %s\n", data->location); #endif } else { #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("Error: Missing required field 'location'\n"); #endif return 0; // 必选字段缺失,返回错误 } // 解析可选字段 retries mag = cJSON_GetObjectItem(root, "retries"); if (mag != NULL && cJSON_IsNumber(mag)) { data->retries = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----retries = %d\n", data->retries); #endif } // 解析可选字段 retryInterval mag = cJSON_GetObjectItem(root, "retryInterval"); if (mag != NULL && cJSON_IsNumber(mag)) { data->retryInterval = mag->valueint; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----retryInterval = %d\n", data->retryInterval); #endif } // 解析可选字段 startTime mag = cJSON_GetObjectItem(root, "startTime"); if (mag != NULL && cJSON_IsString(mag)) { strncpy(data->startTime, mag->valuestring, sizeof(data->startTime)-1); data->startTime[sizeof(data->startTime)-1] = '\0'; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----startTime = %s\n", data->startTime); #endif } // 解析可选字段 stopTime mag = cJSON_GetObjectItem(root, "stopTime"); if (mag != NULL && cJSON_IsString(mag)) { strncpy(data->stopTime, mag->valuestring, sizeof(data->stopTime)-1); data->stopTime[sizeof(data->stopTime)-1] = '\0'; #if OCPP_LOGMSG_DEBUG_EN >1 Plat_Comm_LOG("----stopTime = %s\n", data->stopTime); #endif } return 1; // 解析成功 } int get_ocpp_data(OCPP_CMD cmd , void *data ,cJSON *root) { int ret ; switch (cmd) { case OCPP_BootNotification: ret = ocpp_register_res(root,(BootNotificationResponse *)data); break; case OCPP_RemoteStartTransaction: ret = ocpp_RemoteStartTransaction_unpack(root,(RemoteStartTransactionRequest *)data); break; case OCPP_RemoteStopTransaction: ret = ocpp_RemoteStopTransaction_unpack(root,(RemoteStopTransactionRequest *)data); break; case OCPP_StartTransaction: ret = ocpp_StartTransaction_unpack(root,(StartTransactionResponse *)data); break; case OCPP_StopTransaction: ret = ocpp_StopTransaction_unpack(root,(StopTransactionResponse *)data); break; case OCPP_Authorize: ret = ocpp_Authorize_unpack(root,(AuthorizeResponse *)data); break; case OCPP_UpdateFirmware: ret = ocpp_UpdateFirmware_unpack(root,(UpdateFirmwareRequest *)data); break; case OCPP_Reset: ret = ocpp_ResetRequest_unpack(root,(ResetRequest *)data); break; case OCPP_CancelReservation: ret = ocpp_CancelReservation_unpack(root,(CancelReservationRequest *)data); break; case OCPP_ChangeAvailability: ret = ocpp_ChangeAvailability_unpack(root,(ChangeAvailabilityRequest *)data); break; case OCPP_ChangeConfiguration: ret = ocpp_ChangeConfiguration_unpack(root,(ChangeConfigurationRequest *)data); break; case OCPP_TriggerMessage: ret = ocpp_TriggerMessage_unpack(root,(TriggerMessageRequest *)data); break; case OCPP_GetConfiguration: ret = ocpp_GetConfiguration_unpack(root,(GetConfigurationRequest *)data); break; case OCPP_SendLocalList: ret = ocpp_SendLocalList_unpack(root,(SendLocalListRequest *)data); break; case OCPP_GetDiagnostics: ret = ocpp_GetDiagnostics_unpack(root,(GetDiagnosticsRequest *)data); break; default: break; } return ret; } #endif //获取ocpp 命令码 字符串地址 const char *s_get_ocpp_cmd_str(OCPP_CMD cmd){ int count = sizeof(ocpp_cmd_str) / sizeof(ocpp_cmd_str[0]); if((U8_T)cmd > count) //cmd 命令值不匹配 return NULL; return &ocpp_cmd_str[cmd][0]; } //获取ocpp 字符串 枚举位置 OCPP_CMD e_get_recv_json_cmd(char* cmd_str) { OCPP_CMD cmd = OCPP_NULL; int i,count = sizeof(ocpp_cmd_str) / sizeof(ocpp_cmd_str[0]); for (i = 0; i < count; i++) { // Plat_Comm_LOG("----(%d)str len= %d,%d\n",i,strlen(ocpp_cmd_str[i]),strlen(cmd_str)); // Plat_Comm_LOG("----(%d)str is= (%s),(%s)\n",i,ocpp_cmd_str[i],cmd_str); if(strstr(ocpp_cmd_str[i],cmd_str)) { cmd = i; break; } } return cmd; } //获取ocpp 枚举字符串数据内容 const char *s_get_ocpp_enum_data_str(OCPP_ENUM_DATA_TYPE type ,int cmd){ switch (type) { case OCPP_StatusNotification_errorCode: return &StatusNotification_ocpp_errorCode[cmd][0]; case OCPP_StatusNotification_statusCode: return &StatusNotification_statusCode[cmd][0]; case OCPP_RemoteStartTransactionResponse_statusCode: case OCPP_RemoteStopTransactionResponse_statusCode: return &RemoteStartTransactionResponse_statusCode[cmd][0]; case OCPP_StopTransactionRequest_reason: return &StopTransactionRequest_reason[cmd][0]; case OCPP_UnlockConnectorResponse_stateCode: return &UnlockConnectorResponse_stateCode[cmd][0]; case OCPP_DiagnosticsStatusNotification_status: if (cmd >= 0 && cmd < (int)(sizeof(DiagnosticsStatusNotification_status) / sizeof(DiagnosticsStatusNotification_status[0]))) { return &DiagnosticsStatusNotification_status[cmd][0]; } return &ocpp_str_null[0]; case OCPP_FirmwareStatusNotification_status: if (cmd >= 0 && cmd < (int)(sizeof(FirmwareStatusNotification_status) / sizeof(FirmwareStatusNotification_status[0]))) { return &FirmwareStatusNotification_status[cmd][0]; } return &ocpp_str_null[0]; default: return &ocpp_str_null[0]; break; } } #endif