简电云 | 充电桩协议云快充1.6充电枪二维码扩展协议的兼容设计与实现

简介: 云快充1.6二维码协议兼容方案:统一适配三种厂商私有扩展——A(前缀拼接)、B(单枪完整URL)、C(固定150字节)。涵盖命令码、编码规则、端序、BCD/BIN差异及幂等重试机制,强调真机联调与厂商确认。

云快充 1.6 主要解决充电桩与运营平台之间的通信,二维码显示并没有统一命令。实际项目中,不同设备厂商会在基础协议上增加私有扩展:有的只下发 URL 前缀,由充电桩拼接桩号和枪号;有的按枪下发完整 URL;还有的使用固定长度字段保存二维码内容。

本文根据三组项目材料,对这些扩展进行统一设计。由于材料没有标注公司归属,文中以“扩展 A、B、C”代称。生产实施仍应以设备厂商确认的协议版本和真机联调结果为准。

一、三种扩展有什么区别

对比项 扩展 A:前缀拼接 扩展 B:完整 URL 扩展 C:固定内容
下发/应答命令 0xF0 / 0xF1 0x9C / 0x9B 0x5A / 0x59
下发范围 整桩 单枪 单枪
桩编号 BCD 7 字节 下发数据域不携带 BCD 7 字节
枪号 由格式决定是否拼接 BIN 1 字节 BCD 1 字节
二维码内容 ASCII 变长前缀 ASCII 变长 URL ASCII 固定 150 字节
长度字段 BIN 1 字节 BIN 2 字节
最大长度 200 字节 200 字节 固定 150 字节
成功码 0x00 0x01 0x01

最容易出错的地方有三个:

  • 0xF10x00 表示成功,而 0x9B0x590x01 才表示成功;
  • 扩展 B 的枪号是 BIN,扩展 C 的枪号是 BCD;
  • 长度是编码后的字节数,不是 Java 字符串长度。

二、三种协议的数据域

扩展 A:0xF0/0xF1

0xF0 下发数据域:

字段 类型 长度 说明
桩编号 BCD 7 字节 14 位编号,不足补零
二维码格式 BIN 1 字节 0x000x01
前缀长度 BIN 1 字节 不超过 200
二维码前缀 ASCII 变长 URL 前缀

两种格式的拼接规则为:

格式 0:前缀 + 14 位桩编号
格式 1:前缀 + 14 位桩编号 + 2 位枪编号

例如:

前缀:https://q.example.com/?No=
桩号:34220001000233

格式 0:https://q.example.com/?No=34220001000233
格式 1:https://q.example.com/?No=3422000100023301

0xF1 应答由 7 字节 BCD 桩编号和 1 字节结果组成:0x00 成功,0x01 失败。

扩展 B:0x9C/0x9B

0x9C 按枪下发完整 URL:

字段 类型 长度 说明
枪号 BIN 1 字节 充电枪号
URL 长度 BIN 2 字节 ASCII 字节数
URL ASCII 变长 最大 200 字节

该命令不携带桩编号,目标设备由当前 TCP 会话确定。URL 长度字段的端序在材料中没有明确说明,必须通过厂商黄金报文或真机测试确认,不能根据 Java 默认端序猜测。

0x9B 应答由 7 字节 BCD 桩编号、1 字节 BIN 枪号和 1 字节结果组成:0x00 失败,0x01 成功。

扩展 C:0x5A/0x59

0x5A 下发固定长度二维码内容:

字段 类型 长度 说明
桩编号 BCD 7 字节 14 位编号,不足补零
枪号 BCD 1 字节 0x01 表示 1 号枪
二维码内容 ASCII 固定 150 字节 不足补 0x00

二维码内容可以采用:

https://q.example.com/qr?c=<设备编号><枪号>

0x59 应答由桩编号、BCD 枪号和设置结果组成:0x00 失败,0x01 成功。固定内容域必须补足 150 字节,不能省略尾部的 0x00

三、兼容层设计

三种扩展应复用现有云快充 1.6 基础帧,只负责命令数据域:

业务配置
  -> 二维码扩展适配器
  -> 数据域 byte[]
  -> 云快充基础帧编码器
  -> TCP 会话

通过设备型号和固件版本选择适配器,不要只根据品牌名称判断。同一厂商的不同固件也可能使用不同命令。

public enum QrProtocol {
   
    PREFIX_F0_F1,
    URL_9C_9B,
    FIXED_5A_59
}

public interface QrExtensionCodec {
   
    QrProtocol protocol();

    QrCommand encode(QrSetting setting, QrCapability capability);

    QrAck decodeAck(byte frameType, ByteBuffer payload);
}

public record QrCommand(byte frameType, byte[] payload) {
   }

public record QrAck(
    QrProtocol protocol,
    String deviceNo,
    Integer connectorNo,
    boolean success,
    int rawResult
) {
   }

能力配置至少包含协议类型、最大长度、长度字段端序、断电是否保存以及登录后是否需要重发。找不到明确配置时,不要轮流尝试三个命令,以免旧固件错误处理未知帧。

四、Java 编码实现

先把 14 位桩号转换为 7 字节 BCD:

static byte[] encodeDeviceNo(String value) {
   
    if (value == null || !value.matches("\\d{1,14}")) {
   
        throw new IllegalArgumentException("invalid deviceNo");
    }
    String digits = "0".repeat(14 - value.length()) + value;
    byte[] result = new byte[7];
    for (int i = 0; i < result.length; i++) {
   
        int high = digits.charAt(i * 2) - '0';
        int low = digits.charAt(i * 2 + 1) - '0';
        result[i] = (byte) ((high << 4) | low);
    }
    return result;
}

static byte encodeBcd(int value) {
   
    if (value < 0 || value > 99) {
   
        throw new IllegalArgumentException("BCD value out of range");
    }
    return (byte) (((value / 10) << 4) | value % 10);
}

三种数据域的核心编码如下:

// 0xF0:桩号 + 格式 + 一字节长度 + 前缀
static byte[] encodeF0(String deviceNo, int format, byte[] prefix) {
   
    if (prefix.length > 200) throw new IllegalArgumentException("prefix too long");
    ByteBuffer out = ByteBuffer.allocate(9 + prefix.length);
    return out.put(encodeDeviceNo(deviceNo))
        .put((byte) format)
        .put((byte) prefix.length)
        .put(prefix)
        .array();
}

// 0x9C:BIN 枪号 + 两字节长度 + 完整 URL
static byte[] encode9c(int connector, byte[] url, ByteOrder byteOrder) {
   
    if (url.length > 200) throw new IllegalArgumentException("url too long");
    ByteBuffer out = ByteBuffer.allocate(3 + url.length).order(byteOrder);
    return out.put((byte) connector)
        .putShort((short) url.length)
        .put(url)
        .array();
}

// 0x5A:桩号 + BCD 枪号 + 固定 150 字节内容
static byte[] encode5a(String deviceNo, int connector, byte[] content) {
   
    if (content.length > 150) throw new IllegalArgumentException("content too long");
    ByteBuffer out = ByteBuffer.allocate(158);
    out.put(encodeDeviceNo(deviceNo)).put(encodeBcd(connector)).put(content);
    while (out.hasRemaining()) out.put((byte) 0x00);
    return out.array();
}

调用前还要严格校验 ASCII。不要直接用字符数作为长度,也不要让不可编码字符被静默替换为问号。若 URL 中包含中文,应先完成百分号编码,再检查最终 ASCII 字节数。

应答解析也必须归属具体适配器:

boolean success = switch (protocol) {
   
    case PREFIX_F0_F1 -> rawResult == 0x00;
    case URL_9C_9B, FIXED_5A_59 -> rawResult == 0x01;
};

五、下发与重试

二维码设置应作为异步任务处理:

PENDING -> SENT -> ACK_SUCCESS
                -> ACK_FAILED
                -> TIMEOUT

扩展 A 的应答不带枪号,可按设备会话和协议序列号关联;扩展 B、C 还应校验枪号。收到重复应答时保持幂等。

设备断电后是否保存二维码,各材料没有统一结论。平台可以维护“期望配置版本”和“设备最后确认版本”,在设备登录后按能力配置决定是否重发。扩展 A 下发一次,扩展 B、C 按枪下发。

超时不代表设备一定没有写入,因此重试必须可幂等。同一枪存在多条待处理任务时,只发送最新配置;格式错误、长度超限和能力不匹配不应重试。

六、二维码内容设计

二维码尽量使用 HTTPS 短链接:

https://q.example.com/c/4Yp7kN2m

不要在 URL 中放入手机号、用户令牌、价格或内部数据库主键。扫码后由服务端把公开 ID 映射到设备和枪口。

协议允许 150 或 200 字节,不代表应该用满。URL 越长,二维码越密,在小尺寸或低分辨率屏幕上的识别率越差。优先使用短域名、短路径和服务端映射。

协议日志记录设备号、枪号、命令码、序列号、内容哈希、长度和结果码即可,默认不要打印完整 URL。

七、测试重点

上线前至少覆盖以下用例:

用例 预期结果
14 位桩号 编码为 7 字节 BCD
扩展 B 的 12 号枪 BIN 0x0C
扩展 C 的 12 号枪 BCD 0x12
URL 为 200 字节 允许
URL 为 201 字节 拒绝
扩展 C 内容不足 150 字节 0x00
0xF1 返回 00 成功
0x9B0x59 返回 01 成功
应答长度不正确 拒绝解析

每种扩展还需要一组厂商确认的完整十六进制报文,逐字节验证编码结果。真机测试不能只看应答成功,还要确认二维码是否显示在正确枪口、扫码内容是否完全一致,以及断电重启后是否需要重新下发。

总结

云快充二维码扩展的难点不在生成二维码,而在兼容协议差异:0xF0/0xF1 下发前缀,0x9C/0x9B 按枪下发变长 URL,0x5A/0x59 下发固定 150 字节内容。三者的枪号编码、长度字段和成功码并不统一。

实现时应保留统一的云快充基础帧,为每种扩展建立独立适配器,并根据设备型号和固件能力选择协议。端序、BCD 补零方向和断电保存策略等材料未明确的内容,必须通过厂商确认和真机测试后再上线。

本文中的域名、桩号和二维码内容均为演示数据,命令定义来自项目提供的三份扩展材料,不代表公开行业标准。

相关文章
|
13天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
|
13天前
|
人工智能
千问办公官网入口:阿里AI办公QwenWork产品页和免费网页端链接
千问办公官网含两大入口:一是网页端(qwenwork.cn),即开即用,支持浏览器直接访问;二是阿里云产品页 https://t.aliyun.com/U/JNKJuO 提供免费/付费版详情、功能介绍及使用指南。
|
12天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1513 8
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
|
14天前
|
缓存 人工智能 自然语言处理
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
本文是阿里云百炼平台Qwen3.8-Flash大模型的选型接入指南,作为兼顾性能与响应速度的高性价比多模态模型,它支持百万级上下文窗口、全场景多模态输入与完整智能体能力矩阵,适配编程辅助、智能体协作等核心场景。文中同步梳理了最新下调的阶梯定价、夜间4折等优惠活动,搭配OpenAI兼容流式调用示例,帮助开发者低成本快速落地高并发AI应用。
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
|
13天前
|
人工智能 API 内存技术
刚刚 DeepSeek V4.1 Flash 开启内测,1 分钟教你用上!
刚刚 DeepSeek 内测群发布了 DeepSeek V4.1 Flash 中间版本内测的消息,这次的模型采用了新的结构,原生支持多模态、能力更强、速度更快、且成本更低。
1990 15
|
7天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
|
18天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1691 4
|
12天前
|
人工智能 安全 JavaScript
DeepSeek Harness开源Agent运行框架实战:4种安装方式、WebUI启动、插件管理与排坑全流程
随着AI Agent技术快速发展,单纯依靠大模型对话能力,很难完成复杂的自动化任务。模型需要具备读取本地文件、执行脚本、访问网页、操作文件系统、拆分复杂任务并分步执行的能力。DeepSeek Harness,简称DSH,是开源的AI Agent执行运行框架,遵循“Agent = 大模型 + Harness执行底座”的设计理念,为大模型提供一套安全可控的工具调用、任务编排、沙箱执行与插件扩展能力。它提供Web可视化界面与完整命令行工具,支持插件化扩展,能够让大模型自主拆解复杂需求,调用各类工具分步完成目标,无论是本地电脑调试,还是部署在云服务器上长期运行智能体任务都十分合适。本文为从0到1完整保
897 0
|
14天前
|
缓存 JSON API
阿里云千问Qwen3.8‑Max深度解析:核心能力、订阅计费规则、API接入配置与生产落地完整教程
Qwen3.8‑Max作为千问系列新一代MoE架构旗舰基座,总参数量达到2.4万亿,激活参数950亿,是面向复杂专业任务、长周期智能体、工程级代码开发、多模态深度解析的高阶大模型,原生支持文本、图像、视频多模态输入,最大上下文窗口达到百万Token,最大输出Token支持131072,内置深度思考推理链路,在编程、科研、法律金融专业分析、长视频文档解析、自主Agent任务等场景能力表现突出。很多开发者在项目前期直接接入该旗舰模型,却对模型能力边界、多种计费模式、订阅套餐权益、API参数配置、上下文缓存优化缺乏完整认知,出现成本失控、接口报错、长文本信息丢失、深度思考模式额外消耗大量Token等
974 3