Appearance
扫码充设备私有通信协议 V2.0.7
当前版本:V2.0.7 上一版本:私有协议 V2.0.6
1 协议基础
1.1 通信链路
设备先连接注册平台并发送注册登录报文,注册平台通过 #LOGIN 或 #LOGIN-RETURN 下发业务 MQTT 服务器、Topic、productCategory、商户信息、桩编号和业务密钥。
当 productCategory != 5 时,NCS 模板选择私有协议适配器。业务 MQTT 链路使用注册平台下发的 chargerKey 做 AES-128-CBC/PKCS7 加解密,IV 为 16 字节全 0。本文所有业务报文均指解密后的明文协议文本。
1.2 数据结构
| 起始标志 | 指令类型 | 指令序号 | 消息体 |
|---|---|---|---|
# | 数字、短指令或语义化指令 | idx | 使用逗号分隔的字段列表 |
示例数据:#<指令类型>,<指令序号>,<消息体>
- 指令以
#开头,字段以英文逗号,分隔。- 私有协议设备上行指令序号不持久化,每次启动从 0 开始,超过 999 后归 0。
- 端口号
chn从 1 开始。- 金额单位为分,电量单位为 Wh,充电运行时长按字段说明使用秒或分钟。
- 私有协议保留历史字段
deviceNo,当前固件解析时不使用该字段做设备选择。- orderId 扩展以当前代码字段位置为准,空字符串或
0表示不校验订单。
1.3 数据类型
| 类型 | 参数名 | 说明 |
|---|---|---|
| 数值型 | Number | 十进制数字,用于金额、功率、端口、状态、时间等 |
| 字符型 | String | 以字符形式传输的数据 |
| 列表型 | List | 使用 -、| 或 , 连接的数据组,按字段说明解析 |
2 注册与绑定
2.1 注册平台阶段
私有协议与开放协议共用注册平台阶段。设备登录 #LOGIN、注册平台响应 #LOGIN、业务参数下发 #LOGIN-RETURN、设备保存结果 #LOGIN-RETURN 的字段定义见 注册平台。
私有协议业务链路仅在 productCategory != 5 时启用;业务链路建立后,从下方 #REGISTER 开始进入私有协议业务指令。
2.2 业务注册 #REGISTER
设备 → 业务平台:业务 MQTT 就绪后,设备发送一次业务注册报文。
示例报文:#REGISTER,1,123456789012345,864710071234567,460047661234567,89860846123456789000,0.0.5,1,12,0,1,10,10,16800,16800,900,4
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #REGISTER | 固定为 #REGISTER;业务注册指令 |
| 2 | 指令序号 | Number | 1 | 取值 0~999;设备生成的私有协议序号 |
| 3 | 充电桩注册码 | String | 123456789012345 | 长度 15 字节;优先使用桩编号,无桩编号时使用 IMEI,不足补 0,超长截取 |
| 4 | IMEI | String | 864710071234567 | 长度 15 字节;设备 IMEI |
| 5 | IMSI | String | 460047661234567 | 长度 15 字节;SIM 卡 IMSI |
| 6 | ICCID | String | 89860846123456789000 | 长度 20 字节;SIM 卡 ICCID |
| 7 | 固件版本 | String | 0.0.5 | 固件版本,唯一事实来源为项目入口常量封装 |
| 8 | 注册类型 | Number | 1 | 固定为 1;充电桩类型,当前固定为电动自行车充电桩 |
| 9 | 端口数量 | Number | 12 | 1~项目端口数;设备端口数量 |
| 10 | 计费模型编号 | Number | 0 | 固定为 0;私有协议注册报文计费模型 ID 固定为 0 |
| 11 | 充满自停开关 | Number | 1 | 取值 0 或 1;充满自停开关 |
| 12 | 充满功率阈值 | Number | 10 | 取值 >=0;充满自停功率阈值,单位 W |
| 13 | 充满自停延时 | Number | 10 | 取值 >=0;充满自停延时,单位分钟;核心层换算为秒 |
| 14 | 单端口过载阈值 | Number | 16800 | 取值 >0;单端口过载阈值,单位 W |
| 15 | 整桩过载阈值 | Number | 16800 | 取值 >0;私有协议当前整桩阈值使用同一过载值 |
| 16 | 最长充电时间 | Number | 900 | 取值 >0;最长充电时间,单位分钟 |
| 17 | 心跳间隔 | Number | 4 | 固定为 4;注册报文心跳间隔字段固定为 4 分钟 |
业务平台 → 设备:当前固件还解析业务平台下发的注册状态报文。
示例报文:#REGISTER,1,0,1,1,1234
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #REGISTER | 固定为 #REGISTER;业务注册状态指令 |
| 2 | 指令序号 | Number | 1 | 取值 0~999;平台回传序号 |
| 3 | 设备序号 | Number | 0 | 历史保留;当前固件不使用该字段做设备选择 |
| 4 | 端口号 | Number | 1 | 历史保留;当前固件不使用该字段控制端口 |
| 5 | 登录状态 | Number | 1 | 平台定义;固件读取该字段更新显示登录状态 |
| 6 | 显示编号 | String | 1234 | 平台定义;固件读取该字段更新显示验证码或提示编号 |
2.3 设备绑定 #A
业务平台 → 设备:设置设备绑定状态。
示例报文:#A,2,0,1
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #A | 固定为 #A;绑定状态指令 |
| 2 | 指令序号 | Number | 2 | 取值 0~999;平台生成的指令序号 |
| 3 | 设备序号 | Number | 0 | 历史保留;当前固件不使用该字段做设备选择 |
| 4 | 状态 | Number | 1 | 取值 0 或 1;0 解绑,设备结束所有端口充电;1 已绑定,设备更新显示登录状态 |
设备 → 业务平台:绑定响应。
示例报文:#A,0,0,NCS12
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #A | 固定为 #A;绑定响应指令 |
| 2 | 指令序号 | Number | 0 | 固定为 0;当前固件响应序号固定为 0 |
| 3 | 执行结果 | Number | 0 | 固定为 0;0 表示已处理 |
| 4 | 项目名称 | String | NCS12 | 项目名称,来自项目入口常量封装 |
3 状态上报
3.1 心跳 #0
设备 → 业务平台:上报信号、端口数量和各端口运行费用摘要。
示例报文:#0,3,25,55,2,1800-200-50-12-38-100,0-0-0-0-0-0
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #0 | 固定为 #0;私有协议心跳指令 |
| 2 | 指令序号 | Number | 3 | 取值 0~999;设备生成的私有协议序号 |
| 3 | 信号强度 | Number | 25 | 取值 0~31;信号强度 |
| 4 | 信号接收功率 | Number | 55 | 设备模块返回值;信号接收功率 |
| 5 | 端口数量 | Number | 2 | 1~项目端口数;插孔/端口数量 |
| 6 | 端口摘要 | List | 1800-200-50-12-38-100 | 数量等于端口数;每个端口一个摘要组,多个端口用逗号连接,组内用 - 分隔 |
端口摘要组格式:
chargeValue-meteringPower-elecFee-servFee-balance-chargeEnergyWh
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 剩余充电值 | Number | 1800 | 取值 >=0;剩余充电时长/电量 |
| 2 | 当前功率 | Number | 200 | 取值 >=0;当前功率 |
| 3 | 电费 | Number | 50 | 取值 >=0;电费,单位分 |
| 4 | 服务费 | Number | 12 | 取值 >=0;服务费,单位分 |
| 5 | 余额 | Number | 38 | 取值 >=0;余额,单位分 |
| 6 | 充电电量 | Number | 100 | 取值 >=0;已充电量,单位 Wh |
业务平台心跳响应当前固件不解析。
3.2 掉电提醒 #DROP
设备 → 业务平台:设备检测掉电时上报订单摘要。
示例报文:#DROP,4,25,55,2,1800-200-50-12-38-100,0-0-0-0-0-0
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #DROP | 固定为 #DROP;掉电提醒指令 |
| 2 | 指令序号 | Number | 4 | 取值 0~999;设备生成的私有协议序号 |
| 3 | 信号强度 | Number | 25 | 取值 0~31;信号强度 |
| 4 | 信号接收功率 | Number | 55 | 设备模块返回值;信号接收功率 |
| 5 | 端口数量 | Number | 2 | 1~项目端口数;插孔/端口数量 |
| 6 | 端口摘要 | List | 1800-200-50-12-38-100 | 数量等于端口数;字段含义与 #0 心跳摘要一致;当前掉电提醒不携带 orderId |
3.3 设备自停 #5
设备 → 业务平台:设备达到停止条件后上报自停事件及费用明细。
示例报文:#5,5,0,1,2,1800,200,0,210,1,90,50,12,38,100,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #5 | 固定为 #5;自停上报指令 |
| 2 | 指令序号 | Number | 5 | 取值 0~999;设备生成的私有协议序号 |
| 3 | 设备序号 | Number | 0 | 历史保留,固定 0;当前固件固定填 0 |
| 4 | 端口号 | Number | 1 | 1~端口数量;自停端口号 |
| 5 | 自停类型 | Number | 2 | 核心自停类型;由核心充电引擎产生 |
| 6 | 剩余充电值 | Number | 1800 | 取值 >=0;停止前剩余充电值 |
| 7 | 当前功率 | Number | 200 | 取值 >=0;当前功率 |
| 8 | 充电类型 | Number | 0 | 取值 0~3;充电类型 |
| 9 | 平均功率 | Number | 210 | 取值 >=0;平均功率 |
| 10 | 服务费类型 | Number | 1 | 取值 1 或 2;服务费类型,取当前会话值 |
| 11 | 已充时长 | Number | 90 | 取值 >=0;充电时长,单位秒 |
| 12 | 电费 | Number | 50 | 取值 >=0;电费,单位分 |
| 13 | 服务费 | Number | 12 | 取值 >=0;服务费,单位分 |
| 14 | 余额 | Number | 38 | 取值 >=0;余额,单位分 |
| 15 | 充电电量 | Number | 100 | 取值 >=0;已充电量,单位 Wh |
| 16 | 订单编号 | String | 20250101120000123456 | 空或 0 表示无订单;当前订单编号 |
业务平台 → 设备:自停确认。
示例报文:#5,5,0,1
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #5 | 固定为 #5;自停确认指令 |
| 2 | 指令序号 | Number | 5 | 取值 0~999;等同设备上行自停序号 |
| 3 | 执行结果 | Number | 0 | 取值 0 表示成功;当 result = 0 时,设备确认平台已收到自停事件 |
| 4 | 端口号 | Number | 1 | 1~端口数量;自停端口号 |
4 启停充电
4.1 开启或续费 #1
计时类请求
chargeType = 0 或 2 时,当前代码按计时类处理,value 单位为分钟,设备内部转换为秒。
示例报文:#1,6,0,1,0,30,1,10,10,16800,10,45,900,1,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #1 | 固定为 #1;开启或续费指令 |
| 2 | 指令序号 | Number | 6 | 取值 0~999;平台生成的指令序号 |
| 3 | 设备序号 | Number | 0 | 历史保留;当前固件不使用该字段做设备选择 |
| 4 | 端口号 | Number | 1 | 1~端口数量;目标端口号 |
| 5 | 充电类型 | Number | 0 | 取值 0 或 2;计时类按分钟开启;2 当前也按计时类处理 |
| 6 | 充电值 | Number | 30 | 取值 >0;计时类为分钟,设备内部转换为秒 |
| 7 | 充满自停开关 | Number | 1 | 取值 0 或 1;充满自停开关 |
| 8 | 充满功率阈值 | Number | 10 | 取值 >=0;充满功率阈值,单位 W |
| 9 | 充满自停延时 | Number | 10 | 取值 >=0;充满延时,单位分钟,核心层转换为秒 |
| 10 | 单端口过载阈值 | Number | 16800 | 取值 >0;过载功率阈值,单位 W |
| 11 | 空载功率阈值 | Number | 10 | 取值 >=0;空载功率阈值 |
| 12 | 空载延时 | Number | 45 | 取值 >=0;空载延时,单位秒 |
| 13 | 最长充电时间 | Number | 900 | 取值 >0;最长充电时间,单位分钟,核心层转换为秒 |
| 14 | 空载自停开关 | Number | 1 | 取值 0 或 1;空载自停开关 |
| 15 | 订单编号 | String | 20250101120000123456 | 空或 0 表示不校验;V2.0.7 扩展字段;计时类位于第 15 字段 |
金额/计量类请求
chargeType = 1 或 3 时,当前代码按金额/费率字段处理;chargeType = 3 会转换为内部计量类处理。
示例报文:#1,7,0,1,1,1000,1,10,10,16800,10,45,900,1,100,1,2400,478,1,1,2200,0,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #1 | 固定为 #1;开启或续费指令 |
| 2 | 指令序号 | Number | 7 | 取值 0~999;平台生成的指令序号 |
| 3 | 设备序号 | Number | 0 | 历史保留;当前固件不使用该字段做设备选择 |
| 4 | 端口号 | Number | 1 | 1~端口数量;目标端口号 |
| 5 | 充电类型 | Number | 1 | 取值 1 或 3;金额/计量类;3 转为内部计量类 |
| 6 | 充电值 | Number | 1000 | 取值 >0;目标电量值或等效充电值 |
| 7 | 充满自停开关 | Number | 1 | 取值 0 或 1;充满自停开关 |
| 8 | 充满功率阈值 | Number | 10 | 取值 >=0;充满功率阈值,单位 W |
| 9 | 充满自停延时 | Number | 10 | 取值 >=0;充满延时,单位分钟 |
| 10 | 单端口过载阈值 | Number | 16800 | 取值 >0;过载功率阈值,单位 W |
| 11 | 空载功率阈值 | Number | 10 | 取值 >=0;空载功率阈值 |
| 12 | 空载延时 | Number | 45 | 取值 >=0;空载延时,单位秒 |
| 13 | 最长充电时间 | Number | 900 | 取值 >0;最长充电时间,单位分钟 |
| 14 | 空载自停开关 | Number | 1 | 取值 0 或 1;空载自停开关 |
| 15 | 预付金额 | Number | 100 | 取值 >=0;预付金额,单位分;计量类必填 |
| 16 | 电费分组数 | Number | 1 | 取值 >=1;电费分组数量 |
| 17 | 电费时间阈值 | List | 2400 | 数字列表;电费时间阈值列表,代码从字段中提取数字列表 |
| 18 | 电费费率 | List | 478 | 数字列表,每项 >0;电费费率列表,单位厘 |
| 19 | 服务费类型 | Number | 1 | 取值 1 或 2;1 按时间服务费,2 按电量服务费 |
| 20 | 服务费分组数 | Number | 1 | 取值 >=1;服务费分组数量 |
| 21 | 服务费功率阈值 | List | 2200 | 数字列表;服务费功率阈值列表 |
| 22 | 服务费费率 | List | 0 | 数字列表,每项 >=0;服务费费率列表,单位厘 |
| 23 | 订单编号 | String | 20250101120000123456 | 空或 0 表示不校验;V2.0.7 扩展字段;金额/计量类位于第 23 字段 |
设备 → 业务平台:开启或续费响应。
示例报文:#1,7,0,1,1000,200,1,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #1 | 固定为 #1;开启或续费响应指令 |
| 2 | 指令序号 | Number | 7 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 取值 0 或 1;0 成功,1 端口忙、参数不一致或启动失败 |
| 4 | 端口号 | Number | 1 | 1~端口数量;端口号 |
| 5 | 剩余充电值 | Number | 1000 | 取值 >=0;当前剩余充电值 |
| 6 | 当前功率 | Number | 200 | 取值 >=0;当前功率 |
| 7 | 充电类型 | Number | 1 | 取值 0~3;当前充电类型 |
| 8 | 订单编号 | String | 20250101120000123456 | 空或 0 表示无订单;当前端口订单编号 |
同一端口相同
idx + 完整报文签名的重复请求会被忽略,不再返回响应。运行中的续费必须保持chargeType、orderId、会话自停配置、费率配置和服务费类型一致,否则固件拒绝本次请求。
#1中的金额/计量类费率字段是会话费率,只影响当前订单和该订单的续费一致性校验,不写入设备级费率配置。设备级费率应使用#RATE_SET设置,只影响后续新订单;已经运行中的订单继续使用启动时锁定的会话费率快照。
4.2 终止充电 #2
业务平台 → 设备:平台请求终止指定端口充电。
示例报文:#2,8,0,1,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #2 | 固定为 #2;终止充电指令 |
| 2 | 指令序号 | Number | 8 | 取值 0~999;平台生成的指令序号 |
| 3 | 设备序号 | Number | 0 | 历史保留;当前固件不使用该字段做设备选择 |
| 4 | 端口号 | Number | 1 | 1~端口数量;目标端口号 |
| 5 | 订单编号 | String | 20250101120000123456 | 空或 0 表示不校验;携带非 0 值时,必须与当前端口订单一致;可选字段 |
设备 → 业务平台:返回终止结果和费用明细;成功响应组包后设备结束充电。
示例报文:#2,8,0,1,1000,1,200,1,90,50,12,38,100,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #2 | 固定为 #2;终止充电响应指令 |
| 2 | 指令序号 | Number | 8 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 取值 0 或 2;0 成功,2 orderId 与当前端口订单不一致 |
| 4 | 端口号 | Number | 1 | 1~端口数量;端口号 |
| 5 | 剩余充电值 | Number | 1000 | 取值 >=0;当前剩余充电值 |
| 6 | 充电类型 | Number | 1 | 取值 0~3;当前充电类型 |
| 7 | 当前功率 | Number | 200 | 取值 >=0;当前功率 |
| 8 | 服务费类型 | Number | 1 | 取值 1 或 2;服务费类型 |
| 9 | 已充时长 | Number | 90 | 取值 >=0;充电时长,单位秒 |
| 10 | 电费 | Number | 50 | 取值 >=0;电费,单位分 |
| 11 | 服务费 | Number | 12 | 取值 >=0;服务费,单位分 |
| 12 | 余额 | Number | 38 | 取值 >=0;余额,单位分 |
| 13 | 充电电量 | Number | 100 | 取值 >=0;已充电量,单位 Wh |
| 14 | 订单编号 | String | 20250101120000123456 | 空或 0 表示无订单;当前端口订单编号 |
端口号无效时当前固件不返回响应。
5 查询指令
5.1 查询端口状态 #3
业务平台 → 设备:查询单个端口状态。
示例报文:#3,9,0,1
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #3 | 固定为 #3;查询端口状态指令 |
| 2 | 指令序号 | Number | 9 | 取值 0~999;平台生成的指令序号 |
| 3 | 设备序号 | Number | 0 | 历史保留;当前固件不使用该字段做设备选择 |
| 4 | 端口号 | Number | 1 | 1~端口数量;目标端口号 |
设备 → 业务平台:返回端口状态、费用、电量和订单编号。
示例报文:#3,9,0,1,1,1000,200,90,210,1,210,50,12,38,100,20250101120000123456
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #3 | 固定为 #3;查询端口状态响应指令 |
| 2 | 指令序号 | Number | 9 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 固定为 0;0 表示查询成功 |
| 4 | 端口号 | Number | 1 | 1~端口数量;端口号 |
| 5 | 充电类型 | Number | 1 | 取值 0~3;当前充电类型 |
| 6 | 剩余充电值 | Number | 1000 | 取值 >=0;当前剩余充电值 |
| 7 | 当前功率 | Number | 200 | 取值 >=0;当前功率 |
| 8 | 已充时长 | Number | 90 | 取值 >=0;已充时长,单位秒 |
| 9 | 平均功率 | Number | 210 | 取值 >=0;平均功率 |
| 10 | 服务费类型 | Number | 1 | 取值 1 或 2;服务费类型 |
| 11 | 计费功率 | Number | 210 | 取值 >=0;计费功率,当前等同平均功率 |
| 12 | 电费 | Number | 50 | 取值 >=0;电费,单位分 |
| 13 | 服务费 | Number | 12 | 取值 >=0;服务费,单位分 |
| 14 | 余额 | Number | 38 | 取值 >=0;余额,单位分 |
| 15 | 充电电量 | Number | 100 | 取值 >=0;已充电量,单位 Wh |
| 16 | 订单编号 | String | 20250101120000123456 | 空或 0 表示无订单;当前端口订单编号 |
5.2 查询设备状态 #4
业务平台 → 设备:查询所有端口状态。
示例报文:#4,10
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #4 | 固定为 #4;查询设备状态指令 |
| 2 | 指令序号 | Number | 10 | 取值 0~999;平台生成的指令序号 |
设备 → 业务平台:返回所有端口费用摘要。
示例报文:#4,10,0,2,1000-200-50-12-38-100-20250101120000123456,0-0-0-0-0-0-0
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #4 | 固定为 #4;查询设备状态响应指令 |
| 2 | 指令序号 | Number | 10 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 固定为 0;0 表示查询成功 |
| 4 | 端口数量 | Number | 2 | 1~项目端口数;端口数量 |
| 5 | 端口摘要 | List | 1000-200-50-12-38-100-20250101120000123456 | 数量等于端口数;每端口一个摘要组,多个端口用逗号连接,组内用 - 分隔 |
端口摘要组格式:
chargeValue-meteringPower-elecFee-servFee-balance-chargeEnergyWh-orderId
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 剩余充电值 | Number | 1000 | 取值 >=0;当前剩余充电值 |
| 2 | 当前功率 | Number | 200 | 取值 >=0;当前功率 |
| 3 | 电费 | Number | 50 | 取值 >=0;电费,单位分 |
| 4 | 服务费 | Number | 12 | 取值 >=0;服务费,单位分 |
| 5 | 余额 | Number | 38 | 取值 >=0;余额,单位分 |
| 6 | 充电电量 | Number | 100 | 取值 >=0;已充电量,单位 Wh |
| 7 | 订单编号 | String | 20250101120000123456 | 空或 0 表示无订单;当前端口订单编号 |
5.3 废弃指令 #7
#7 功能与端口状态查询存在重复,已从正式一对一指令映射中移出,进入废弃/迁移期兼容状态。迁移期内若平台仍发送 #7,设备侧可按兼容策略保留解析,但新平台不得继续依赖该指令建立正式能力映射。
历史 #7 返回内容与 #3 的端口状态响应基本一致,但比 #3 多 fullTimer、idleTimer、overTimer 三个设备运行计时器字段。端口状态查询应迁移到 #3;如果后端仍依赖上述三个计时器,应迁移到 #PORT_RUNTIME_QUERY 或具备等价语义的运行时查询指令,不应继续扩展 #7。
6 刷卡与维护
6.1 刷卡请求 #B
设备 → 业务平台:刷卡后请求平台校验。
示例报文:#B,12,0,1,AABB1122
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #B | 固定为 #B;刷卡请求指令 |
| 2 | 指令序号 | Number | 12 | 取值 0~999;设备生成的私有协议序号 |
| 3 | 设备序号 | Number | 0 | 固定为 0;当前固件固定填 0 |
| 4 | 端口号 | Number | 1 | 1~端口数量;刷卡端口 |
| 5 | 卡 UID | String | AABB1122 | 十六进制字符串;卡 UID |
业务平台 → 设备:刷卡校验结果。
示例报文:#B,12,0,1,1
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #B | 固定为 #B;刷卡响应指令 |
| 2 | 指令序号 | Number | 12 | 取值 0~999;等同设备刷卡请求序号 |
| 3 | 返回数据 | Number/String | 0 | 平台定义;历史返回数据字段;当前固件不解析业务含义 |
| 4 | 校验结果 | Number | 1 | 取值 0~2;当前固件读取该字段:0 卡片无效,1 校验成功,2 余额不足 |
| 5 | 端口号 | Number | 1 | 1~端口数量;当前固件读取该字段作为端口号 |
6.2 远程重启 #REBOOT
业务平台 → 设备:远程重启设备。
示例报文:#REBOOT,13
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #REBOOT | 固定为 #REBOOT;远程重启指令 |
| 2 | 指令序号 | Number | 13 | 取值 0~999;平台生成的指令序号;当前响应不回显该值 |
设备 → 业务平台:远程重启响应。
示例报文:#REBOOT,0,0
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #REBOOT | 固定为 #REBOOT;当前固件远程重启响应指令 |
| 2 | 指令序号 | Number | 0 | 固定为 0;当前固件固定返回 0 |
| 3 | 执行结果 | Number | 0 | 固定为 0;0 表示已处理,设备随后立即调用重启流程 |
6.3 远程升级 #UPGRADE
业务平台 → 设备:远程升级设备。
示例报文:#UPGRADE,14
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #UPGRADE | 固定为 #UPGRADE;远程升级指令 |
| 2 | 指令序号 | Number | 14 | 取值 0~999;平台生成的指令序号 |
设备 → 业务平台:远程升级响应。
示例报文:#UPGRADE,14,0
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #UPGRADE | 固定为 #UPGRADE;远程升级响应指令 |
| 2 | 指令序号 | Number | 14 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 固定为 0;0 表示已处理,设备返回后进入升级流程 |
7 新增语义化补齐指令
本节只定义私有协议新增指令。除 #7 进入废弃/迁移期兼容外,私有协议现有旧指令不在本节重定义,也不得因一对一映射而改名、删除或调整字段。
新增指令采用
#*命名;落地时应在私有适配器中增加新的处理器,并复用现有底层业务逻辑。
7.1 查询设备级费率 #RATE-QUERY
业务平台 → 设备:查询设备当前保存的设备级费率配置。
示例报文:#RATE-QUERY,15
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #RATE-QUERY | 固定为 #RATE-QUERY;查询设备级费率 |
| 2 | 指令序号 | Number | 15 | 取值 0~999;平台生成的指令序号 |
设备 → 业务平台:返回设备级费率配置和配置摘要。
示例报文:#RATE-QUERY,15,0,101,A94F21C8,3,1200|1830|2359,E,850|850|850,E,150|150|150
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #RATE-QUERY | 固定为 #RATE-QUERY;查询设备级费率响应 |
| 2 | 指令序号 | Number | 15 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 返回码,见下表 |
| 4 | 费率模型编号 | Number | 101 | rateModelId,取值 >=0;设备当前费率模型编号 |
| 5 | 费率摘要 | String | A94F21C8 | rateHash 或等价配置摘要;由完整费率配置按平台约定算法生成 |
| 6 | 计费分组数 | Number | 3 | 取值 1~10;计费分组数量 |
| 7 | 时间阈值列表 | List | 1200|1830|2359 | HHMM,数量等于分组数;使用 | 分隔 |
| 8 | 电费模式 | String | E | 取值 E 或 T;E 按电量,T 按时间 |
| 9 | 电费费率列表 | List | 850|850|850 | 数量等于分组数,每项 >0;单位厘 |
| 10 | 服务费模式 | String | E | 取值 E 或 T;E 按电量,T 按时间 |
| 11 | 服务费费率列表 | List | 150|150|150 | 数量等于分组数,每项 >=0;单位厘 |
| result | 说明 |
|---|---|
0 | 成功 |
1 | 设备尚无有效设备级费率配置 |
2 | 内部读取失败或配置校验失败 |
异常处理:请求字段缺失或指令序号非法时,设备返回 result=2;当前设备级费率缺失时返回 result=1,不得用静默默认费率拼装成功响应。
业务影响:该指令只读取设备级费率,不影响正在运行的订单。运行中订单仍使用启动时锁定的会话费率快照。
7.2 设置设备级费率 #RATE_SET
业务平台 → 设备:设置设备级费率配置。该配置只影响后续新订单,不影响当前运行订单。
示例报文:#RATE_SET,16,101,A94F21C8,3,1200|1830|2359,E,850|850|850,E,150|150|150
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #RATE_SET | 固定为 #RATE_SET;设置设备级费率 |
| 2 | 指令序号 | Number | 16 | 取值 0~999;平台生成的指令序号 |
| 3 | 费率模型编号 | Number | 101 | rateModelId,取值 >=0;平台下发的费率模型编号 |
| 4 | 费率摘要 | String | A94F21C8 | rateHash 或等价配置摘要;设备保存后应回传同一摘要 |
| 5 | 计费分组数 | Number | 3 | 取值 1~10;计费分组数量 |
| 6 | 时间阈值列表 | List | 1200|1830|2359 | HHMM,数量等于分组数;最后一项应覆盖全天结束点 |
| 7 | 电费模式 | String | E | 取值 E 或 T;电费计费模式 |
| 8 | 电费费率列表 | List | 850|850|850 | 数量等于分组数,每项 >0;单位厘 |
| 9 | 服务费模式 | String | E | 取值 E 或 T;服务费计费模式 |
| 10 | 服务费费率列表 | List | 150|150|150 | 数量等于分组数,每项 >=0;单位厘 |
设备 → 业务平台:返回费率设置结果和实际保存摘要。
示例报文:#RATE_SET,16,0,101,A94F21C8
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #RATE_SET | 固定为 #RATE_SET;设置设备级费率响应 |
| 2 | 指令序号 | Number | 16 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 返回码,见下表 |
| 4 | 费率模型编号 | Number | 101 | 实际保存的 rateModelId;失败时回传请求值或 0 |
| 5 | 费率摘要 | String | A94F21C8 | 实际保存的 rateHash 或等价配置摘要;失败时可为空 |
| result | 说明 |
|---|---|
0 | 成功 |
1 | 参数无效 |
2 | 分组数无效 |
3 | 摘要校验失败或保存后摘要不一致 |
4 | 当前存在运行订单,配置已拒绝或需平台稍后重试 |
异常处理:设备必须校验分组数、时间阈值、计费模式、费率列表长度和费率取值;rateHash 与设备计算摘要不一致时返回 3,不得保存半成品配置。若实现策略要求无运行订单才能修改设备级费率,应返回 4。
业务影响:成功后仅影响后续新订单。#1 金额/计量类请求携带的会话费率仍只作用于当前订单,不回写、不覆盖 #RATE_SET 保存的设备级费率。
7.3 查询工作参数 #PARAM_QUERY
业务平台 → 设备:查询设备级工作参数。
示例报文:#PARAM_QUERY,17
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #PARAM_QUERY | 固定为 #PARAM_QUERY;查询设备级工作参数 |
| 2 | 指令序号 | Number | 17 | 取值 0~999;平台生成的指令序号 |
设备 → 业务平台:返回设备级工作参数。
示例报文:#PARAM_QUERY,17,0,1,10,60,15000,15000,900,4
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #PARAM_QUERY | 固定为 #PARAM_QUERY;查询工作参数响应 |
| 2 | 指令序号 | Number | 17 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 返回码,见下表 |
| 4 | 充满自停开关 | Number | 1 | 取值 0 或 1;充满自停开关 |
| 5 | 充满功率阈值 | Number | 10 | 取值 >=0;单位 W |
| 6 | 充满自停延时 | Number | 60 | 取值 >=0;单位秒 |
| 7 | 单端口过载阈值 | Number | 15000 | 取值 >0;单位 W |
| 8 | 整桩过载阈值 | Number | 15000 | 取值 >0;单位 W |
| 9 | 最长充电时间 | Number | 900 | 取值 >0;单位分钟 |
| 10 | 心跳间隔 | Number | 4 | 固定为 4;业务心跳周期字段 |
| result | 说明 |
|---|---|
0 | 成功 |
1 | 参数未初始化或读取失败 |
异常处理:读取到的工作参数不完整或越界时返回 1,不得用入口常量之外的第二份默认值拼装响应。
业务影响:该指令只查询设备级参数,不改变运行中订单的会话自停配置。需要查询 #7 历史额外计时器时,应使用 #PORT_RUNTIME_QUERY 或等价语义指令。
7.4 设置工作参数 #PARAM_SET
业务平台 → 设备:设置设备级工作参数。旧 #1 中的会话自停字段保持原语义。
示例报文:#PARAM_SET,18,1,10,60,15000,15000,900,4
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #PARAM_SET | 固定为 #PARAM_SET;设置设备级工作参数 |
| 2 | 指令序号 | Number | 18 | 取值 0~999;平台生成的指令序号 |
| 3 | 充满自停开关 | Number | 1 | 取值 0 或 1;充满自停开关 |
| 4 | 充满功率阈值 | Number | 10 | 取值 >=0;单位 W |
| 5 | 充满自停延时 | Number | 60 | 取值 >=0;单位秒 |
| 6 | 单端口过载阈值 | Number | 15000 | 取值 >0;单位 W |
| 7 | 整桩过载阈值 | Number | 15000 | 取值 >0;单位 W |
| 8 | 最长充电时间 | Number | 900 | 取值 >0;单位分钟 |
| 9 | 心跳间隔 | Number | 4 | 固定为 4;可选字段,如携带必须为 4 |
设备 → 业务平台:返回工作参数设置结果。
示例报文:#PARAM_SET,18,0
| 序号 | 字段名 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 指令类型 | String | #PARAM_SET | 固定为 #PARAM_SET;设置工作参数响应 |
| 2 | 指令序号 | Number | 18 | 取值 0~999;等同平台下发序号 |
| 3 | 执行结果 | Number | 0 | 返回码,见下表 |
| result | 说明 |
|---|---|
0 | 成功 |
1 | 参数无效 |
2 | 保存失败 |
3 | 当前运行状态不允许修改 |
异常处理:设备必须校验所有字段完整性、单位和取值范围;心跳间隔携带非 4 时返回 1。保存失败不得更新部分字段。
业务影响:成功后影响后续新订单和设备级默认行为。已经运行中的订单继续使用启动时确定的会话参数,旧 #1 的会话自停字段不因本指令被改名或改字段顺序。
8 未实现或仅保留常量的指令
当前代码仅保留以下指令常量,未实现业务解析流程:
| 指令 | 状态 | 说明 |
|---|---|---|
#6 | 保留 | 当前未实现业务解析流程 |
#7 | 废弃/迁移期兼容 | 已从正式一对一映射中移出;端口状态查询迁移到 #3,额外运行计时器迁移到 #PORT_RUNTIME_QUERY 或等价语义指令 |
#8 | 保留 | 当前未实现业务解析流程 |
#9 | 保留 | 当前未实现业务解析流程 |
#C | 保留 | 当前未实现业务解析流程 |
#TIME | 保留 | 当前未实现业务解析流程 |
#REGISTER-RETURN | 忽略 | 私有协议业务适配器收到后直接忽略 |
9 兼容说明
- 私有协议 V2.0.7 已将 orderId 扩展合入主协议文本。
#1的 orderId 字段位置以充电类型决定:计时类在第 15 字段,金额/计量类在第 23 字段。#2第 5 字段为可选 orderId,不再作为充电时长/功率同步值使用。#3当前响应第 11 字段为billingPower,不是历史文档中重复出现的chargeTime。#7已从正式一对一映射中移出,进入废弃/迁移期兼容;端口查询统一使用#3,若依赖fullTimer/idleTimer/overTimer,应迁移到#PORT_RUNTIME_QUERY或等价语义指令。#B返回字段以当前固件解析位置为准:第 4 字段为错误码,第 5 字段为端口号。- 新增语义化指令只补充旧指令缺失的能力,不替代、不修改任何现有旧指令。