Initial commit: CCU621_M firmware project with BLE debug link support.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 17:28:36 +08:00
commit 9ceb218f80
1597 changed files with 724159 additions and 0 deletions
+489
View File
@@ -0,0 +1,489 @@
/**
******************************************************************************
* @file tcp_protocol.h
* @brief TCP通信协议解析头文件
******************************************************************************
*/
#ifndef __TCP_PROTOCOL_H
#define __TCP_PROTOCOL_H
#include <stdint.h>
#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 */