Files
CCU621M/app/plat_comm/ocpp/bs_ocpp_json_data.h
T

528 lines
27 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _BS_OCPP_JSON_DATA_H_
#define _BS_OCPP_JSON_DATA_H_
#include "publicdata/type.h"
#include "publicdata/public_define.h"
#include "bs_ocpp_str.h"
#if BS_OCPP_EN //OCPP平台使能
#include "cJSON.h"
#include <string.h>
#define OCPP_LOGMSG_DEBUG_EN 1 //打印标志
#define OCPP_PRINTF_DEBUG_EN 1 //printf打印标志
#define MeterValuesRequest_MV_NUM 1 //电表数据组数量
#define MeterValuesRequest_SV_NUM 8 //数据内容数量
#define GetConfiguration_NUM 20 //平台获取数据最大数量
#define StopTransactionRequest_TD_NUM 1 //停止充电 数据组数量
#define StopTransactionRequest_SV_NUM 5 //停止充电 数据内容数量
#define E_CFG_MVMN_MeterValuesAlignedData (0x01)
#define E_CFG_MVMN_MeterValuesSampledData (0x02)
#define E_CFG_MVMN_StopTxnAlignedData (0x04)
#define E_CFG_MVMN_StopTxnSampledData (0x08)
#define OCPP_DATE_LEN (30) //OCPP时间格式 数据长度 ISO 8601 格式。
#define OCPP_CiString20 (20+1)
#define OCPP_CiString30 (30+1)
#define OCPP_CiString25 (25+1)
#define OCPP_CiString50 (50+1)
#define OCPP_CiString100 (100+1)
#define OCPP_CiString255 (255+1)
#define OCPP_CiString300 (300+1)
#define OCPP_CiString500 (500+1)
typedef enum{
OCPP_NULL = 0,
OCPP_BootNotification, //引导通知 桩->平台
OCPP_StatusNotification, //状态通知 桩->平台
OCPP_Heartbeat, //心跳 桩->平台
OCPP_Authorize, //授权 桩->平台
OCPP_MeterValues, //采样信息上传 桩->平台
OCPP_StartTransaction, //开始交易 桩->平台
OCPP_StopTransaction, //停止交易 桩->平台
OCPP_RemoteStartTransaction,//平台下发启动充电 平台->桩
OCPP_RemoteStopTransaction, //平台下发停止充电 平台->桩
OCPP_UnlockConnector, //解枪锁 平台->桩
OCPP_UpdateFirmware, //固件升级 平台->桩
OCPP_Reset, //重启 平台->桩
OCPP_CancelReservation, //取消已经预定的充电桩 平台->桩
OCPP_ChangeAvailability, //设置枪可用状态 平台->桩
OCPP_ChangeConfiguration, //更改参数配置 平台->桩
OCPP_TriggerMessage, //平台下发数据召测 平台->桩
OCPP_GetConfiguration, //平台获取参数配置 平台->桩
OCPP_ClearCache, //清楚桩内缓存 一般为白名单 平台->桩
OCPP_SendLocalList, //平台下发本地缓存列表
OCPP_GetLocalListVersion, //获取卡号版本
OCPP_GetDiagnostics, //获取诊断日志文件
OCPP_DiagnosticsStatusNotification, /* 诊断日志上传状态 桩->平台 */
OCPP_FirmwareStatusNotification, /* 固件升级状态 桩->平台 */
}OCPP_CMD;
typedef enum{
OCPP_StatusNotification_errorCode = 0, //StatusNotification errorCode
OCPP_StatusNotification_statusCode,
OCPP_RemoteStartTransactionResponse_statusCode,
OCPP_RemoteStopTransactionResponse_statusCode,
OCPP_StopTransactionRequest_reason,
OCPP_UnlockConnectorResponse_stateCode,
OCPP_DiagnosticsStatusNotification_status, /* 与 OCPP_DIAG_NOTIFY_PENDING_E 下标对齐:0 Idle … */
OCPP_FirmwareStatusNotification_status, /* 与 OCPP_FW_NOTIFY_PENDING_E 下标对齐:0 Idle … */
}OCPP_ENUM_DATA_TYPE;
//状态错误信息
typedef enum{
OCPP_ERRORCODE_ConnectorLockFailure, //连接器锁定故障
OCPP_ERRORCODE_EVCommunicationError, //EV通讯故障
OCPP_ERRORCODE_GroundFailure, //接地故障
OCPP_ERRORCODE_HighTemperature, //高温
OCPP_ERRORCODE_InternalError, //内部错误
OCPP_ERRORCODE_LocalListConflict, //本地列表冲突
OCPP_ERRORCODE_NoError, //无错误
OCPP_ERRORCODE_OtherError, //其他错误
OCPP_ERRORCODE_OverCurrentFailure, //过电流故障
OCPP_ERRORCODE_PowerMeterFailure, //功率表故障
OCPP_ERRORCODE_PowerSwitchFailure, //电源开关故障
OCPP_ERRORCODE_ReaderFailure, //读卡器故障
OCPP_ERRORCODE_ResetFailure, //重置失败
OCPP_ERRORCODE_UnderVoltage, //电压过低
OCPP_ERRORCODE_OverVoltage, //电压过高
OCPP_ERRORCODE_WeakSignal, //信号弱
}OCPP_STATUSNOTIFICATION_ERRORCODE;
//状态信息
typedef enum{
OCPP_STATUSCODE_Available, //空闲
OCPP_STATUSCODE_Preparing, //准备
OCPP_STATUSCODE_Charging, //充电
OCPP_STATUSCODE_SuspendedEVSE, //暂停EVSE
OCPP_STATUSCODE_SuspendedEV, //暂停EV
OCPP_STATUSCODE_Finishing, //完成
OCPP_STATUSCODE_Reserved, //预留
OCPP_STATUSCODE_Unavailable, //不空闲
OCPP_STATUSCODE_Faulted, //故障
}OCPP_STATUSNOTIFICATION_STATUSCODE;
typedef struct
{
//必选
char chargePointVendor[OCPP_CiString20]; //"type": "string","maxLength": 20
char chargePointModel[OCPP_CiString20]; //"type": "string","maxLength": 20
//可选
char chargePointSerialNumber[OCPP_CiString25]; //"type": "string","maxLength": 25
char chargeBoxSerialNumber[OCPP_CiString25]; //"type": "string","maxLength": 25
char firmwareVersion[OCPP_CiString20]; //"type": "string","maxLength": 50
char iccid[OCPP_CiString30]; //"type": "string","maxLength": 20
char imsi[OCPP_CiString30]; //"type": "string","maxLength": 20
char meterType[OCPP_CiString25]; //"type": "string","maxLength": 25
char meterSerialNumber[OCPP_CiString25]; //"type": "string","maxLength": 25
}BootNotificationRequest;
typedef struct
{
//必选
char status[OCPP_CiString20]; //"type": "string","enum": ["Accepted","Pending","Rejected"]
char currentTime[OCPP_DATE_LEN]; //"type": "string","format": "date-time" 2022-09-09T16:40:00+04:00
int interval; //"type": "integer"
//可选
}BootNotificationResponse;
typedef struct
{
//必选
int connectorId; //连接器id
char errorCode[OCPP_CiString30]; //枚举 ocpp_errorCode 当前的错误状态代码。应当表示充电桩或连接器当前的错误情况。
/*"ConnectorLockFailure", 充电枪锁止机构故障
"EVCommunicationError", 与电动车通信失败
"GroundFailure", 接地故障
"HighTemperature", 设备温度过高
"InternalError", 内部错误
"LocalListConflict", 本地授权列表冲突
"NoError", 无错误
"OtherError", 其他未分类错误
"OverCurrentFailure", 过流故障
"PowerMeterFailure", 电表故障
"PowerSwitchFailure", 电源开关故障
"ReaderFailure", 读卡器故障
"ResetFailure", 复位失败
"UnderVoltage", 欠压故障
"OverVoltage", 过压故障
"WeakSignal" 信号弱*/
char status[OCPP_CiString20]; //枚举 statusCode 连接器的当前状态。
/*"Available", 可用
"Preparing", 准备中 插枪
"Charging", 充电中
"SuspendedEVSE", 充电桩主动暂停
"SuspendedEV", 电动车请求暂停
"Finishing", 结束中
"Reserved", 已预约
"Unavailable", 不可用
"Faulted" 故障*/
//可选
char info[OCPP_CiString30]; //与错误相关的其他自由格式的信息
char timestamp[OCPP_DATE_LEN]; //日期时间 状态变化发生的时间戳
char vendorId[OCPP_CiString50]; //制造商标识。
char vendorErrorCode[OCPP_CiString50]; //制造商特定的错误代码。
}StatusNotificationRequest;
typedef struct
{
char value[OCPP_CiString20]; //必选 计量值的实际数值,类型为字符串以支持任意长度的数值。
char context[OCPP_CiString20]; //可选 可选字段,表示计量上下文,例如 Sample.Periodic(定期采样)或 Sample.Alarm(报警采样)
/*"Interruption.Begin", 中断开始 标识充电过程被主动中断的起始时刻(如用户手动停止、系统故障触发)。
"Interruption.End", 中断结束 标识中断状态恢复的时间点(如故障修复后重新启动充电)。
"Sample.Clock", 时钟同步采样 按固定时钟时间(如整点)触发的数据采样,与时间严格对齐。
"Sample.Periodic", 定期采样 按固定间隔(如每15分钟)触发的数据采样,与起始时间无关。
"Transaction.Begin", 交易开始 标识充电交易的起始时刻(如用户刷卡启动充电)。
"Transaction.End", 交易结束 标识充电交易的终止时刻(如用户拔枪或余额耗尽)。
"Trigger", 触发器事件 表示由外部信号(如远程控制命令)触发的动作,需结合具体 triggerMessage 使用。
"Other" 其他事件
*/
char format[OCPP_CiString20]; //可选 可选字段,表示计量值的格式,例如 Raw 或 SignedData。/*"Raw" 明文,"SignedData" 签名加密*/
char measurand[OCPP_CiString50]; //可选 可选字段,表示计量对象,例如 Energy.Active.Import.Register (导入的有效能量)。
/*"Energy.Active.Export.Register", 累计放电电量(电表读数)Wh 或 kWh
"Energy.Active.Import.Register", 累计充电电量(电表读数)Wh 或 kWh
"Energy.Reactive.Export.Register", 无功电能导出累计值 (单位: kvarh/varh)
"Energy.Reactive.Import.Register", 无功电能导入累计值 (单位: kvarh/varh)
"Energy.Active.Export.Interval", 时间间隔内有功电能导出 (单位: kWh/Wh)
"Energy.Active.Import.Interval", 时间间隔内有功电能导入 (单位: kWh/Wh)
"Energy.Reactive.Export.Interval", 时间间隔内无功电能导出 (单位: kvarh/varh)
"Energy.Reactive.Import.Interval", 时间间隔内无功电能导入 (单位: kvarh/varh)
"Power.Active.Export", 瞬时值 有功功率(放电功率)W
"Power.Active.Import", 瞬时值 有功功率(充电功率)W
"Power.Offered", 充电桩可提供的最大功率 (单位: W/kW)
"Power.Reactive.Export", 瞬时无功功率导出 (单位: var/kvar)
"Power.Reactive.Import", 瞬时无功功率导入 (单位: var/kvar)
"Power.Factor", 功率因数 (无单位, 范围: -1.0~1.0)
"Current.Import", 输入电流(充电电流)
"Current.Export", 输出电流(放电电流)
"Current.Offered", 充电桩可提供的最大电流 (单位: A)
"Voltage", 电压(相电压或线电压)
"Frequency", 电网频率
"Temperature", 温度(如充电桩内部温度)
"SoC", 电池电量状态(State of Charge
"RPM" 电机转速 (单位: RPM)*/
char phase[OCPP_CiString20]; //可选 可选字段,表示电力相位,例如 L1, L2, L3。
/*"L1",
"L2",
"L3",
"N",
"L1-N",
"L2-N",
"L3-N",
"L1-L2",
"L2-L3",
"L3-L1"*/
char location[OCPP_CiString20]; //可选 可选字段,表示计量装置的位置,例如 Inlet, Outlet.
/*"Cable",电缆
"EV",车辆
"Inlet",入口
"Outlet",出口
"Body"整桩 */
char unit[OCPP_CiString20]; //可选 可选字段,表示计量单位,例如 Wh, kWh, V, A.
/*"Wh",
"kWh",
"varh",
"kvarh",
"W",
"kW",
"VA",
"kVA",
"var",
"kvar",
"A",
"V",
"K",
"Celcius",
"Celsius", 摄氏度
"Fahrenheit", 华氏度
"Percent" 百分比*/
}SampledValue;
typedef struct
{
int connectorId; //必须 表示充电连接器的唯一标识符。
int transactionId; //可选 当前充电事务的唯一标识符。这是可选字段,只有在当前有正在进行的充电事务时才有值。
struct
{
char timestamp[OCPP_DATE_LEN]; //必须 记录取样数据的时间,ISO 8601 格式。
SampledValue sampledValue[MeterValuesRequest_SV_NUM]; //必须 最大同时上送3种数据 代表一个或多个取样值,每个取样值包含以下字段:
}meterValue[MeterValuesRequest_MV_NUM]; //必须 这是一个数组,包含一组计量值。每个计量值包含一个时间戳和对应的一组取样值。
}MeterValuesRequest;
typedef struct
{
int connectorId; //可选 指示发起交易的连接器ID,即充电桩的具体插口编号。
char idTag[OCPP_CiString20]; //必选 标识电动汽车用户或车主的唯一ID标识,用于识别用户。。
struct
{
int chargingProfileId; //必选 充电配置的唯一标识符
int transactionId; //可选 关联的事务ID,用于将此配置与特定充电事务关联
int stackLevel; //必选 配置优先级,数值越高优先级越高
char chargingProfilePurpose[OCPP_CiString25]; //必选 定义配置的用途
/* "ChargePointMaxProfile", 充电桩最大功率配置
"TxDefaultProfile", 默认事务配置
"TxProfile" 特定事务配置*/
char chargingProfileKind[OCPP_CiString20]; //必选 定义配置的时间类型
/* "Absolute", 绝对时间配置
"Recurring", 循环配置
"Relative" 相对时间配置*/
char recurrencyKind[OCPP_CiString20]; //可选 仅当chargingProfileKind为"Recurring"时有效
/* "Daily",每天
"Weekly" 每周*/
char validFrom[OCPP_DATE_LEN]; //可选 "date-time"配置生效的开始时间。如果不存在,则配置文件在充电桩收到后立即有效。当ChargingProfilePurpose是TxProfile时,请勿使用。
char validTo[OCPP_DATE_LEN]; //可选 "date-time"配置失效的结束时间。如果不存在,则该配置文件在被另一个 配置文件替换之前一直有效。当ChargingProfilePurpose是TxProfile时,请勿使用。
struct
{
int duration; //可选 持续时间
char startSchedule[OCPP_DATE_LEN]; //可选 "date-time" 充电计划开始时间
char chargingRateUnit[OCPP_CiString20]; //必选 充电速率单位
/* "A",
"W"*/
struct
{
int startPeriod; //必选 时段开始时间(相对于充电计划开始时间的秒数)
float limit; //必选 该时段的最大充电速率
int numberPhases; //可选 使用的相数(1-3)
}chargingSchedulePeriod[3]; //必选 充电计划时段数组
float minChargingRate; //可选 最小充电速率
}chargingSchedule; //必选 充电计划配置
}chargingProfile; //可选 充电配置参数,用于指定充电行为。
}RemoteStartTransactionRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted"接受,"Rejected"拒绝
}RemoteStartTransactionResponse;
typedef struct
{
int transactionId; //当前充电事务的唯一标识符。
}RemoteStopTransactionRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted"接受,"Rejected"拒绝
}RemoteStopTransactionResponse;
typedef struct
{
int connectorId; //必选 指示发起交易的连接器ID,即充电桩的具体插口编号。
int meterStart; //必选 交易开始时的电表读数,这通常是充电开始时的初始能量值。 Wh
int reservationId; //可选 如果交易基于事先的预定进行,此字段包含预定的ID。
char idTag[OCPP_CiString20]; //必选 标识电动汽车用户或车主的唯一ID标识,通过RFID卡或其他识别机制获取。
char timestamp[OCPP_DATE_LEN]; //必选 "date-time" 交易开始的时间戳,表示交易开始的准确时间。
}StartTransactionRequest;
typedef struct
{
int transactionId; //必选 中央系统生成的唯一交易ID,用于后续的交易管理和追踪。
struct
{
char status[OCPP_CiString20]; //必选 指示idTag的当前状态,例如是否被接受、是否过期等。Accepted、Blocked、Expired、Invalid、ConcurrentTx
char expiryDate[OCPP_DATE_LEN]; //可选 idTag有效期的截止日期
char parentIdTag[OCPP_CiString20]; //可选 如果存在关联账户,这是父idTag。
}idTagInfo; //必选 包含对idTag的验证和状态信息,其中包括:
}StartTransactionResponse;
typedef struct
{
int meterStop; //必选 交易结束时的电表读数,这通常是充电结束时的最终能量值 Wh
int transactionId; //必选 要停止的充电事务的唯一标识符
char idTag[OCPP_CiString20]; //可选 标识电动汽车用户或车主的唯一ID标识。
char timestamp[OCPP_DATE_LEN]; //必选 交易结束的时间戳,表示交易停止的准确时间
char reason[OCPP_CiString20]; //可选 指示停止充电的原因,这可以包括:正常结束、紧急停止等情况。 Local、Remote、EmergencyStop、EVDisconnected、HardReset、SoftReset、deAuthorized、Expired、EVConnectTimeout、Other
struct
{
char timestamp[OCPP_DATE_LEN]; //必选
SampledValue sampledValue[StopTransactionRequest_SV_NUM]; //必选
}transactionData[StopTransactionRequest_TD_NUM]; //可选 包含与充电交易相关的更详细的数据,如中途的数据采集点
}StopTransactionRequest;
typedef struct
{
struct
{
char status[OCPP_CiString20]; //必选 指示idTag的当前状态,例如是否被接受、是否过期等。Accepted、Blocked、Expired、Invalid、ConcurrentTx
char expiryDate[OCPP_DATE_LEN]; //可选 idTag有效期的截止日期。
char parentIdTag[OCPP_CiString20]; //可选 果存在关联账户,这是父idTag。
}idTagInfo;
}StopTransactionResponse;
typedef struct
{
int connectorId;
}UnlockConnectorRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Unlocked","UnlockFailed","NotSupported"
}UnlockConnectorResponse;
typedef struct
{
int retries; //可选
int retryInterval; //可选
char retrieveDate[OCPP_DATE_LEN]; //必选
char location[OCPP_CiString255]; //必选
}UpdateFirmwareRequest;
typedef struct
{
int test;
}UpdateFirmwareResponse;
typedef struct
{
char type[OCPP_CiString20]; // "Hard","Soft"
}ResetRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted","Rejected"
}ResetResponse;
typedef struct
{
char idTag[OCPP_CiString20];
}AuthorizeRequest;
typedef struct
{
struct
{
char expiryDate[OCPP_DATE_LEN]; //可选
char parentIdTag[OCPP_CiString20]; //可选
char status[OCPP_CiString20]; //必选
/*"Accepted", 请求已被接受
"Blocked", 请求被拒绝(因策略限制)
"Expired", 授权凭证已过期
"Invalid", 凭证无效或格式错误
"ConcurrentTx" 存在并发事务(同一车辆/用户已在充电)*/
}idTagInfo;
}AuthorizeResponse;
typedef struct
{
int reservationId;
}CancelReservationRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted","Rejected"
}CancelReservationResponse;
typedef struct
{
int connectorId;
char type[OCPP_CiString20]; //"Inoperative","Operative"
}ChangeAvailabilityRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted","Rejected",Scheduled"
}ChangeAvailabilityResponse;
typedef struct
{
char key[OCPP_CiString50];
char value[OCPP_CiString300]; //
}ChangeConfigurationRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted","Rejected","RebootRequired","NotSupported"
}ChangeConfigurationResponse;
typedef struct
{
int connectorId; //可选
char requestedMessage[OCPP_CiString50]; //必选 "BootNotification","DiagnosticsStatusNotification","FirmwareStatusNotification","Heartbeat","MeterValues","StatusNotification"
}TriggerMessageRequest;
typedef struct
{
char status[OCPP_CiString20]; //"Accepted","Rejected","NotImplemented"
}TriggerMessageResponse;
typedef struct
{
char key[GetConfiguration_NUM][OCPP_CiString50]; //array
}GetConfigurationRequest;
typedef struct
{
char unknownKey[GetConfiguration_NUM][OCPP_CiString50]; //array
struct
{
int readonly; //必选
char key[OCPP_CiString50]; //必选
char value[OCPP_CiString100]; //可选
}configurationKey[GetConfiguration_NUM];
}GetConfigurationResponse;
typedef struct
{
int res;
}ClearCacheRequest;
typedef struct
{
char status[OCPP_CiString20];
}ClearCacheResponse;
typedef struct
{
char idTag[OCPP_CiString30];
struct
{
char expiryDate[OCPP_DATE_LEN];
char parentIdTag[OCPP_CiString20];
char status[OCPP_CiString20];
}idTagInfo;
}LocalAuthorizationList;
typedef struct
{
int listVersion;
char updateType[OCPP_CiString30];
int List_num;
LocalAuthorizationList *list;
}SendLocalListRequest;
typedef struct
{
char status[OCPP_CiString20];
}SendLocalListResponse;
typedef struct
{
int listVersion;
}GetLocalListVersionResponse;
typedef struct
{
int retries; //可选
int retryInterval; //可选
char location[OCPP_CiString255]; //必须
char startTime[OCPP_DATE_LEN]; //可选
char stopTime[OCPP_DATE_LEN]; //可选
}GetDiagnosticsRequest;
typedef struct
{
char fileName[OCPP_CiString50];
}GetDiagnosticsResponse;
typedef struct {
char status[OCPP_CiString20];
} DiagnosticsStatusNotificationRequest;
/** 与 DiagnosticsStatusNotification 载荷相同,仅 Action 名不同 */
typedef DiagnosticsStatusNotificationRequest FirmwareStatusNotificationRequest;
cJSON* j_get_ocpp_json(OCPP_CMD cmd , void *data);
int get_ocpp_data(OCPP_CMD cmd , void *data ,cJSON *root);
OCPP_CMD e_get_recv_json_cmd(char* cmd_str);
const char *s_get_ocpp_cmd_str(OCPP_CMD cmd);
const char *s_get_ocpp_enum_data_str(OCPP_ENUM_DATA_TYPE type ,int cmd);
#endif
#endif