Appearance
4G充电桩开放协议 V1.0(正式首版)
2026-09-07。以 NCS10-A 十路设备为本次实现对象。协议版本与固件版本分别管理。
实现状态:NCS10-A 源码 000.000.012 与本地 MQTT 工具已接入 R/E/F/S 格式;主机验证通过;2026-09-07 实机日志已验证编号原值上报、查询、参数/费率设置及开启参数回显。完整计费、自停、断电恢复与存储容量仍需专项验收。旧五字段固件不支持本页扩展指令。
此前的 V1.1 是试验版存档,不用于正式接入。原未使用的试验版 V1.0 已撤下;V2.0 方案不继续采用。本版是正式协议第一次编号,不按历史试验版本的数字排序。
1 协议基础
1.1 通信链路
注册平台通过 #LOGIN-RETURN 分配业务 MQTT 参数,productCategory=5 选择开放协议。已经保存有效业务配置时,业务断线只重连业务服务器,不因此重新注册。注册参数接收后直接切换业务连接。
设备仅在注册信息指定的下行 Topic 执行命令;上行 Topic 用于设备回复和上报。平台可以监听两个 Topic,但不能把设备回复重新作为下行指令发送。
NCS10-A 当前业务传输使用 AES-128-CBC、PKCS7 补齐、16 字节全零 IV;密钥按注册配置生成,密文按十六进制文本传输。本文展示的是加密前原文。不要用其他设备或 Demo 的密钥代替当前注册配置。
1.2 数据结构与约定
idx:请求序号,十进制整数 0~65535,响应原样对应。重发同一请求沿用原序号。订单是否重复以端口和订单号判断,不能仅按序号判断。port:端口号,NCS10-A 为 1~10;平台先查询实际端口数量。order:1~30 个英文字母、数字、下划线或短横线;不能是0。平台必须为每个新订单生成新编号,不得在确认清除后复用旧编号。- 费率单价:整数厘(1 元 = 1000 厘);金额及账单:整数分;电量:整数 Wh;时长:整数分钟。开始金额为 1~2147483647 分。
state:0 空闲;1 充电中;3 已停止、等待平台确认。端口查询的 2 表示端口参数错误。rateHash本版暂不启用,不发送、不校验。费率编号用于标识配置,不表示内容摘要。
1.3 数据类型
| 类型 | 含义 | 说明 |
|---|---|---|
| Number | 十进制整数 | 金额、时间、功率、序号等;按对应字段的范围和单位使用 |
| String | 字符串 | 指令名、订单号、计费方式等 |
| List | 参数组或列表 | 字段间用逗号,组内按各指令定义分隔;表格中的竖线就是报文分隔符 |
2 设备上行指令
2.1 设备注册 #REGISTER
设备 → 平台:业务连接就绪后上报设备信息。
报文格式:#REGISTER,idx,sn,imei,imsi,iccid,firmware,1,portCount,rateModelId,fullSwitch,fullPower,fullDelay,maxPower,totalMaxPower,maxMinutes,4
示例报文:
text
#REGISTER,1,123456789012345,864793080430288,460047661234567,89860846123456789000,000.000.012,1,10,1,1,10,60,15000,15000,900,4| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #REGISTER | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 1 | 0~65535;响应与请求序号一致 |
| 3 | 桩编号 sn | String | 是 | 123456789012345 | 1~15 位数字,原样保留(含前导零),不补零、不截断;SN 为 0 时使用 IMEI |
| 4 | IMEI | String | 是 | 864793080430288 | 15 字符;设备标识 |
| 5 | IMSI | String | 是 | 460047661234567 | 15 字符;SIM 信息 |
| 6 | ICCID | String | 是 | 89860846123456789000 | 20 字符;SIM 信息 |
| 7 | 固件版本 firmware | String | 是 | 000.000.012 | 与协议版本分别管理 |
| 8 | 设备类型 | Number | 是 | 1 | 固定为 1 |
| 9 | 端口数 portCount | Number | 是 | 10 | 本设备实际端口数量 |
| 10 | 费率编号 rateModelId | Number | 是 | 1 | 非负整数;此处为设备默认费率编号,不代表各端口订单费率 |
| 11 | 充满自停开关 fullSwitch | Number | 是 | 1 | 0 关闭,1 开启 |
| 12 | 充满功率 fullPower | Number | 是 | 10 | 非负整数,单位 W |
| 13 | 充满延时 fullDelay | Number | 是 | 60 | 单位秒;启用充满自停时必须大于 0 |
| 14 | 单端口过载阈值 maxPower | Number | 是 | 15000 | 大于 0,单位 W;设备安全限制 |
| 15 | 整桩过载阈值 totalMaxPower | Number | 是 | 15000 | 大于 0,单位 W;设备安全限制 |
| 16 | 最长时长 maxMinutes | Number | 是 | 900 | 大于 0,单位分钟;省略 S 的订单使用该默认值 |
| 17 | 心跳间隔 | Number | 是 | 4 | 固定 4 分钟 |
平台 → 设备:业务注册确认。
报文格式:#REGISTER,idx,1
示例报文:
text
#REGISTER,1,1| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #REGISTER | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 1 | 0~65535;响应与请求序号一致 |
| 3 | 确认结果 | Number | 是 | 1 | 仅作接入记录;当前设备不依靠该响应推进订单 |
sn/imei/imsi 各 15 字符,ICCID 20 字符;按固件组包规则补足或截取。平台的 #REGISTER,idx,1 当前仅作接入记录,设备不依靠它推进订单。
2.2 心跳 #HEARTBEAT
设备 → 平台:上报各端口运行状态。
报文格式:#HEARTBEAT,idx,sn,signal,rateModelId,portCount,port|state|power|balance,...
示例报文:
text
#HEARTBEAT,2,123456789012345,19,1,10,1|1|7200|100,2|0|0|0,3|0|0|0,4|0|0|0,5|0|0|0,6|0|0|0,7|0|0|0,8|0|0|0,9|0|0|0,10|0|0|0| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #HEARTBEAT | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 2 | 0~65535;响应与请求序号一致 |
| 3 | 桩编号 sn | String | 是 | 123456789012345 | 与注册报文使用相同编号;下发 SN 为 1~15 位数字,原样保留,不补零;例如 31082261 → 31082261;SN 为 0 时两种报文均使用 IMEI;非法编号拒绝接收,不截断 |
| 4 | 信号 signal | Number | 是 | 19 | 设备上报的信号值 |
| 5 | 费率编号 rateModelId | Number | 是 | 1 | 非负整数;此处为设备默认费率编号,不代表各端口订单费率 |
| 6 | 端口数 portCount | Number | 是 | 10 | 实际端口数量 |
| 7 | 端口数据组 | List | 是 | 1|1|7200|100 | 每个端口一组,各组以逗号分隔;数量与 portCount 一致 |
端口数据组:port|state|power|balance
| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 端口号 port | Number | 是 | 1 | 1~实际端口数 |
| 2 | 状态 state | Number | 是 | 1 | 0 空闲、1 充电、3 已停止待确认 |
| 3 | 功率 power | Number | 是 | 7200 | 单位 W×10,示例为 720 W |
| 4 | 余额 balance | Number | 是 | 100 | 整数分;非充电状态为 0,最终结果通过端口查询读取 |
注册、心跳及设备查询中的 rateModelId 表示设备默认费率编号,不能代表各端口订单实际费率;订单实际参数以开启回复或端口查询为准。
每个端口组为四个字段,功率单位 W×10。非充电状态心跳余额为 0;最终账单通过端口查询读取。配置心跳间隔固定 4 分钟,充电中调度按 1 分钟尝试上报。心跳不能作为最终结算依据。
2.3 自动停止 #AUTO-STOP
设备 → 平台:上报结束原因和最终结果。
报文格式:#AUTO-STOP,idx,reason,port,order,minutes,Wh,paid,elecFee,servFee,balance
示例报文:
text
#AUTO-STOP,3,1,1,ORD004,30,150,100,12,3,85| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #AUTO-STOP | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 3 | 0~65535;响应与请求序号一致 |
| 3 | 结束原因 reason | Number | 是 | 1 | 1 一般结束、2 拔出等完成情况、3 过载;详见下文 |
| 4 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 5 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
| 6 | 充电时长 minutes | Number | 是 | 30 | 本订单时长,整数分钟 |
| 7 | 充电电量 Wh | Number | 是 | 150 | 本订单电量,整数 Wh |
| 8 | 预付金额 paid | Number | 是 | 100 | 本订单预付金额,整数分 |
| 9 | 电费 elecFee | Number | 是 | 12 | 本订单电费,整数分 |
| 10 | 服务费 servFee | Number | 是 | 3 | 本订单服务费,整数分 |
| 11 | 剩余金额 balance | Number | 是 | 85 | 本订单余额,整数分 |
reason 沿用现有分组:1 一般结束(包括充满、余额用完或到时);2 拔出等完成情况;3 过载。当前映射不逐项区分所有内部原因,平台不得把 1 一律解释为充满。
与主动停止一样,平台保存最终结果后发送 #CHARGE-ACK。不再使用试验版 #AUTO-STOP 响应格式确认。重复上报按设备、端口、订单号合并,不重复生成账单。自动停止结果尚未成功保存时,设备仍须先断电;平台应通过端口查询核验并完成确认。
平台 → 设备:保存最终账单后使用第 3.10 节 #CHARGE-ACK 确认,不再使用试验版自停响应格式。
3 平台下行指令
3.1 开启充电 #CHARGE-START
平台 → 设备:开启指定端口订单。
使用默认参数
text
#CHARGE-START,指令序号,端口号,订单编号,预付金额text
#CHARGE-START,10,1,ORD001,100开启充电+费率参数+配置参数
text
#CHARGE-START,指令序号,端口号,订单编号,预付金额,R=费率编号,E=结束时间:电价|结束时间:电价|…,F=服务费方式|功率上限:单价|功率上限:单价|…,S=最长分钟数|充满自停开关|充满功率|持续秒数text
#CHARGE-START,13,1,ORD004,1000,R=1,E=0800:400|2200:800|2400:500,F=T|300:200|600:400|2200:600,S=900|1|10|60| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #CHARGE-START | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 13 | 0~65535;响应与请求序号一致 |
| 3 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 4 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
| 5 | 预付金额 amount | Number | 是 | 1000 | 单位分;开启请求为 1~2147483647 |
| 6 | 费率编号 R | Number | 可选 | R=1 | 非负整数;R、E、F 同时填写或同时省略;按 R、E、F、S 顺序,各最多一次;未知、重复、空值、缺项或多余字段返回 2;费率校验见第 3.6 节 |
| 7 | 电费参数 E | List | 可选 | E=0800:400|2200:800|2400:500 | 每项为 结束时间:电价,时段间用 | 分隔;按电量收费;新订单省略 R、E、F 时使用有效默认费率,否则返回 2 |
| 7.1 | 时段结束时间 | Number | 可选 | 0800 | HHMM;从 00:00 起连续分段;严格递增,最后为 2400 |
| 7.2 | 电价 | Number | 可选 | 400 | 正整数,厘/度;与前面的结束时间用 : 连接 |
| 8 | 服务费参数 F | List | 可选 | F=T|300:200|600:400|2200:600 | 收费方式|功率上限:单价|…;功率档与电费时段各自独立 |
| 8.1 | 服务费方式 | String | 可选 | T | T:按时间,厘/小时;E:按电量,厘/度 |
| 8.2 | 功率上限 | Number | 可选 | 300 | 正整数 W;严格递增;第一档含 0 和上限,后续档为大于前一上限且不超过本档上限 |
| 8.3 | 服务费单价 | Number | 可选 | 200 | 非负整数;单位由服务费方式决定;与功率上限用 : 连接 |
| 9 | 配置参数 S | List | 可选 | S=900|1|10|60 | 接在费率参数后;省略费率时接在金额后;四个字段用 | 分隔,填写时须完整;省略时使用有效的 maxTime、fullSwitch、fullPower、fullTime;缺少或非法则返回 2 |
| 9.1 | 最长时长 maxMinutes | Number | 可选 | 900 | 正整数分钟;换算秒后不超过 2147483647 |
| 9.2 | 充满自停 fullSwitch | Number | 可选 | 1 | 0 关闭,1 开启;关闭时功率、持续秒数填 0,使用默认配置时本订单这两项取 0 |
| 9.3 | 充满功率 fullPower | Number | 可选 | 10 | 非负整数 W;关闭充满自停时填 0 |
| 9.4 | 持续时间 fullDelay | Number | 可选 | 60 | 整数秒;开启时大于 0,关闭时填 0 |
设备 → 平台:开启结果
成功格式:#CHARGE-START,idx,port,order,1,R=费率编号,E=实际电费参数,F=实际服务费参数,S=实际配置参数
失败格式:#CHARGE-START,idx,port,order,result
成功示例:
text
#CHARGE-START,13,1,ORD004,1,R=1,E=0800:400|2200:800|2400:500,F=T|300:200|600:400|2200:600,S=900|1|10|60失败示例:
text
#CHARGE-START,13,1,ORD004,3| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #CHARGE-START | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 13 | 0~65535;响应与请求序号一致 |
| 3 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 4 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
| 5 | 执行结果 result | Number | 是 | 1 | 返回码见本指令说明 |
| 6 | 实际费率编号 R | Number | 成功必填 | R=1 | 原订单费率编号;格式见开启请求 |
| 7 | 实际电费参数 E | List | 成功必填 | E=0800:400|2200:800|2400:500 | 原订单电费时段与电价,单位厘/度;格式见开启请求 |
| 8 | 实际服务费参数 F | List | 成功必填 | F=T|300:200|600:400|2200:600 | 原订单服务费方式、功率档和单价;格式见开启请求 |
| 9 | 实际配置参数 S | List | 成功必填 | S=900|1|10|60 | 结果 1 时返回本订单固定配置参数;失败不追加 |
成功时完整返回实际采用的 R、E、F、S,格式与请求相同;重复开启返回原订单参数,平台保存返回值。
| result | 含义 | 说明 |
|---|---|---|
| 1 | 开启成功 | 包括充电中同订单、同金额且全部参数一致的重发;省略参数沿用原订单值,不改余额、不重新计费 |
| 2 | 参数错误 | 必填字段缺失、数值非法、可选参数不完整、没有有效默认配置,或同订单金额/费率/配置与原订单不同;不修改原订单 |
| 3 | 当前无法启动充电 | 其他订单占用、旧订单已结束待确认、订单保存失败或设备无法供电;不为本次请求开启供电,平台查询端口状态再处理 |
所有数值字段使用十进制整数,除已有更小限制外,不超过 2147483647。电费最多 10 个时段、服务费最多 10 个功率档、30 字符订单号,完整开启原文不得超过 1024 个 ASCII 字节(加密前);超限报文拒绝处理,不截断后执行。
3.2 停止充电 #CHARGE-STOP
平台 → 设备:停止指定订单。
报文格式:#CHARGE-STOP,idx,port,order
示例报文:
text
#CHARGE-STOP,5,1,ORD004| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #CHARGE-STOP | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 5 | 0~65535;响应与请求序号一致 |
| 3 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 4 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
设备 → 平台:成功返回最终结果。
报文格式:#CHARGE-STOP,idx,1,port,order,minutes,Wh,paid,elecFee,servFee,balance
示例报文:
text
#CHARGE-STOP,5,1,1,ORD004,30,150,100,12,3,85| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #CHARGE-STOP | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 5 | 0~65535;响应与请求序号一致 |
| 3 | 执行结果 result | Number | 是 | 1 | 返回码见本指令说明 |
| 4 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 5 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
| 6 | 充电时长 minutes | Number | 成功必填 | 30 | 本订单时长,整数分钟 |
| 7 | 充电电量 Wh | Number | 成功必填 | 150 | 本订单电量,整数 Wh |
| 8 | 预付金额 paid | Number | 成功必填 | 100 | 本订单预付金额,整数分 |
| 9 | 电费 elecFee | Number | 成功必填 | 12 | 本订单电费,整数分 |
| 10 | 服务费 servFee | Number | 成功必填 | 3 | 本订单服务费,整数分 |
| 11 | 剩余金额 balance | Number | 成功必填 | 85 | 本订单余额,整数分 |
失败格式:#CHARGE-STOP,idx,result,port,order
失败示例:#CHARGE-STOP,5,5,1,ORD004
| result | 说明 |
|---|---|
| 1 | 已停止并保存结束结果,返回最终明细 |
| 4 | 参数错误 |
| 5 | 订单不匹配 |
| 6 | 已断电,但结束状态保存失败 |
result=4 参数错误;5 订单不匹配;6 结束状态保存失败,此时继电器已经关闭,平台仍须保留异常状态并重试原订单停止或查询,不能当成结算完成。
3.3 查询设备 #DEVICE-QUERY
平台 → 设备:查询端口数量与状态。
报文格式:#DEVICE-QUERY,idx
示例报文:
text
#DEVICE-QUERY,6| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #DEVICE-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 6 | 0~65535;响应与请求序号一致 |
设备 → 平台:返回设备默认费率编号及端口状态。
报文格式:#DEVICE-QUERY,idx,rateModelId,portCount,state1,state2,...
示例报文:
text
#DEVICE-QUERY,6,1,10,1,0,0,0,0,0,0,0,0,0| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #DEVICE-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 6 | 0~65535;响应与请求序号一致 |
| 3 | 费率编号 rateModelId | Number | 是 | 1 | 非负整数;此处为设备默认费率编号,不代表各端口订单费率 |
| 4 | 端口数 portCount | Number | 是 | 10 | 实际端口数 |
| 5 | 端口 1 状态 state1 | Number | 是 | 1 | 0 空闲、1 充电、3 已停止待确认 |
| 6 | 后续端口状态 state2… | Number | 按端口数 | 0 | 每个端口一个逗号字段,状态总数与 portCount 一致 |
3.4 查询端口 #PORT-QUERY
平台 → 设备:查询订单状态、结果及实际参数。
报文格式:#PORT-QUERY,idx,port
示例报文:
text
#PORT-QUERY,7,1| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #PORT-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 7 | 0~65535;响应与请求序号一致 |
| 3 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
设备 → 平台:返回订单及实际参数。
报文格式:#PORT-QUERY,idx,state,port,order,minutes,Wh,paid,elecFee,servFee,balance[,R=费率编号,E=实际电费参数,F=实际服务费参数,S=实际配置参数]
示例报文:
text
#PORT-QUERY,7,1,1,ORD004,30,150,1000,12,10,978,R=1,E=0800:400|2200:800|2400:500,F=T|300:200|600:400|2200:600,S=900|1|10|60| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #PORT-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 7 | 0~65535;响应与请求序号一致 |
| 3 | 端口状态 state | Number | 是 | 1 | 0 空闲、1 充电、2 端口错误、3 已停止待确认 |
| 4 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 5 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
| 6 | 充电时长 minutes | Number | 是 | 30 | 本订单时长,整数分钟 |
| 7 | 充电电量 Wh | Number | 是 | 150 | 本订单电量,整数 Wh |
| 8 | 预付金额 paid | Number | 是 | 1000 | 本订单预付金额,整数分 |
| 9 | 电费 elecFee | Number | 是 | 12 | 本订单电费,整数分 |
| 10 | 服务费 servFee | Number | 是 | 10 | 本订单服务费,整数分 |
| 11 | 剩余金额 balance | Number | 是 | 978 | 本订单余额,整数分 |
| 12 | 实际费率编号 R | Number | 状态 1/3 必填 | R=1 | 原订单费率编号;格式见开启请求 |
| 13 | 实际电费参数 E | List | 状态 1/3 必填 | E=0800:400|2200:800|2400:500 | 原订单电费时段与电价,单位厘/度;格式见开启请求 |
| 14 | 实际服务费参数 F | List | 状态 1/3 必填 | F=T|300:200|600:400|2200:600 | 原订单服务费方式、功率档和单价;格式见开启请求 |
| 15 | 实际配置参数 S | List | 状态 1/3 必填 | S=900|1|10|60 | 原订单固定的自停条件;格式见第 3.1 节 |
文档新增约定:状态 1 或 3 时,尾部必须追加 ,R=费率编号,E=实际电费参数,F=实际服务费参数,S=实际配置参数,返回该订单固定参数,供开启回复丢失或重连后的核验。空闲或参数错误时保持基础字段,不追加参数组;不能用设备当前默认配置冒充历史订单参数。
状态 3 时,后续字段就是保留的最终结果。平台保存后发送 #CHARGE-ACK。状态 0、订单 0 表示空闲。状态 2 表示端口参数错误,不能当成空闲。
3.5 查询计费模型 #RATE-QUERY
平台 → 设备:查询设备默认费率。
报文格式:#RATE-QUERY,idx
示例报文:
text
#RATE-QUERY,8| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #RATE-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 8 | 0~65535;响应与请求序号一致 |
设备 → 平台:返回完整默认费率。
报文格式:#RATE-QUERY,idx,R=费率编号,E=电费参数,F=服务费参数
示例报文:
text
#RATE-QUERY,8,R=1,E=0800:400|2200:800|2400:500,F=T|300:200|600:400|2200:600| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #RATE-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 8 | 0~65535;响应与请求序号一致 |
| 3 | 费率编号 R | Number | 是 | R=1 | 非负整数;设备默认费率编号 |
| 4 | 电费参数 E | List | 是 | E=0800:400|2200:800|2400:500 | 结束时间:电价;电价单位厘/度;字段定义见第 3.1 节 |
| 5 | 服务费参数 F | List | 是 | F=T|300:200|600:400|2200:600 | 收费方式|功率上限:单价|…;T 为厘/小时,E 为厘/度;字段定义见第 3.1 节 |
无有效默认费率时返回 #RATE-QUERY,idx,2。
本响应不代表任何进行中订单的实际费率;查询订单参数使用第 3.4 节。rateHash 暂不启用。
3.6 设置计费模型 #RATE-SET
平台 → 设备:设置设备默认费率。
报文格式:#RATE-SET,idx,R=费率编号,E=电费参数,F=服务费参数
示例报文:
text
#RATE-SET,20,R=1,E=0800:400|2200:800|2400:500,F=T|300:200|600:400|2200:600| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #RATE-SET | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 20 | 0~65535;响应与请求序号一致 |
| 3 | 费率编号 R | Number | 是 | R=1 | 非负整数;设备默认费率编号 |
| 4 | 电费参数 E | List | 是 | E=0800:400|2200:800|2400:500 | 结束时间:电价;电价单位厘/度;字段定义见第 3.1 节 |
| 5 | 服务费参数 F | List | 是 | F=T|300:200|600:400|2200:600 | 收费方式|功率上限:单价|…;T 为厘/小时,E 为厘/度;字段定义见第 3.1 节 |
设备 → 平台:返回设置结果。
报文格式:#RATE-SET,idx,result
示例报文:
text
#RATE-SET,20,1| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #RATE-SET | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 20 | 0~65535;响应与请求序号一致 |
| 3 | 执行结果 result | Number | 是 | 1 | 返回码见本指令说明 |
| result | 说明 |
|---|---|
| 1 | 接受 |
| 2 | 数据非法 |
| 3 | 保留;数量非法统一返回 2 |
| 4 | 保存失败,原默认费率不变 |
| 校验及计费项目 | 规则 |
|---|---|
| 参数完整性 | R、E、F 均必填且只出现一次,按此顺序排列;每个价格条目恰有两个整数,以 : 分隔;拒绝空项、缺项、未知参数及多余字段 |
| 数量上限 | 电费时段和服务费功率档分别为 1~10 项,按实际条目计算,不另传数量;两者数量可以不同 |
| 电费时间 | HHMM 严格递增,最后必须为 2400;其余时间小时为 0~23、分钟为 0~59,结束时间不得为 0000;各段左闭右开,24:00 后从首段循环 |
| 电费单价 | 正整数厘/度;按各时段实际用电量分别计算,跨时段不使用同一电价计算整笔订单 |
| 服务费功率档 | 上限为正整数 W 且严格递增;按当前计费区间功率匹配,等于上限归入该档;最高档须覆盖设备允许的端口功率范围,不允许无价格区间 |
| 服务费单价 | 非负整数;T 按对应档位内的实际供电时间计费,单位厘/小时;E 按对应档位内的实际用电量计费,单位厘/度;功率变化不追溯重算之前费用 |
| 金额精度 | 预付金额、余额和账单仍为整数分;费率按厘计算并保留不足一分的累计值,电费和服务费各自累计后向下取整到分,不逐个计费区间取整;余额按预付金额减两项累计分值计算 |
| 数值范围 | 所有数值均为十进制整数,不超过 2147483647;不能混入负数、小数或非数字 |
#RATE-SET 设置设备默认费率,#RATE-QUERY 查询设备默认费率。仅开启时同时省略 R、E、F 的新订单采用默认费率;进行中订单继续使用原参数。默认费率保存成功才回复成功,失败不得替换旧配置;平台查询并比较完整内容。新格式使用同一套费率解析与校验;旧格式不再作为本版下发格式。
3.7 查询工作参数 #PARAM-QUERY
平台 → 设备:查询默认自停和设备安全参数。
报文格式:#PARAM-QUERY,idx
示例报文:
text
#PARAM-QUERY,11| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #PARAM-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 11 | 0~65535;响应与请求序号一致 |
设备 → 平台:返回工作参数。
报文格式:#PARAM-QUERY,idx,fullSwitch,fullPower,fullDelay,maxPower,totalMaxPower,maxMinutes,4
示例报文:
text
#PARAM-QUERY,11,1,10,60,15000,15000,900,4| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #PARAM-QUERY | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 11 | 0~65535;响应与请求序号一致 |
| 3 | 充满自停开关 fullSwitch | Number | 是 | 1 | 0 关闭,1 开启 |
| 4 | 充满功率 fullPower | Number | 是 | 10 | 非负整数,单位 W |
| 5 | 充满延时 fullDelay | Number | 是 | 60 | 单位秒;启用充满自停时必须大于 0 |
| 6 | 单端口过载阈值 maxPower | Number | 是 | 15000 | 大于 0,单位 W;设备安全限制 |
| 7 | 整桩过载阈值 totalMaxPower | Number | 是 | 15000 | 大于 0,单位 W;设备安全限制 |
| 8 | 最长时长 maxMinutes | Number | 是 | 900 | 大于 0,单位分钟;省略 S 的订单使用该默认值 |
| 9 | 心跳间隔 | Number | 是 | 4 | 固定 4 分钟 |
订单已经固定的自停参数通过第 3.4 节查询。
3.8 设置工作参数 #PARAM-SET
平台 → 设备:设置默认自停与设备安全参数。
报文格式:#PARAM-SET,idx,fullSwitch,fullPower,fullDelay,maxPower,totalMaxPower,maxMinutes,4
示例报文:
text
#PARAM-SET,12,1,10,60,15000,15000,900,4| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #PARAM-SET | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 12 | 0~65535;响应与请求序号一致 |
| 3 | 充满自停开关 fullSwitch | Number | 是 | 1 | 0 关闭,1 开启 |
| 4 | 充满功率 fullPower | Number | 是 | 10 | 非负整数,单位 W |
| 5 | 充满延时 fullDelay | Number | 是 | 60 | 单位秒;启用充满自停时必须大于 0 |
| 6 | 单端口过载阈值 maxPower | Number | 是 | 15000 | 大于 0,单位 W;设备安全限制 |
| 7 | 整桩过载阈值 totalMaxPower | Number | 是 | 15000 | 大于 0,单位 W;设备安全限制 |
| 8 | 最长时长 maxMinutes | Number | 是 | 900 | 大于 0,单位分钟;省略 S 的订单使用该默认值 |
| 9 | 心跳间隔 | Number | 是 | 4 | 固定 4 分钟 |
设备 → 平台:返回设置结果。
报文格式:#PARAM-SET,idx,result
示例报文:
text
#PARAM-SET,12,1| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #PARAM-SET | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 12 | 0~65535;响应与请求序号一致 |
| 3 | 执行结果 result | Number | 是 | 1 | 返回码见本指令说明 |
| result | 说明 |
|---|---|
| 1 | 接受 |
| 2 | 参数错误 |
| 3 | 保存失败,原默认配置不变 |
其中充满自停和最长时长作为省略 S 时的订单默认参数;单端口、整桩功率上限仍为设备安全配置。订单内的 S 不修改这些默认值或安全限制。
#PARAM-SET,idx,result,1 接受、2 参数错误。开关 0/1,功率单位 W、延时秒、最长时长分钟。开启充满停止时延时必须大于 0;过载阈值和最长时长必须大于 0。心跳间隔固定 4。
3.9 远程重启 #REBOOT
平台 → 设备:请求重启。
报文格式:#REBOOT,idx
示例报文:
text
#REBOOT,13| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #REBOOT | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 13 | 0~65535;响应与请求序号一致 |
设备 → 平台:接受重启。
报文格式:#REBOOT,idx,1
示例报文:
text
#REBOOT,13,1| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #REBOOT | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 13 | 0~65535;响应与请求序号一致 |
| 3 | 执行结果 | Number | 是 | 1 | 接受重启;播报后约 3 秒执行 |
当前 NCS10-A 仍按原有机制恢复有效进行中订单;已停止等待确认的订单不恢复供电。协议编号变更不等于固件已经刷入设备。
3.10 结束确认 #CHARGE-ACK
平台 → 设备:账单保存成功后确认结束。
报文格式:#CHARGE-ACK,idx,port,order
示例报文:
text
#CHARGE-ACK,14,1,ORD004| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #CHARGE-ACK | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 14 | 0~65535;响应与请求序号一致 |
| 3 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 4 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
设备 → 平台:返回订单位置是否已释放。
报文格式:#CHARGE-ACK,idx,result,port,order
示例报文:
text
#CHARGE-ACK,14,1,1,ORD004| 序号 | 字段名 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 1 | 指令类型 | String | 是 | #CHARGE-ACK | 固定指令名称 |
| 2 | 指令序号 idx | Number | 是 | 14 | 0~65535;响应与请求序号一致 |
| 3 | 执行结果 result | Number | 是 | 1 | 返回码见本指令说明 |
| 4 | 端口号 port | Number | 是 | 1 | 从 1 开始,NCS10-A 为 1~10;错误响应中的无效端口为 0 |
| 5 | 订单编号 order | String | 是 | ORD004 | 1~30 个英文字母、数字、下划线或短横线;开始/停止请求不能为 0;无订单查询返回 0 |
| result | 说明 |
|---|---|
| 1 | 已清除,可接新订单 |
| 4 | 参数错误 |
| 5 | 订单不匹配或仍在充电 |
| 6 | 清除保存失败,继续保留订单 |
空闲端口重复收到确认可返回 1,含义仅是端口已经空闲,不证明设备仍保存该历史订单。新订单开始后,迟到的旧订单确认不能清除新订单。平台应自动完成确认,不要求用户额外点击。
4 订单流程
每端口只保留一个订单,包括已经停止但平台尚未确认的订单。不能覆盖旧订单。开始时固定本订单最终采用的完整费率和配置,不修改设备默认值或其他订单;携带完整费率时无须先发送 #RATE-SET。后续默认配置设置只影响新订单;本版不提供进行中订单充值、扣减余额或修改费率指令。
| 当前状态与请求 | 设备处理 |
|---|---|
| 空闲,开始新订单 | 全部参数和设备安全限制校验通过、完整订单保存成功后才供电并返回 1;保存失败返回 3,不开启供电 |
| 充电中,同端口、同订单、同金额且参数一致重复开始 | 返回成功,不再次操作继电器、不加钱、不重置计费、不重复播报 |
| 充电中,同订单但金额、费率或配置参数不同 | 开启响应返回 2,保留原订单;例如首次预付 1000 分,重发改为 2000 分 |
| 同端口其他订单占用 | 开启响应返回 3,不影响原订单 |
| 旧订单已停止、尚未确认 | 开启响应返回 3,包括重发原订单;不恢复供电;平台查询最终结果、保存账单并确认后,才用新订单号开启 |
| 平台主动停止或设备自动停止 | 先关闭继电器,保留最终结果 |
| 平台保存最终账单后发送结束确认 | 设备成功清除订单后回复确认成功,端口才可接受新订单 |
重复开启按解析后的完整费率和配置比较,0800 与 800 相同;省略参数沿用原订单值,不读取新默认值。返回 3 后查询端口:充电中保留原订单;已停止待确认则保存账单并确认;空闲也不代表保存或设备故障已恢复,不能仅凭空闲判定可以成功开启。
S 只配置最长时长和充满自停,不覆盖端口、整桩功率及过载保护,不启用其他自停功能;余额用完仍停止。首次开启成功播报“充电已开启, 预计最长充电时间900分钟”,时长取本订单 maxMinutes;金额模式没有固定最大电量。
正常用户主动结束就是停止流程,不需要另设“强制结清”。停止成功表示已经断电并保存结束结果;结束确认成功表示设备已释放订单位置。平台不得用结束确认代替停止。
设备重复收到停止请求,在尚未确认期间返回同一最终结果。确认后设备不再保留历史账单,历史查询由平台负责。断网不自动丢弃未确认结果。平台超时只能标为“结果待核验”,查询原端口和订单;不能因为 HTTP 发送成功就显示充电成功,也不能换新订单号重试。
5 实现与验证边界
本次在 NCS10-A 当前每端口状态中保留结束结果,不按订单创建新存储项。实际实现仍使用 fskv,并非此前 V2 的固定容量文件方案。记录数量受十个端口限制,但不能据此宣称 Flash 最大物理占用已经验证。
正式首版是协议名称,不代表完成全部量产验证。主机流程测试与实机断网、断电、容量和继电器时序验证分别记录。接入步骤见开放协议接入流程。
旧固件已存在的订单继续保留原参数,不转换费率单位或服务费选档方式;缺少新费率编号的历史订单查询仍返回基础字段,不能伪造实际参数。新订单须携带完整费率,或先通过 #RATE-SET 保存新格式默认费率。