# TCP调试服务器通信协议说明 ## 协议概述 本协议用于CCU601E充电桩TCP调试服务器与客户端之间的通信。协议基于JSON格式,包含心跳、系统信息、充电枪数据、充电控制、参数查询与修改等功能。 ## 基本协议格式 所有消息遵循以下基本格式: ```json { "command": "命令类型", "data": { ... }, "timestamp": "YYYY-MM-DD HH:MM:SS.000", "version": "2.0" } ``` 字段说明: - `command`: 命令类型(字符串) - `data`: 命令数据(对象) - `timestamp`: 时间戳,格式为"YYYY-MM-DD HH:MM:SS.000" - `version`: 协议版本,固定为"2.0" ## 命令类型列表 | 命令 | 值 | 说明 | |------|-----|------| | 心跳 | Heartbeat | 心跳消息,用于保持连接 | | 系统信息 | SystemInfo | 系统信息查询/上报 | | 枪信息 | GunInfo | 充电枪数据查询/上报 | | 充电控制 | ChargeControl | 充电启停控制 | | 参数查询 | ParamQuery | 参数查询 | | 参数修改 | ParamModify | 参数修改 | | 文件操作 | FileOperations | 文件系统操作(查询、删除、下载、上传) | ## 1. 心跳消息 (Heartbeat) ### 1.1 服务器发送心跳 ```json { "command": "Heartbeat", "data": { "sequence": 123, "source": "device" }, "timestamp": "2025-12-27 14:48:27.000", "version": "2.0" } ``` 字段说明: - `sequence`: 序列号,每次递增 - `source`: 来源,固定为"device" ### 1.2 客户端回复心跳 ```json { "command": "Heartbeat", "data": { "sequence": 123, "source": "client" }, "timestamp": "2025-12-27 14:48:27.100", "version": "2.0" } ``` ## 2. 系统信息 (SystemInfo) ### 2.1 服务器发送系统信息 ```json { "command": "SystemInfo", "data": { "systemModel": "IES-2000", "gunCount": 2, "devicePower": 120.0, "networkStatus": 1, "faultCount": 0, "version": "V1.2.3" }, "timestamp": "2025-12-27 14:48:28.000", "version": "2.0" } ``` 字段说明: - `systemModel`: 系统型号 - `gunCount`: 枪数量 - `devicePower`: 设备功率(kW) - `networkStatus`: 网络状态(0:异常, 1:正常) - `faultCount`: 故障数量 - `version`: 软件版本 ## 3. 充电枪信息 (GunInfo) ### 3.1 服务器发送枪信息 ```json { "command": "GunInfo", "data": { "gunNumber": 1, "chargingStatus": 2, "gunConnectionStatus": 1, "chargingTime": 125, "demandVoltage": 400.0, "demandCurrent": 32.0, "actualVoltage": 398.5, "actualCurrent": 30.2, "energy": 15.7, "cost": 31.4, "batterySOC": 65.0, "userId": "user001", "orderNumber": "ORD20231227001" }, "timestamp": "2025-12-27 14:48:29.000", "version": "2.0" } ``` 字段说明: - `gunNumber`: 枪编号(1-2) - `chargingStatus`: 充电状态(0:空闲, 1:已连接, 2:充电中, 3:充电完成, 4:故障) - `gunConnectionStatus`: 枪连接状态(0:未连接, 1:已连接) - `chargingTime`: 充电时间(分钟) - `demandVoltage`: 需求电压(V) - `demandCurrent`: 需求电流(A) - `actualVoltage`: 实际电压(V) - `actualCurrent`: 实际电流(A) - `energy`: 充电能量(kWh) - `cost`: 充电费用(元) - `batterySOC`: 电池SOC(%) - `userId`: 用户ID - `orderNumber`: 订单号 ## 4. 充电控制 (ChargeControl) ### 4.1 客户端发送充电控制 ```json { "command": "ChargeControl", "data": { "gunNumber": 1, "action": 1 }, "timestamp": "2025-12-27 14:48:30.000", "version": "2.0" } ``` 字段说明: - `gunNumber`: 枪编号(1-2) - `action`: 动作(0:停止充电, 1:启动充电) ### 4.2 服务器响应充电控制 ```json { "command": "ChargeControl", "data": { "gunNumber": 1, "action": 1, "result": 0, "message": "充电启动成功" }, "timestamp": "2025-12-27 14:48:30.500", "version": "2.0" } ``` 字段说明: - `result`: 结果(0:成功, 1:失败) - `message`: 结果消息 ## 5. 参数查询与修改 ### 5.1 参数分类(type字段) | 类型 | 值 | 说明 | |------|-----|------| | 系统基本参数 | BasicParameters | 桩编号、功率、电压电流等 | | 网络参数 | NetworkParameters | IP、域名、平台配置等 | | 电表参数 | MeterParameters | 电表数量、归属、地址等 | | 使能参数 | EnableParameters | 门禁、枪锁、国标等使能标志 | | 费率参数 | FeeParameters | 计费模型、费率类型等 | | SDK参数 | SDKParameters | 产品秘钥、设备密钥等 | | 二维码参数 | QRCodeParameters | 各枪二维码内容 | ### 5.2 参数查询请求 ```json { "command": "ParamQuery", "data": { "type": "BasicParameters" }, "timestamp": "2025-12-27 14:48:31.000", "version": "2.0" } ``` ### 5.3 参数查询响应 ```json { "command": "ParamQuery", "data": { "type": "BasicParameters", "count": 18, "params": [ { "name": "pile_serial_num", "type": "string", "value": "CCU601E-001" }, { "name": "u8_gunCnt", "type": "uint8", "value": 2 } ] }, "timestamp": "2025-12-27 14:48:31.500", "version": "2.0" } ``` 字段说明: - `count`: 参数总数 - `params`: 参数数组 - `name`: 参数名称 - `type`: 参数类型 - `value`: 参数值 ### 5.4 参数修改请求 ```json { "command": "ParamModify", "data": { "type": "BasicParameters", "params": [ { "name": "pile_serial_num", "type": "string", "value": "CCU601E-002" }, { "name": "u8_threshold_gunTemp", "type": "int", "value": 85 } ] }, "timestamp": "2025-12-27 14:48:32.000", "version": "2.0" } ``` ### 5.5 参数修改响应 ```json { "command": "ParamModify", "data": { "type": "BasicParameters", "received": 2, "processed": 2, "success": 2, "failed": 0 }, "timestamp": "2025-12-27 14:48:32.500", "version": "2.0" } ``` 字段说明: - `received`: 接收到的参数数量 - `processed`: 已处理的参数数量 - `success`: 成功的参数数量 - `failed`: 失败的参数数量 ## 6. 参数详细列表 ### 6.1 BasicParameters(系统基本参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | pile_serial_num | string | 桩编号 | "CCU601E-001" | | u8_pwd | string | 维护密码 | "123456" | | u8_gunCnt | uint8 | 枪数量 | 2 | | u8_pile_type | uint8 | 桩类型 | 1 | | u8_terminal | uint8_array | 终端地址 | [0, 0] | | e_ledType | uint8 | 灯板类型 | 0 | | u8_threshold_gunTemp | uint8 | 枪温阈值(°C) | 90 | | u8_soc_limit | uint8 | SOC阈值(%) | 100 | | u16_ratePow | uint32 | 额定功率(W) | 120000 | | u16_max_volt | uint16 | 最大电压(0.1V) | 10000 | | u16_min_volt | uint16 | 最小电压(0.1V) | 2000 | | u16_trickle_limit | uint16 | 涓流充电停机阈值(0.1A) | 100 | | u16_max_cur | uint16 | 最大电流(0.1A) | 2500 | | u8_mdu_num | uint8 | 充电模块数量 | 4 | | u8_MduType | uint8 | 模块类型 | 1 | | u8_mduTemp_flag | uint8 | 模块温度获取使能 | 1 | | u8_mdu_rated_pow | uint8 | 模块额定功率(kW) | 30 | | u16_mdu_max_vol | uint16 | 模块最大电压(0.1V) | 10000 | | u16_mdu_max_cur | uint16 | 模块最大电流(0.1A) | 3000 | ### 6.2 NetworkParameters(网络参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | ethIp | array | IP地址(4字节数组) | [192,168,1,140] | | ethGate | array | 网关(4字节数组) | [192,168,1,254] | | ethMask | array | 子网掩码(4字节数组) | [255,255,255,0] | | ethMac | array | MAC地址(6字节数组) | [0,14,234,3,165,1] | | serverADomain | string | 服务器A域名 | "39.104.96.26,8897" | | serverBDomain | string | 服务器B域名 | "" | | platAPileNum | string | 平台1桩编号 | "" | | platBPileNum | string | 平台2桩编号 | "" | | programType | bit | 程序类型(2位) 0:社会,1:sdk,2:ocpp | 0b00 | | netAType | bit | 平台1联网方式(2位) 0:以太网,1:GPRS | 0b00 | | netBType | bit | 平台2联网方式(2位) 0:以太网,1:GPRS | 0b00 | | platAEn | bit | 平台1使能(2位) 0:不使能,1:使能 | 0b01 | | platBEn | bit | 平台2使能(2位) 0:不使能,1:使能 | 0b01 | | platAType | bit | 平台1类型(4位) 0:云快充,1:... | 0b0000 | | platBType | bit | 平台2类型(4位) 默认积成平台 | 0b0000 | | simAnpType | bit | SIM卡APN类型(2位) 0:公网卡,1:国网移动,2:国网联通,3:国网电信 | 0b00 | ### 6.3 MeterParameters(电表参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | u8_meter_num | uint8 | 电表数量(0-4) | 2 | | meter_0_inGun | uint8 | 电表0归属枪号(0:无效,1:A枪,2:B枪) | 1 | | meter_0_highPrec | uint8 | 电表0高精度支持(0:不支持,1:支持) | 1 | | meter_0_isAC | uint8 | 电表0是否为交流表(0:直流表,1:交流表) | 0 | | meter_0_addr | hex_array | 电表0地址(6字节) | "00 00 00 00 00 00" | | meter_1_inGun | uint8 | 电表1归属枪号 | 2 | | meter_1_highPrec | uint8 | 电表1高精度支持 | 1 | | meter_1_isAC | uint8 | 电表1是否为交流表 | 0 | | meter_1_addr | hex_array | 电表1地址 | "00 00 00 00 00 00" | | meter_2_inGun | uint8 | 电表2归属枪号 | 1 | | meter_2_highPrec | uint8 | 电表2高精度支持 | 0 | | meter_2_isAC | uint8 | 电表2是否为交流表 | 1 | | meter_2_addr | hex_array | 电表2地址 | "00 00 00 00 00 00" | | meter_3_inGun | uint8 | 电表3归属枪号 | 2 | | meter_3_highPrec | uint8 | 电表3高精度支持 | 0 | | meter_3_isAC | uint8 | 电表3是否为交流表 | 1 | | meter_3_addr | hex_array | 电表3地址 | "00 00 00 00 00 00" | ### 6.4 EnableParameters(使能参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | bit_doorEnable | uint8 | 门禁使能 | 0 | | bit_gunLockEna | uint8 | 枪锁使能 | 1 | | bit_gunLockNeg | uint8 | 枪锁信号取反 | 0 | | bit_AcContactEna | uint8 | 交流接触器使能 | 1 | | bit_gunHoming | uint8 | 枪归位信号有无 | 1 | | bit_GBEnable | uint8 | 国标使能 | 1 | | bit_LcdEnable | uint8 | 液晶使能 | 1 | | bit_auxpower | uint8 | 辅助电压返回状态使能 | 0 | | bit_reliefen | uint8 | 泄放使能 | 1 | | bit_YeLenEn | uint8 | 液冷通讯使能 | 0 | | bit_ABcommEn | uint8 | 主副班通讯使能 | 0 | | bit_ScreenSaverEn | uint8 | UI屏保使能 | 1 | | bit_PlugEn | uint8 | 即插即充使能 | 0 | | bit_uiEnglishEn | uint8 | UI界面英语使能 | 0 | ### 6.5 FeeParameters(费率参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | u8_model_no | string | 计费模型编号(17字节) | "FEE20231227001" | | u8_feeCnt | uint8 | 费率条数(0-30) | 5 | | fee_type_0_rate | uint32 | 费率类型0费率(小数点后5位) | 15000 | | fee_type_0_sevice | uint32 | 费率类型0服务费(小数点后5位) | 500 | | fee_type_1_rate | uint32 | 费率类型1费率 | 18000 | | fee_type_1_sevice | uint32 | 费率类型1服务费 | 600 | | fee_type_2_rate | uint32 | 费率类型2费率 | 20000 | | fee_type_2_sevice | uint32 | 费率类型2服务费 | 700 | | ... | ... | ... | ... | | fee_type_29_rate | uint32 | 费率类型29费率 | 0 | | fee_type_29_sevice | uint32 | 费率类型29服务费 | 0 | | u8_fee_type_0 | uint8 | 时段0费率类型(1-30) | 1 | | u8_fee_type_1 | uint8 | 时段1费率类型 | 1 | | u8_fee_type_2 | uint8 | 时段2费率类型 | 1 | | ... | ... | ... | ... | | u8_fee_type_95 | uint8 | 时段95费率类型 | 3 | ### 6.6 SDKParameters(SDK参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | product_key | string | 产品秘钥(20字节) | "" | | device_name | string | 资产码(32字节) | "" | | device_secret | string | 设备密钥(64字节) | "" | | device_reg_code | string | 注册码(64字节) | "" | | device_uid | string | 出厂编码(64字节) | "" | | firmware_version | string | 固件版本信息(64字节) | "V1.0.0" | ### 6.7 QRCodeParameters(二维码参数) | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | qrcode_gun1 | string | 枪1二维码 | "https://example.com/qr/001" | | qrcode_gun2 | string | 枪2二维码 | "https://example.com/qr/002" | ## 7. 文件操作 (FileOperations) 文件操作用于上位机对单片机文件系统进行操作,包含查询、删除、下载、上传四种操作。 ### 7.1 文件操作子命令 | 子命令 | 值 | 说明 | |--------|-----|------| | 文件查询 | Query | 查询指定目录下的文件列表 | | 文件删除 | Delete | 删除指定文件 | | 文件下载 | Download | 下载文件内容 | | 文件上传 | Upload | 上传文件到设备 | ### 7.2 文件查询请求 ```json { "command": "FileOperations", "data": { "subCommand": "Query", "path": "/", "recursive": 0 }, "timestamp": "2025-12-29 14:00:00.000", "version": "2.0" } ``` 字段说明: - `subCommand`: 子命令,固定为"Query" - `path`: 查询路径,如"/"表示根目录 - `recursive`: 是否递归查询(0:否, 1:是) ### 7.3 文件查询响应 ```json { "command": "FileOperations", "data": { "subCommand": "Query", "path": "/", "fileCount": 3, "dirCount": 2, "totalSize": 1050624, "files": [ { "name": "config.txt", "type": 0, "size": 1024, "modifiedTime": "2025-12-29 10:00:00", "createdTime": "2025-12-29 10:00:00" }, { "name": "log.txt", "type": 0, "size": 2048, "modifiedTime": "2025-12-29 11:30:00", "createdTime": "2025-12-29 11:30:00" }, { "name": "firmware.bin", "type": 0, "size": 1048576, "modifiedTime": "2025-12-29 12:00:00", "createdTime": "2025-12-29 12:00:00" } ] }, "timestamp": "2025-12-29 14:00:00.500", "version": "2.0" } ``` 字段说明: - `fileCount`: 文件数量 - `dirCount`: 目录数量 - `totalSize`: 总文件大小(字节) - `files`: 文件信息数组 - `name`: 文件名 - `type`: 文件类型(0:普通文件, 1:目录, 2:系统文件) - `size`: 文件大小(字节) - `modifiedTime`: 修改时间 - `createdTime`: 创建时间 ### 7.4 文件删除请求 文件删除请求支持两种格式: #### 格式1:直接指定完整路径 ```json { "command": "FileOperations", "data": { "subCommand": "Delete", "path": "/config.txt", "force": 0 }, "timestamp": "2025-12-29 14:01:00.000", "version": "2.0" } ``` #### 格式2:指定路径和文件名(推荐格式) ```json { "command": "FileOperations", "data": { "subCommand": "Delete", "fileName": "20260104_143116.log", "path": "/log", "force": 0 }, "timestamp": "2026-01-04 15:06:04.630", "version": "2.0" } ``` 字段说明: - `subCommand`: 子命令,固定为"Delete" - `path`: 文件路径(格式1)或目录路径(格式2) - `fileName`: 文件名(仅格式2需要) - `force`: 强制删除(0:否, 1:是),可选字段,默认为0 **注意**: 1. 格式1中,`path`字段包含完整的文件路径(如`/config.txt`) 2. 格式2中,`path`字段为目录路径,`fileName`为文件名,系统会自动组合为完整路径:`path + "/" + fileName` 3. 如果同时提供`path`和`fileName`字段,优先使用格式2(组合路径) 4. `force`字段为可选字段,默认为0(不强制删除)。当设置为1时,允许删除系统文件 ### 7.5 文件删除响应 ```json { "command": "FileOperations", "data": { "subCommand": "Delete", "path": "/config.txt", "status": 0, "message": "File deleted successfully" }, "timestamp": "2025-12-29 14:01:00.500", "version": "2.0" } ``` 字段说明: - `status`: 删除状态(0:成功, 1:失败, 3:文件未找到, 5:权限不足) - `message`: 结果消息 ### 7.6 文件下载请求 ```json { "command": "FileOperations", "data": { "subCommand": "Download", "path": "/log.txt", "offset": 0, "chunkSize": 1024 }, "timestamp": "2025-12-29 14:02:00.000", "version": "2.0" } ``` 字段说明: - `subCommand`: 子命令,固定为"Download" - `path`: 文件路径 - `offset`: 起始偏移(字节),用于断点续传。首次下载设置为0 - `chunkSize`: 分块大小(字节),最大1024字节,超过1024会自动限制为1024 **下载流程说明**: 1. 客户端首次请求时,设置`offset=0`,`chunkSize`建议设置为1024(最大支持值) 2. 服务器返回文件的第一块数据,包含`fileSize`(文件总大小)和`isLastChunk`标志 3. 客户端根据返回的`dataLen`计算下一次请求的偏移:`offset = offset + dataLen` 4. 重复步骤1-3,直到`isLastChunk=1`表示下载完成 5. 如果下载中断,可以从上次的偏移位置继续下载(断点续传) ### 7.7 文件下载响应 ```json { "command": "FileOperations", "data": { "subCommand": "Download", "path": "/log.txt", "fileSize": 2048, "offset": 0, "chunkSize": 1024, "dataLen": 11, "isLastChunk": 0, "data": "SGVsbG8gV29ybGQ=" }, "timestamp": "2025-12-29 14:02:00.500", "version": "2.0" } ``` 字段说明: - `fileSize`: 文件总大小(字节) - `offset`: 当前数据块的起始偏移(字节) - `chunkSize`: 实际使用的分块大小(字节),可能与请求的chunkSize不同(受1024字节限制) - `dataLen`: Base64编码后的数据长度(字节) - `isLastChunk`: 是否为最后一块(0:否, 1:是)。当`offset + dataLen >= fileSize`时为1 - `data`: 数据内容(Base64编码)。实际二进制数据大小为`dataLen`字节,Base64编码后长度约为`dataLen * 4/3` **技术细节**: 1. **分块限制**:每块数据最大1024字节。如果请求的`chunkSize`超过1024,会自动限制为1024 2. **Base64编码**:所有文件数据都使用Base64编码传输,确保二进制数据的安全传输 3. **进度计算**:下载进度可通过公式计算:`进度 = (offset + dataLen) / fileSize * 100%` 4. **错误处理**: - 如果文件不存在,返回错误 - 如果`offset`超过文件大小,返回错误 - 如果读取文件失败,返回错误 5. **内存管理**:客户端需要及时释放接收到的数据内存,避免内存泄漏 ### 7.8 文件上传请求 ```json { "command": "FileOperations", "data": { "subCommand": "Upload", "path": "/upload/newfile.txt", "fileSize": 4096, "chunkSize": 1024, "offset": 0, "data": "SGVsbG8gV29ybGQ=", "dataLen": 11, "isLastChunk": 0 }, "timestamp": "2025-12-29 14:03:00.000", "version": "2.0" } ``` 字段说明: - `subCommand`: 子命令,固定为"Upload" - `path`: 文件路径 - `fileSize`: 文件总大小 - `chunkSize`: 分块大小 - `offset`: 当前偏移 - `data`: 数据内容(Base64编码) - `dataLen`: 数据长度 - `isLastChunk`: 是否为最后一块(0:否, 1:是) ### 7.9 文件上传响应 ```json { "command": "FileOperations", "data": { "subCommand": "Upload", "path": "/upload/newfile.txt", "receivedSize": 1024, "totalSize": 4096, "status": 2, "message": "Upload in progress" }, "timestamp": "2025-12-29 14:03:00.500", "version": "2.0" } ``` 字段说明: - `receivedSize`: 已接收大小 - `totalSize`: 文件总大小 - `status`: 上传状态(0:成功, 1:失败, 2:进行中, 4:空间不足) - `message`: 结果消息 ### 7.10 文件操作状态码 | 状态码 | 值 | 说明 | |--------|-----|------| | 成功 | 0 | 操作成功 | | 失败 | 1 | 操作失败 | | 进行中 | 2 | 操作进行中(适用于上传/下载) | | 文件未找到 | 3 | 文件不存在 | | 空间不足 | 4 | 磁盘空间不足 | | 权限不足 | 5 | 权限不足 | ## 8. 数据类型说明 | 类型 | 说明 | 示例 | |------|------|------| | string | 字符串 | "CCU601E-001" | | int | 整数 | 85 | | uint8 | 无符号8位整数 | 2 | | uint16 | 无符号16位整数 | 2500 | | uint32 | 无符号32位整数 | 120000 | | ip_address | IP地址字符串 | "192.168.1.140" | | mac_address | MAC地址字符串 | "00:0E:EA:03:A5:01" | | hex_array | 十六进制数组字符串 | "00 00 00 00 00 00" | | uint8_array | 无符号8位整数数组 | [1,1,1,2,2,2,3,3,3] | ## 8. 通信流程 ### 8.1 连接建立 1. 客户端连接TCP服务器(端口9699) 2. 服务器接受连接(仅允许一个客户端) 3. 开始周期性通信 ### 8.2 周期性消息 - 心跳:每10秒发送一次 - 系统信息:每10秒发送一次 - 充电枪数据:每1秒发送一次(两把枪分别发送) ### 8.3 心跳超时 - 客户端超过60秒未发送心跳,服务器主动断开连接 ### 8.4 命令交互 1. 客户端发送命令请求 2. 服务器处理命令并返回响应 3. 错误时返回相应的错误信息 ## 9. 错误处理 ### 9.1 通用错误格式 ```json { "command": "原命令", "data": { "error": { "code": 1001, "message": "错误描述" } }, "timestamp": "2025-12-27 14:48:33.000", "version": "2.0" } ``` ### 9.2 错误码定义 | 错误码 | 说明 | |--------|------| | 1000 | 参数解析错误 | | 1001 | 命令不支持 | | 1002 | 参数缺失 | | 1003 | 参数值无效