/** ****************************************************************************** * @file tcp_protocol.h * @brief TCP通信协议解析头文件 ****************************************************************************** */ #ifndef __TCP_PROTOCOL_H #define __TCP_PROTOCOL_H #include #ifdef __cplusplus extern "C" { #endif /* 命令类型定义(字符串类型) */ #define CMD_HEARTBEAT "Heartbeat" #define CMD_SYSTEM_INFO "SystemInfo" #define CMD_GUN_INFO "GunInfo" #define CMD_CHARGE_CONTROL "ChargeControl" #define CMD_ALARM_NOTIFY "AlarmNotify" #define CMD_STATUS_RESPONSE "StatusResponse" #define CMD_PARAM_QUERY "ParamQuery" #define CMD_PARAM_MODIFY "ParamModify" #define CMD_FIRMWARE_UPGRADE "FirmwareUpgrade" #define CMD_FAULT_INFO "FaultInfo" #define CMD_CUSTOM_DATA "CustomData" /* 网络状态定义 */ #define NETWORK_STATUS_OK 1 /* 网络正常 */ #define NETWORK_STATUS_ERROR 0 /* 网络异常 */ /* 充电状态定义 */ #define CHARGING_STATUS_IDLE 0 /* 空闲 */ #define CHARGING_STATUS_CONNECTED 1 /* 已连接 */ #define CHARGING_STATUS_STARTING 2 /* 启动中 */ #define CHARGING_STATUS_CHARGING 3 /* 充电中 */ #define CHARGING_STATUS_FINISHED 4 /* 充电完成 */ /* 枪连接状态定义 */ #define GUN_CONNECTION_DISCONNECTED 0 /* 未连接 */ #define GUN_CONNECTION_CONNECTED 1 /* 已连接 */ /* 充电控制动作定义 */ #define CHARGE_ACTION_STOP 0 /* 停止充电 */ #define CHARGE_ACTION_START 1 /* 启动充电 */ /* 固件升级子命令定义 */ #define FIRMWARE_SUBCMD_START "Start" #define FIRMWARE_SUBCMD_DATA "Data" #define FIRMWARE_SUBCMD_END "End" #define FIRMWARE_SUBCMD_RESPONSE "Response" /* 固件升级状态定义 */ #define FIRMWARE_STATUS_SUCCESS 0 /* 成功 */ #define FIRMWARE_STATUS_FAILED 1 /* 失败 */ #define FIRMWARE_STATUS_IN_PROGRESS 2 /* 进行中 */ #define FIRMWARE_STATUS_COMPLETED 3 /* 完成 */ /* 文件操作命令定义 */ #define CMD_FILE_OPERATIONS "FileOperations" /* 文件操作子命令定义 */ #define FILE_OP_SUBCMD_QUERY "Query" #define FILE_OP_SUBCMD_DELETE "Delete" #define FILE_OP_SUBCMD_DOWNLOAD "Download" #define FILE_OP_SUBCMD_UPLOAD "Upload" /* 历史记录查询/清除命令定义 */ #define CMD_HISTORY_OPERATIONS "HistoryOperations" #define HISTORY_OP_SUBCMD_QUERY "Query" #define HISTORY_OP_SUBCMD_CLEAR "Clear" /* 文件操作状态定义 */ #define FILE_OP_STATUS_SUCCESS 0 /* 成功 */ #define FILE_OP_STATUS_FAILED 1 /* 失败 */ #define FILE_OP_STATUS_IN_PROGRESS 2 /* 进行中 */ #define FILE_OP_STATUS_NOT_FOUND 3 /* 文件未找到 */ #define FILE_OP_STATUS_NO_SPACE 4 /* 空间不足 */ #define FILE_OP_STATUS_PERMISSION_DENIED 5 /* 权限不足 */ /* 文件类型定义 */ #define FILE_TYPE_REGULAR 0 /* 普通文件 */ #define FILE_TYPE_DIRECTORY 1 /* 目录 */ #define FILE_TYPE_SYSTEM 2 /* 系统文件 */ /* 文件信息结构 */ typedef struct { char name[128]; /* 文件名 */ uint8_t type; /* 文件类型 */ uint32_t size; /* 文件大小(字节) */ char modified_time[32]; /* 修改时间 */ char created_time[32]; /* 创建时间 */ } tcp_file_info_t; /* 文件查询请求结构 */ typedef struct { char path[256]; /* 查询路径 */ uint8_t recursive; /* 是否递归查询(0:否, 1:是) */ } tcp_file_query_request_t; /* 文件查询响应结构 */ typedef struct { char path[256]; /* 查询路径 */ uint16_t file_count; /* 文件数量 */ uint16_t dir_count; /* 目录数量 */ uint32_t total_size; /* 总大小(字节) */ tcp_file_info_t *files; /* 文件信息数组(动态分配) */ } tcp_file_query_response_t; /* 文件删除请求结构 */ typedef struct { char path[256]; /* 文件路径 */ uint8_t force; /* 强制删除(0:否, 1:是) */ } tcp_file_delete_request_t; /* 文件删除响应结构 */ typedef struct { char path[256]; /* 文件路径 */ uint8_t status; /* 删除状态 */ char message[128]; /* 结果消息 */ } tcp_file_delete_response_t; /* 文件下载请求结构 */ typedef struct { char path[256]; /* 文件路径 */ uint32_t offset; /* 起始偏移(字节) */ uint32_t chunk_size; /* 分块大小(字节) */ } tcp_file_download_request_t; /* 文件下载响应结构 */ typedef struct { char path[256]; /* 文件路径 */ uint32_t file_size; /* 文件总大小 */ uint32_t offset; /* 当前偏移 */ uint32_t chunk_size; /* 分块大小 */ uint32_t data_len; /* 数据长度 */ uint8_t *data; /* 数据内容(Base64编码) */ uint8_t is_last_chunk; /* 是否为最后一块(0:否, 1:是) */ } tcp_file_download_response_t; /* 文件上传请求结构 */ typedef struct { char path[256]; /* 文件路径 */ uint32_t file_size; /* 文件总大小 */ uint32_t chunk_size; /* 分块大小 */ uint32_t offset; /* 当前偏移 */ uint32_t data_len; /* 数据长度 */ uint8_t *data; /* 数据内容(Base64编码) */ uint8_t is_last_chunk; /* 是否为最后一块(0:否, 1:是) */ } tcp_file_upload_request_t; /* 文件上传响应结构 */ typedef struct { char path[256]; /* 文件路径 */ uint32_t received_size; /* 已接收大小 */ uint32_t total_size; /* 文件总大小 */ uint8_t status; /* 上传状态 */ char message[128]; /* 结果消息 */ } tcp_file_upload_response_t; /* 文件操作通用数据结构 */ typedef struct { char subCommand[32]; /* 子命令: Query, Delete, Download, Upload */ union { tcp_file_query_request_t query; /* 查询请求 */ tcp_file_delete_request_t delete; /* 删除请求 */ tcp_file_download_request_t download; /* 下载请求 */ tcp_file_upload_request_t upload; /* 上传请求 */ } request; union { tcp_file_query_response_t query; /* 查询响应 */ tcp_file_delete_response_t delete; /* 删除响应 */ tcp_file_download_response_t download; /* 下载响应 */ tcp_file_upload_response_t upload; /* 上传响应 */ } response; } tcp_file_operation_data_t; /* 心跳消息结构 */ typedef struct { uint32_t sequence; /* 序列号 */ char source[32]; /* 来源 */ } tcp_heartbeat_data_t; /* 系统信息结构 */ typedef struct { char systemModel[32]; /* 系统型号 */ uint8_t gunCount; /* 枪数量 */ float devicePower; /* 设备功率 */ uint8_t networkStatus; /* 网络状态 */ uint8_t faultCount; /* 故障数量 */ char version[32]; /* 版本号 */ } tcp_system_info_data_t; /* 充电枪数据结构 */ typedef struct { uint8_t gunNumber; /* 枪编号 (1-2) */ uint8_t chargingStatus; /* 充电状态 */ uint8_t gunConnectionStatus; /* 枪连接状态 */ uint16_t charge_time; /* 充电时间 min*/ float demandVoltage; /* 需求电压 */ float demandCurrent; /* 需求电流 */ float actualVoltage; /* 实际电压 */ float actualCurrent; /* 实际电流 */ float energy; /* 充电能量 (kWh) */ float cost; /* 充电费用 */ float batterySOC; /* 电池SOC (%) */ char userId[32]; /* 用户ID */ char orderNumber[32]; /* 订单号 */ } tcp_gun_data_t; /* 充电控制结构 */ typedef struct { uint8_t gunNumber; /* 枪编号 (1-2) */ uint8_t action; /* 动作 (0:停止, 1:启动) */ } tcp_charge_control_t; /* 参数类型定义 */ #define PARAM_TYPE_BASIC "BasicParameters" #define PARAM_TYPE_NETWORK "NetworkParameters" #define PARAM_TYPE_METER "MeterParameters" #define PARAM_TYPE_ENABLE "EnableParameters" #define PARAM_TYPE_FEE "FeeParameters" #define PARAM_TYPE_SDK "SDKParameters" #define PARAM_TYPE_QRCODE "QRCodeParameters" /* 参数项结构 */ typedef struct { char name[32]; /* 参数名称 */ char type[16]; /* 参数类型 */ char value[64]; /* 参数值(字符串形式) */ char decs[64]; /* 参数描述(可为空) */ } tcp_param_item_t; /* 参数查询请求结构 */ typedef struct { char type[32]; /* 参数类型 */ } tcp_param_query_request_t; /* 参数查询响应结构 */ typedef struct { char type[32]; /* 参数类型 */ uint16_t count; /* 参数数量 */ tcp_param_item_t *params; /* 参数数组(动态分配) */ } tcp_param_query_response_t; /* 参数修改请求结构 */ typedef struct { char type[32]; /* 参数类型 */ uint16_t count; /* 参数数量 */ tcp_param_item_t *params; /* 参数数组(动态分配) */ } tcp_param_modify_request_t; /* 参数修改响应结构 */ typedef struct { char type[32]; /* 参数类型 */ uint16_t received; /* 接收到的参数数量 */ uint16_t processed; /* 已处理的参数数量 */ uint16_t success; /* 成功的参数数量 */ uint16_t failed; /* 失败的参数数量 */ } tcp_param_modify_response_t; /* 固件升级数据结构 */ typedef struct { char subCommand[32]; /* 子命令: Start, Data, End, Response */ union { struct { uint32_t fileSize; /* 文件大小(字节) */ uint32_t totalPackets; /* 总包数 */ uint32_t packetSize; /* 包大小(字节) */ char firmwareVersion[32]; /* 固件版本 */ } start; struct { uint32_t packetIndex; /* 包索引 */ uint32_t totalPackets; /* 总包数 */ char *data; /* 数据(Base64编码),动态分配 */ uint32_t data_len; /* 数据长度 */ uint32_t crc; /* CRC校验值 */ } data; struct { uint8_t status; /* 状态 */ char errorMessage[128]; /* 错误信息 */ } end; struct { uint8_t response; /* 响应码 */ int packetIndex; /* 包索引 */ char message[64]; /* 消息 */ } response; } u; } tcp_firmware_upgrade_data_t; /* CustomData数据结构 */ typedef struct { char functionField[32]; /* 功能字段 */ char functionContent[32]; /* 功能内容 */ char functionParams[128]; /* 功能参数 */ } tcp_custom_data_t; /* 故障信息数据结构 */ typedef struct { char faultCode[16]; /* 故障代码(可选),如"F001",为空表示查询所有故障 */ } tcp_fault_info_request_t; /* 历史记录操作请求结构 */ typedef struct { char historyType[16]; /* fault|charging|card */ char subCommand[32]; /* Query|Clear */ uint32_t queryId; /* 一次查询会话标识 */ uint16_t startIndex; /* 距离最新的偏移:0=最新 */ uint16_t fetchCount; /* 希望获取的条数(服务端会裁剪/按字节预算修正) */ } tcp_history_operations_data_t; /* 单个故障信息结构 */ typedef struct { char location[32]; /* 故障位置,如"充电枪1" */ char code[16]; /* 故障代码,如"F001" */ char time[32]; /* 故障时间,格式"YYYY-MM-DD HH:MM:SS" */ char description[128]; /* 故障描述,如"过流保护触发" */ } tcp_fault_item_t; /* 故障信息响应结构 */ typedef struct { uint8_t status; /* 状态码,0表示成功 */ uint16_t faultCount; /* 故障数量 */ tcp_fault_item_t *faults; /* 故障信息数组(动态分配) */ } tcp_fault_info_response_t; /* 通用消息结构 */ typedef struct { char version[16]; /* 协议版本 */ char timestamp[32]; /* 时间戳 */ char command[32]; /* 命令类型(字符串) */ union { tcp_heartbeat_data_t heartbeat; /* 心跳数据 */ tcp_system_info_data_t systemInfo; /* 系统信息数据 */ tcp_gun_data_t gunData; /* 充电枪数据 */ tcp_charge_control_t chargeControl; /* 充电控制数据 */ tcp_param_query_request_t paramQuery; /* 参数查询请求 */ tcp_param_modify_request_t paramModify; /* 参数修改请求 */ tcp_firmware_upgrade_data_t firmwareUpgrade; /* 固件升级数据 */ tcp_file_operation_data_t fileOperation; /* 文件操作数据 */ tcp_fault_info_request_t faultInfo; /* 故障信息请求 */ tcp_history_operations_data_t historyOperations; /* 历史记录查询/清除 */ tcp_custom_data_t customData; /* CustomData数据 */ } data; } tcp_message_t; /* 函数声明 */ /** * @brief 生成当前时间戳字符串 * @param buffer 缓冲区 * @param size 缓冲区大小 * @retval 0成功,-1失败 */ int tcp_generate_timestamp(char *buffer, uint32_t size); /** * @brief 生成心跳消息JSON * @param sequence 序列号 * @param source 来源字符串 * @param buffer 输出缓冲区 * @param size 缓冲区大小 * @retval JSON字符串长度,-1表示失败 */ int tcp_generate_heartbeat_json(uint32_t sequence, const char *source, char *buffer, uint32_t size); /** * @brief 生成系统信息消息JSON * @param systemInfo 系统信息结构体指针 * @param buffer 输出缓冲区 * @param size 缓冲区大小 * @retval JSON字符串长度,-1表示失败 */ int tcp_generate_system_info_json(const tcp_system_info_data_t *systemInfo, char *buffer, uint32_t size); /** * @brief 生成充电枪数据消息JSON * @param gunData 充电枪数据结构体指针 * @param buffer 输出缓冲区 * @param size 缓冲区大小 * @retval JSON字符串长度,-1表示失败 */ int tcp_generate_gun_data_json(const tcp_gun_data_t *gunData, char *buffer, uint32_t size); /** * @brief 解析接收到的JSON消息 * @param json JSON字符串 * @param message 输出消息结构体 * @retval 0成功,-1失败 */ int tcp_parse_json_message(const char *json, tcp_message_t *message); /** * @brief 释放消息结构体中分配的内存 * @param message 消息结构体指针 */ void tcp_free_message(tcp_message_t *message); /** * @brief 处理接收到的消息 * @param message 消息结构体指针 * @retval 0成功,-1失败 */ int tcp_process_received_message(const tcp_message_t *message); /** * @brief 获取默认系统信息 * @param systemInfo 输出系统信息结构体 */ void tcp_get_default_system_info(tcp_system_info_data_t *systemInfo); /** * @brief 获取默认充电枪数据 * @param gunData 输出充电枪数据结构体 * @param gunNumber 枪编号 (1-2) */ void tcp_get_default_gun_data(tcp_gun_data_t *gunData, uint8_t gunNumber); int system_data_stop_charge(uint8_t gunNumber, char *message); int system_data_start_charge(uint8_t gunNumber, const char *userId, const char *orderNumber, char *message); /* 参数查询相关函数 */ int tcp_generate_param_query_response(const tcp_param_query_response_t *response, char *buffer, uint32_t size); int tcp_generate_param_modify_response(const tcp_param_modify_response_t *response, char *buffer, uint32_t size); int tcp_process_param_query(const tcp_param_query_request_t *request, tcp_param_query_response_t *response); int tcp_process_param_modify(const tcp_param_modify_request_t *request, tcp_param_modify_response_t *response); /* 固件升级相关函数 */ void tcp_firmware_upgrade_log_io(const char *dir, const char *data, uint32_t len); void tcp_firmware_upgrade_log_buf(const char *dir, const uint8_t *data, uint32_t len); void tcp_firmware_upgrade_log_meta(const char *tag, uint32_t a, uint32_t b, uint32_t c, uint32_t d); int tcp_generate_firmware_upgrade_json(const tcp_firmware_upgrade_data_t *firmwareUpgrade, const char *subCommand, char *buffer, uint32_t size); int tcp_process_firmware_upgrade(const tcp_firmware_upgrade_data_t *firmwareUpgrade); /* 文件操作相关函数 */ int tcp_generate_file_query_response(const tcp_file_query_response_t *response, char *buffer, uint32_t size); int tcp_generate_file_delete_response(const tcp_file_delete_response_t *response, char *buffer, uint32_t size); int tcp_generate_file_download_response(const tcp_file_download_response_t *response, char *buffer, uint32_t size); int tcp_generate_file_upload_response(const tcp_file_upload_response_t *response, char *buffer, uint32_t size); int tcp_process_file_operation(const tcp_file_operation_data_t *fileOperation); /* CustomData相关函数 */ int tcp_generate_custom_data_json(const tcp_custom_data_t *customData, char *buffer, uint32_t size); /* TCP调试打印宏定义 */ #ifndef TCP_DEBUG_PRINT #define TCP_DEBUG_PRINT 0 /* 默认使能调试打印 */ #endif #if TCP_DEBUG_PRINT #define TCP_PRINT(fmt, ...) printf("[TCP] " fmt, ##__VA_ARGS__) #define TCP_PRINT_RAW(fmt, ...) printf(fmt, ##__VA_ARGS__) #define TCP_PRINT_RAW_DATA(data, len) do { \ if ((data) != NULL && (len) > 0) { \ char *buf = (char *)pvPortMalloc((len) + 1); \ if (buf != NULL) { \ memcpy(buf, (data), (len)); \ buf[(len)] = '\0'; \ TCP_PRINT("RECV RAW DATA: %s\r\n", buf); \ vPortFree(buf); \ } \ } \ } while(0) #define TCP_PRINT_RAW_SEND(data, len) do { \ if ((data) != NULL && (len) > 0) { \ char *buf = (char *)pvPortMalloc((len) + 1); \ if (buf != NULL) { \ memcpy(buf, (data), (len)); \ buf[(len)] = '\0'; \ TCP_PRINT("SEND RAW DATA: %s\r\n", buf); \ vPortFree(buf); \ } \ } \ } while(0) #else #define TCP_PRINT(fmt, ...) do {} while(0) #define TCP_PRINT_RAW(fmt, ...) do {} while(0) #define TCP_PRINT_RAW_DATA(data, len) do {} while(0) #define TCP_PRINT_RAW_SEND(data, len) do {} while(0) #endif #ifdef __cplusplus } #endif #endif /* __TCP_PROTOCOL_H */