产品通用协议 · V1
PRODUCT COMMON PROTOCOL / V1

产品通用协议

所有产品共用命令分段与报文含义;UART / RS485、BLE 透传和 Wi‑Fi TCP 使用 COBS 分帧,CAN / CAN FD 接入使用 ISO-TP。各产品的业务命令只能占用 0x50–0xEF。

01 CMD 分段

范围归属用法
0x00无效禁止使用
0x01–0x1F系统命令所有项目保持一致
0x20–0x2FOTA 命令支持升级的项目保持一致
0x30–0x3F通用预留当前不得使用
0x40–0x4F通用业务由底座协议统一定义
0x50–0xEF产品业务各产品独立定义
0xF0–0xFF调试 / 工厂不作为公开接口

02 命令报文与接口分帧

CMD1字节
SEQ1字节
PAYLOAD0..N 字节
CRC162字节

原始命令报文为 CMD + SEQ + PAYLOAD + CRC16。UART / RS485 单设备点对点、BLE 透传和 Wi‑Fi TCP 使用 COBS(原始命令报文) + 00;CAN / CAN FD 使用 ISO-TP 承载原始命令报文,不使用 COBS。RS485 多设备共线尚未定义。CRC 为 CRC-16/CCITT-FALSE,poly=0x1021、init=0xFFFF、xorout=0,覆盖 CMD、SEQ、PAYLOAD。多字节整数小端。分帧解码或 CRC 失败的报文直接丢弃,不回复。

主机请求 SEQ=1..255;响应回显 CMD 和 SEQ。SEQ=0 留给设备主动事件。每条物理链路最多一个未完成请求;超时重发必须保持完全相同的 CMD、SEQ、PAYLOAD。响应 PAYLOAD 的首字节固定为 Result。MaxPayload 从“获取设备信息”读取,协议上限 1024 字节。

03 通用结果码

值名称含义
0x00OK最终成功
0x01ACCEPTED异步命令已接收,后续还会返回最终结果
0x02BUSY设备忙
0x03BAD_COMMAND不支持 CMD
0x04BAD_PAYLOAD长度或内容错误
0x05BAD_STATE当前状态不允许
0x06BAD_SEQUENCESEQ 冲突或重复请求不一致
0x07VERIFY_FAILED校验失败
0x08IO_ERRORFlash、外设或链路错误
0x09TIMEOUT操作超时
0x0AINTERNAL_ERROR内部错误

除命令另有规定外,非 OK 的最终响应和 ACCEPTED 中间响应都只带一个 Result 字节。

04 系统命令 · 0x01–0x1F

0x01

Get Info 获取设备信息

请求 PAYLOAD空
成功响应 PAYLOAD · 19字节Result(1字节) + ProtocolVersion(1字节) + TargetID(4字节) + HWVersion(2字节) + Mode(1字节) + BootVersion(4字节) + AppVersion(4字节) + MaxPayload(2字节)

ProtocolVersion=1;Mode=0 引导程序,1 应用程序。目标ID 用于固件兼容校验;最大负载是解码后的 Payload 最大长度,最高 1024。

0x02

Get UID 获取设备 UID

请求 PAYLOAD空
成功响应 PAYLOAD · 13字节Result(1字节) + UID(12字节)

UID 是固定的 12 字节原始数据,不是十六进制文本;引导程序与应用程序返回同一个 UID。

0x03

Reboot 重启设备

请求 PAYLOAD空
成功响应 PAYLOAD · 1字节Result(1字节)

先完整发送 OK 响应,再复位;OTA 正在进行时返回 BAD_STATE。

0x04

Enter Boot 进入引导程序

请求 PAYLOAD空
成功响应 PAYLOAD · 1字节Result(1字节)

应用程序写入引导程序保持标志,发完 OK 响应后复位进入 Boot;引导程序收到时返回 BAD_STATE。

05 通用业务命令 · 0x40–0x4F

以下命令在产品通用协议中定义,由产品应用程序或工厂固件按需实现;当前基础库的核心分发器未直接实现这些命令。

0x40

Product SN Read 读取产品序列号

请求 PAYLOAD空
成功响应 PAYLOAD · 3+N 字节Result(1字节) + Provisioned(1字节) + SNLength(1字节) + SN(N字节)

未写入时 已写入标志=0、N=0;已写入时 已写入标志=1、N=1..32。SN 只允许 ASCII 大写字母、数字和连字符。

0x41

Product SN Write 写入产品序列号

请求 PAYLOAD · 1+N 字节SNLength(1字节) + SN(N字节)
成功响应 PAYLOAD · 2+N 字节Result(1字节) + SNLength(1字节) + SN(N字节)

N=1..32;仅首次写入且具备工厂状态或物理授权。持久化并回读通过后才回复 OK。

0x42

HW Version Read 读取硬件版本

请求 PAYLOAD空
成功响应 PAYLOAD · 4字节Result(1字节) + Provisioned(1字节) + HWVersion(2字节)

未写入时 已写入标志=0、硬件版本=0;写入后与“获取设备信息”返回的硬件版本一致。

0x43

HW Version Write 写入硬件版本

请求 PAYLOAD · 2字节HWVersion(2字节)
成功响应 PAYLOAD · 3字节Result(1字节) + HWVersion(2字节)

硬件版本不得为 0;默认只允许首次写入且需工厂状态或物理授权。已写入不同值时拒绝。

06 OTA 命令 · 0x20–0x2F

一个 Flash 区域执行 开始 → 写入… → 校验 → 提交;区域升级失败可使用“取消升级”。除“开始升级”和“查询升级状态”外,命令中的 Session 必须匹配当前会话。下面的长度是解码后的 PAYLOAD 长度。

0x20

OTA Begin 开始升级

请求 · 20字节TargetID(4字节) + FlashOffset(4字节) + RegionSize(4字节) + DataSize(4字节) + DataCRC32(4字节)
成功响应 · 9字节Result(1字节) + Session(4字节) + NextOffset(4字节)

TargetID 必须匹配设备;区域须精确匹配可写白名单。成功前完成必要擦除;新会话 下一偏移=0。DataCRC32 使用 CRC-32/ISO-HDLC。

0x21

OTA Data 写入升级数据

请求 · 8+N 字节Session(4字节) + Offset(4字节) + Data(N字节)
成功响应 · 5字节Result(1字节) + NextOffset(4字节)

N≥1,且 8+N≤MaxPayload。新分片 偏移必须等于下一偏移;写入并校验后才能返回新偏移。

0x22

OTA Verify 校验升级数据

请求 · 4字节Session(4字节)
成功响应 · 5字节Result(1字节) + ActualCRC32(4字节)

检查接收完整,回读并计算区域 CRC32;可启动镜像同时验证镜像头和签名。校验操作不使区域生效。

0x23

OTA Commit 提交升级

请求 · 4字节Session(4字节)
成功响应 · 1字节Result(1字节)

仅在校验成功后提交;持久化和回读校验成功后才返回 OK。普通数据区不自动重启。

0x24

OTA Abort 取消升级

请求 · 4字节Session(4字节)
成功响应 · 1字节Result(1字节)

结束当前会话;若应用程序已被擦除,取消升级不保证恢复旧应用程序。

0x25

OTA Status 查询升级状态

请求空
成功响应 · 27字节Result(1字节) + State(1字节) + Session(4字节) + FlashOffset(4字节) + RegionSize(4字节) + NextOffset(4字节) + DataSize(4字节) + DataCRC32(4字节) + LastError(1字节)

状态:0 空闲、1 擦除中、2 接收中、3 校验中、4 已校验、5 提交中、6 应用中、7 错误。空闲时会话和进度字段为 0。接收中或已校验状态连续 30 秒无有效会话命令进入错误状态。

0x26

OTA Begin Encrypted 开始加密升级

请求 · 44字节TargetID(4字节) + FlashOffset(4字节) + RegionSize(4字节) + DataSize(4字节) + PlaintextCRC32(4字节) + EncryptionKeyID(4字节) + Nonce(12字节) + ImageVersion(4字节) + MinBootVersion(4字节)
成功响应 · 9字节Result(1字节) + Session(4字节) + NextOffset(4字节)

可选 AES-128-CTR 扩展,仅在引导程序模式用于符合条件的引导程序或应用程序整区。设备不支持时返回 BAD_COMMAND;主机不应自动回退到明文开始升级命令。后续写入升级数据命令传输密文。