Appearance
开放协议 vs 私有协议 对比文档
本文按当前 NCS 模板实现和后续协议调整目标整理:开放协议 V1.1、私有协议 V2.0.8。注册平台字段见 注册平台,旧版差异见 协议版本归档。
1 当前处理流程
text
注册平台登录
-> 解析 #LOGIN / #LOGIN-RETURN
-> 保存业务 MQTT 参数、productCategory 和 testMode
-> 连接业务 MQTT
-> proto_router 根据 productCategory 选择协议适配器
-> 协议适配器解析当前命名空间内的指令
-> proto_ops 执行启停充、查询、自停确认、参数更新等通用动作
-> 协议适配器按各自字段和返回码组包
-> mqtt_transport 按 testMode 明文或加密发布业务报文调整原则:
- 两套协议保持指令命名空间独立,仍由
productCategory隔离。 testMode = 1只用于开放协议测试链路,私有协议仍保持 AES 业务链路。- 开放协议指令与私有协议指令改为一对一能力映射。
2 一对一指令映射
| 开放协议指令 | 私有协议指令 | 调整说明 |
|---|---|---|
#REGISTER | #REGISTER | 现有私有注册指令保持不变 |
#HEARTBEAT | #0 | 开放心跳对应私有现有心跳,不新增替代指令 |
#AUTO-STOP | #5 | 开放自停对应私有现有自停,不新增替代指令 |
#CHARGE-START | #1 | 开放开启充电对应私有现有 #1,#1 字段不修改 |
#CHARGE-STOP | #2 | 开放停止充电对应私有现有 #2,#2 订单兼容策略不修改 |
#DEVICE-QUERY | #4 | 开放设备查询对应私有现有 #4 |
#PORT-QUERY | #3 | 开放端口查询对应私有现有 #3 |
#RATE-QUERY | #RATE_QUERY | 私有协议新增独立费率读取指令 |
#RATE-SET | #RATE_SET | 私有协议新增独立费率设置指令 |
#PARAM-QUERY | #PARAM_QUERY | 私有协议新增独立工作参数读取指令;不复用、不修改 #7 |
#PARAM-SET | #PARAM_SET | 私有协议新增独立工作参数设置指令;不修改 #1 会话参数 |
#REBOOT | #REBOOT | 远程重启已有对应;私有响应格式保持不变 |
#DROP_POWER | #DROP | 为私有现有掉电提醒在开放协议补齐对应新增指令 |
#BIND_DEVICE | #A | 为私有现有绑定指令在开放协议补齐对应新增指令 |
#CARD_VERIFY | #B | 为私有现有刷卡指令在开放协议补齐对应新增指令 |
#UPGRADE | #UPGRADE | 为私有现有升级指令在开放协议补齐对应新增指令 |
#7因功能与端口状态查询重复,已从正式一对一映射中移出,进入废弃/迁移期兼容。端口查询统一由开放#PORT-QUERY对应私有#3;#7比#3多fullTimer/idleTimer/overTimer,后端若仍依赖这些运行计时器,应迁移到#PORT_RUNTIME_QUERY或等价语义指令。
3 关键差异与修改建议
| 对比项 | 私有协议现状 | 开放协议现状 | 功能与流程差异 | 修改建议 |
|---|---|---|---|---|
| 费率读取配置 | 现有 #1 在金额/计量类开启充电时携带费率,并作为本次会话配置使用;该逻辑不修改 | 有独立 #RATE-QUERY,读取设备当前费率配置 | 私有协议费率与订单启动强绑定,开放协议费率是设备级配置;私有平台无法单独确认设备当前费率 | 私有协议新增 #RATE_QUERY,字段和响应语义与开放协议 #RATE-QUERY 对齐,并带 rateModelId 与 rateHash/配置摘要 |
| 费率编号与摘要 | 业务注册 #REGISTER 和 #0/#DROP/#7 可上报当前 rateModelId;#RATE_* 返回 rateHash | #REGISTER、#HEARTBEAT、#DEVICE-QUERY、#RATE-* 均可携带或返回计费模型编号 | rateModelId 是平台运营侧费率模型编号,rateHash 是设备实际保存费率内容摘要;两套协议均可追踪设备级费率,私有运行中订单还会冻结会话 rateModelId | 通过私有 #RATE_SET/#RATE_QUERY 和开放 #RATE-SET/#RATE-QUERY 管理设备级费率,运行中订单不被后续设置覆盖 |
| 开启充电传参 | #1 支持完整历史字段,也支持基础字段轻量请求;缺失 orderId 时设备生成 D 前缀订单号 | #CHARGE-START,idx,chn,orderId,amount,订单编号和金额必填 | 私有协议兼顾旧完整会话配置与新轻量入口,开放协议固定订单金额模型 | 私有轻量格式使用设备级自停和费率配置;完整字段仍按旧位置解析,不允许半截配置 |
| 结束充电传参 | 现有 #2,idx,deviceNo,chn[,orderId],订单编号为空或 0 时不校验 | #CHARGE-STOP,idx,chn,orderId,订单编号必填且必须匹配 | 私有协议允许无订单停止,开放协议强调订单一致性和对账安全 | 现有 #2 保持可选订单编号策略;如需强订单校验,应新增私有 #STOP_CHARGE,不改变 #2 |
| 充电类型 | 现有 #1 使用 chargeType=0/2 表示计时类,1/3 表示金额/计量类,且 3 会转换为内部计量类处理 | 当前开放协议没有显式充电类型,按金额订单启动 | 私有协议支持多充电类型,开放协议当前固定为金额预付模型 | 统一新增字段时只允许追加到新语义指令或开放协议尾部;现有私有 #1 的 chargeType 取值和位置不修改 |
| 结束充电判断条件 | 现有私有停止可由平台 #2、设备自停 #5、解绑 #A、掉电等触发;#2 无订单或订单匹配即可停止 | 开放协议平台停止必须订单匹配;设备自停用 #AUTO-STOP 并等待平台确认 | 私有停止入口更多,订单约束弱;开放停止链路更适合对账,但对旧平台容错较低 | 底层统一为 端口有效 + 会话存在 + 停止来源 + 订单策略;私有现有指令沿用原订单策略,新增强校验能力走新指令 |
| 计费方式 | 现有私有计费配置可随 #1 会话下发;服务费类型支持时间/电量等历史字段;费用摘要使用私有字段组 | 开放协议通过 #RATE-SET 设置设备级费率,电费/服务费模式使用 E/T;费用通过查询、自停、停止响应返回 | 私有更像“订单携带计费规则”,开放更像“设备持有计费模型”;两者费用字段和单位可复用,但配置入口不同 | 统一底层 rateConfig 和 billingSnapshot;私有新增 #RATE_* 后可支持设备级费率,现有 #1 会话费率继续保持原语义 |
4 统一后的流程建议
text
明文报文
-> 当前协议适配器按 productCategory 隔离命名空间
-> commandMap 将协议指令映射为统一语义指令
-> fieldSpec 校验字段位置、类型、单位和可选字段
-> 转换为协议无关请求对象
-> proto_ops / charge_engine / data_model 执行业务动作
-> 适配器按当前协议返回码和字段格式组包建议模块划分:
| 模块 | 职责 | 说明 |
|---|---|---|
protocols/open_adapter.lua | 开放协议指令表和字段映射 | 保持开放协议文本独立 |
protocols/private_adapter.lua | 私有协议现有指令和新增语义化指令映射 | 现有旧指令保持正式有效,新指令只补齐缺失能力 |
protocols/adapter_utils.lua | 字段清洗、端口数量、身份信息、费用快照辅助 | 两套协议共用 |
core/proto_ops.lua | 协议无关启停充、查询、自停确认、参数应用 | 不感知 #1、#CHARGE-START 等文本指令 |
core/data_model.lua | 费率、工作参数、订单快照的数据模型 | 统一计费配置和校验规则 |
5 实施步骤
5.1 私有协议线
- 锁定私有协议现有旧指令的既有字段顺序;V2.0.8 仅通过尾部追加方式扩展心跳、掉电和
#7状态字段。 - 已在私有适配器中新增
#RATE_QUERY、#RATE_SET、#PARAM_QUERY、#PARAM_SET等语义化指令。 - 已支持私有
#1轻量格式;强订单停止仍保持旧#2兼容策略,后续如需更严格模型再新增#STOP_CHARGE。 #RATE_*和#PARAM_*使用设备级配置读写;费率读写带rateModelId和rateHash/配置摘要确认,现有#1的会话配置继续只影响当前订单。- 已补充静态回归检查并完成实机测试,暂未发现问题。
5.2 开放协议线
- 保持现有开放协议指令不改名。
- 已补充
#DROP_POWER、#BIND_DEVICE、#CARD_VERIFY、#UPGRADE,分别对应私有现有#DROP/#A/#B/#UPGRADE。 #CHARGE-START保持 5 字段启动格式,不追加费率配置、rateModelId或rateHash;如后续确需更复杂启动模型,应新增语义化指令或可选断言字段,并保持基础 5 字段兼容。- 继续保持费率和工作参数为独立设备级配置,不把完整费率塞入开启充电指令;启充前由平台通过
#RATE-QUERY/#RATE-SET完成设备级费率同步。 - 补充开放协议 golden packet:新增刷卡、绑定、掉电、升级,以及启动尾部扩展缺省行为。
6 风险与兼容保障
| 风险点 | 影响 | 保障措施 |
|---|---|---|
| 误改私有旧指令 | 旧平台无法解析或误停充 | 除 #7 废弃/迁移期兼容策略外,私有现有旧指令不改名、不删除、不调整字段;新增能力一律走 #* |
| 新增指令被理解为替代旧指令 | 平台迁移误判,导致兼容风险 | 文档和代码中明确“新增只补齐能力,不替代旧指令” |
| 开放与私有同名指令混淆 | 平台误发后被错误解析 | 继续由 productCategory 隔离协议适配器 |
| 启动字段扩展 | 老开放平台只发 5 字段 | #CHARGE-START 基础协议保持 5 字段;费率同步不通过启充字段扩展实现 |
| 费率来源冲突 | 会话费率与设备级费率不一致 | #RATE_SET/#RATE-SET 只更新设备级费率并影响后续订单;旧 #1 会话费率仅作用于当前订单,且通过 rateHash 或配置摘要确认设备级配置 |
| 订单校验策略差异 | 停止充电对账异常 | 新语义指令强订单校验,旧私有 #2 保留弱校验兼容 |