#ifndef _BS_OCPP_CTRL_H_ #define _BS_OCPP_CTRL_H_ #include "publicdata/type.h" #include "publicdata/public_define.h" #if BS_OCPP_EN //OCPP平台使能 #include "bs_ocpp_json_data.h" #include "meter_calculate/meter_calculate_impl.h" #include "publicdata/publicdata.h" #include "main.h" #include "flash_file_mgr/ocpp_mv_offline_flash_impl.h" #define OCPP_TIMERCNT_NUM 12 //ocpp 计时计数 #define OCPP_ACK_STRUCT_NUM 5 //ocpp 应答结构体数量 #define OCPP_MALLOC pvPortMalloc #define OCPP_FREE vPortFree typedef enum{ OCPP_TIMER_BootNotification = 0, //登录帧 OCPP_TIMER_Heartbeat, //心跳帧 OCPP_TIMER_StatusNotification_GUNA, //A枪 状态上传 OCPP_TIMER_StatusNotification_GUNB, //B枪 状态上传 OCPP_TIMER_MeterValues_GUNA, //A枪电表数据上传 OCPP_TIMER_MeterValues_GUNB, //B枪电表数据上传 OCPP_TIMER_StopTransaction_GUNA, //A枪停止充电数据上传 OCPP_TIMER_StopTransaction_GUNB, //B枪停止充电数据上传 OCPP_TIMER_Authorize_GUNA, //A枪鉴权查询上传 OCPP_TIMER_Authorize_GUNB, //B枪鉴权查询上传 }OCPP_SEND_TIMER; typedef enum{ OCPP_STATE_CHANGE_FLAG = 0, //状态变位标志 OCPP_TRADE_UPLOAD_FLAG, //交易订单上传标志 OCPP_START_RESULT_FLAG, //启动结果上送标志 OCPP_STOP_RESULT_FLAG, //停止结果上送标志 OCPP_VIN_START_FLAG, //VIN鉴权请求上送标志 OCPP_VIN_RESULT, //VIN鉴权结果 OCPP_BILL_INDEX, //上送订单索引号 }OCPP_CHARGE_FLAG; /** DiagnosticsStatusNotification 待上送状态:外部/FTP 仅赋值;ocpp_send_mag_ctrl 监听非 0 则发送并清 0 */ typedef enum { OCPP_DIAG_NOTIFY_PENDING_NONE = 0, OCPP_DIAG_NOTIFY_PENDING_UPLOADING, OCPP_DIAG_NOTIFY_PENDING_UPLOADED, OCPP_DIAG_NOTIFY_PENDING_UPLOAD_FAILED, } OCPP_DIAG_NOTIFY_PENDING_E; /** FirmwareStatusNotification 待上送状态:与 Diagnostics 同套路(u8_*_notify_pending + ocpp_send_mag_ctrl) */ typedef enum { OCPP_FW_NOTIFY_PENDING_NONE = 0, OCPP_FW_NOTIFY_PENDING_DOWNLOADING, OCPP_FW_NOTIFY_PENDING_DOWNLOADED, OCPP_FW_NOTIFY_PENDING_INSTALLING, OCPP_FW_NOTIFY_PENDING_INSTALLED, OCPP_FW_NOTIFY_PENDING_DOWNLOAD_FAILED, OCPP_FW_NOTIFY_PENDING_INSTALLATION_FAILED, } OCPP_FW_NOTIFY_PENDING_E; typedef struct { U8_T flag; //存储标志 U8_T check_count; //查询次数 U8_T gunNo; //抢号 U16_T u16_cnt; /* 存储计数(回绕安全:v_clear_save_cmd 基于 max-min 差值检测回绕)*/ OCPP_CMD cmd; //命令值 char key[64]; //随机数密钥 }OCPP_DATA_SAVE; typedef struct { OCPP_CMD cmd; //命令值 U8_T gunNo; //枪号 U8_T type; //应答数据类型 不同帧自定义 U8_T timer_cnt; //计时计数 用于超时判定 char ack_key[64]; //回复相同秘钥 char ack_data[32]; //应答数据内容 不同帧自定义 }OCPP_DATA_RECV_ACK; /** 未结补单:先 Authorize 再 StartTransaction 的鉴权阶段 */ typedef enum { OCPP_UNSETTLED_AUTH_NONE = 0, OCPP_UNSETTLED_AUTH_WAIT, OCPP_UNSETTLED_AUTH_OK } OCPP_UNSETTLED_AUTH_PHASE_E; typedef struct { U8_T id; //平台id 0-1 U8_T u8_register_flag; //登录标志 U8_T u8_ping_ack; //ping包回复标志 U8_T u8_unsettled_order_flag; //离线订单上送检查 U8_T u8_reboot_flag; //重启标志 0无动作 1平台下发重启 2本地重启 U8_T u8_log_file_upload; //日志文件上传标志 U8_T u8_diag_notify_pending; //见 OCPP_DIAG_NOTIFY_PENDING_E,仅赋值触发;发送在 ocpp_send_mag_ctrl U8_T u8_fw_notify_pending; //见 OCPP_FW_NOTIFY_PENDING_E,与 u8_diag_notify_pending 并列、同发送机制 U8_T u8_fw_reboot_pending; //Installed 已成功上送后再 v_sys_reboot(避免未上报即复位) U8_T u8_fw_installing_fsn_sent; //FSN(Installing) 已 sm>0 发出;STEP_FTP_SAVE 写头/复位前须为 1 S_LOG_DATA *s_unsettled_order_data; U8_T u8_unsettled_auth_phase; // 未结补单:Authorize→StartTransaction 流水线阶段,取值见 OCPP_UNSETTLED_AUTH_PHASE_E U32_T u32_unsettled_last_auth_s; // 未结补单:上次发出 Authorize 的秒时间戳(get_current_seconds),用于发送节流 U32_T u32_unsettled_last_stx_s; // 未结补单:上次发出 StartTransaction 的秒时间戳(get_current_seconds),用于发送节流 struct { U8_T u8_MeterValues_type; //数据上送标志 0无动作 1空闲数据上送 2充电中数据上送 3交易开始数据上送 4交易停止数据上送 //平台召测数据 "BootNotification","DiagnosticsStatusNotification","FirmwareStatusNotification","Heartbeat","MeterValues","StatusNotification" U8_T u8_get_Trigger_BootNotification; U8_T u8_get_Trigger_DiagnosticsStatusNotification; U8_T u8_get_Trigger_FirmwareStatusNotification; U8_T u8_get_Trigger_Heartbeat; U8_T u8_get_Trigger_MeterValues; U8_T u8_get_Trigger_StatusNotification; U8_T u8_aut_cnt; //鉴权次数 U8_T u8_StatusNotification_send_cnt; //状态上传次数(保留,周期上送已取消) U8_T u8_need_status_after_login; // BootNotification Accepted/Pending 后每枪需上送一次 StatusNotification U8_T s_u8_mv_ws_fail_snap_req; /** MeterValues ws 发送失败时置位,下一周期强制写一条离线 MV */ int s_ocpp_live_stop_tx_id; /** 在线已上送 StopTransaction 的 transactionId(按枪),-1 表示无 */ }s_ctrl_flag[GUN_MAX_CNT]; //数据控制标志 struct { U16_T u16_timerCnt; //周期发送计数 U16_T u16_timeNUM ; //计数周期值 }s_timerCnt[OCPP_TIMERCNT_NUM]; U16_T u16_ocpp_ping_timer; //ping包周期计数 U32_T u32_timer; //计时计数 ULONG ulong_timer; //接收计时 OCPP_DATA_RECV_ACK *ack_ctrl[OCPP_ACK_STRUCT_NUM]; }OCPP_DATA_CTRL; int recv_mags(char* recv_mag); /**************************************************** *函数名称: v_ocpp_init_data() *功能说明: OCPP 应用层全量初始化:`v_ocpp_mv_offline_init`、清 OCPP_DATA_CTRL、Flash 配置与定时器、再走联网恢复(含 4G) *参数说明: * 上电由平台主任务调用;TCP 长时间连不上时亦调用本函数;diag/fw 等 pending 随 memset 清零 ****************************************************/ void v_ocpp_init_data(U8_T bs_flag); /** 仅联网恢复:释放应答、可选 v_bs_4G_data_init、fd=-1、ulong_restart_timer;不执行 memset(OCPP_DATA_CTRL) */ void v_ocpp_init_data_ex(U8_T bs_flag, U8_T reset_4g_modem); /**************************************************** *函数名称: v_ocpp_tcp_connect() *功能说明: TCP连接功能实现 - 配置4G模块 *参数说明: * 输入参数: * 输出参数: 0失败 1成功 ****************************************************/ U8_T v_ocpp_tcp_connect(); /**************************************************** *函数名称: v_ocpp_logo_on() *功能说明: 平台桩信息登录 - *参数说明: * 输入参数: * 输出参数: 0失败 1成功 ****************************************************/ U8_T v_ocpp_logo_on(); /**************************************************** *函数名称: v_ocpp_recv_data() *功能说明: 数据接收处理 - *参数说明: * 输入参数: * 输出参数: ****************************************************/ void v_ocpp_recv_data(); /**************************************************** *函数名称: v_ocpp_send_ctrl() *功能说明: sdk私有协议逻辑控制 - *参数说明: * 输入参数: * 输出参数: ****************************************************/ void v_ocpp_send_ctrl(); /**************************************************** *函数名称: v_ocpp_private_logic() *功能说明: sdk私有协议逻辑控制 - *参数说明: * 输入参数: * 输出参数: ****************************************************/ void v_ocpp_private_logic(U8_T bs_flag); /** 仅置 u8_diag_notify_pending(Uploaded / UploadFailed);实际上送由 ocpp_send_mag_ctrl 监听该变量完成 */ void v_ocpp_set_diag_upload_notify_pending(U8_T pending); /** 置 u8_fw_notify_pending;合法值见 OCPP_FW_NOTIFY_PENDING_E;实际上送由 ocpp_send_mag_ctrl */ void v_ocpp_set_fw_notify_pending(U8_T pending); /** FSN(Installing) 是否已由 ocpp_send_mag_ctrl 成功发出(供 ec200a STEP_FTP_SAVE 等待) */ U8_T u8_ocpp_fw_installing_fsn_sent(void); void v_ocpp_clr_fw_installing_fsn_sent(void); /** Installed 上送成功后需复位:置位,由 ocpp_send_mag_ctrl 在 FSN(Installed) 发出后调用 v_sys_reboot(旧流程;FTP 升级现改 EEPROM+先复位) */ void v_ocpp_set_fw_reboot_after_installed(U8_T pending); /** FTP 写升级头后:FRAM 置位,复位;BootNotification Accepted/Pending 后再发 FSN Installed */ void v_ocpp_fw_eeprom_set_installed_after_boot(void); /** 在线会话已上送 StopTransaction(如 Remote)后登记 txId,避免 EEPROM 掉电单重复 StopTx PowerLoss */ void v_ocpp_mark_live_stop_tx_done(U8_T gun_idx, int transaction_id); /** 未结/掉电补单是否应跳过(同枪同 txId 已在线停充上送) */ U8_T u8_ocpp_skip_unsettled_stop_for_live_tx(S_LOG_DATA *log); /** 未结单与当前枪正在进行的在线充电为同一会话(勿 StopTx / 勿抢 session MV 补发) */ U8_T u8_ocpp_unsettled_is_live_charging_session(S_LOG_DATA *log); /** 未结订单:preTradeNo 是否仍为占位/空(须先 Authorize→StartTransaction) */ U8_T u8_ocpp_is_pre_trade_no_pending(const U8_T *p); /** 补发一条离线缓存的 MeterValues(与 send_mag 主动帧格式一致) */ int32_t s32_ocpp_send_meter_values_replay(int gunNo, int transactionId, const S_OCPP_MV_OFFLINE_MV *mv); #endif #endif