附录B:协议审查与测试卡¶
本卡用于把一次协议接入、升级或故障修复转化为可复核记录。每个“通过”都必须关联证据;未知项保持未测试或阻断,不得默认勾选。
文中的复选框只是覆盖索引,不是测试结果。每个适用项都必须在第8节的执行记录表中单独填写环境、输入、预期、实际、证据和状态后,才允许勾选。
0. 安全与范围¶
测试编号:
负责人:
复核人:
日期、时间和时区:
测试环境:离线 / SITL / HITL / 无功率级波形负载 / 独立CAN测试总线 / 拆桨隔离台架 / 不适用
螺旋桨:已拆除 / 不适用
机体固定:是 / 否 / 不适用
执行器动力级:断开 / 物理失能 / 不适用
射频负载:匹配天线 / 额定假负载 / 不适用
辐射隔离:屏蔽环境 / 其他批准措施 / 不适用
频率与功率合法性:已核验 / 不适用
生产密钥:未使用
外部在役网络:未连接
紧急断电:已验证 / 不适用
允许的主动操作:
禁止的主动操作:
出现以下任一项立即停止:
- 螺旋桨仍安装;
- 执行器可能产生未受控动作;
- 图传没有匹配天线或额定假负载却可能进入发射状态;
- 仅有屏蔽或最低功率设置,却没有合法射频负载;
- 发射频率、功率、地点或用途未完成合法性核验;
- CAN异常注入会进入在役总线;
- 需要使用生产密钥验证伪造或重放;
- 接口电压、公共地或仪器额定范围未知;
- 当前版本、目标设备或测试边界不明确。
1. 身份冻结¶
| 项目 | 发送端 | 接收端 | 工具/网关 | 证据 |
|---|---|---|---|---|
| 硬件型号/修订 | ||||
| 固件版本 | ||||
| 提交 | ||||
| 构建目标 | ||||
| 构建选项 | ||||
| 本地差异 | ||||
| 协议规范版本 | ||||
| 消息定义/方言/DSDL | ||||
| 配置工具版本 |
2. 物理与电气¶
- 连接器、焊盘和针脚号已记录;
- 信号方向已记录;
- 供电电压与逻辑电平分别确认;
- 公共参考地或隔离方案明确;
- 反相要求明确;
- 全双工、半双工或单线明确;
- UART字符格式明确;
- CAN收发器、比特率和终端明确;
- 空闲电平和实测幅值符合要求;
- 探头不会造成短路或过度负载;
- 仅USB、低压供电和动力供电差异已记录。
证据:
3. 帧契约¶
| 项目 | 结论 | 来源 | 实测 |
|---|---|---|---|
| 帧头/同步 | |||
| 方向或地址 | |||
| 长度字段语义 | |||
| 最小帧 | |||
| 最大帧 | |||
| 多字节端序 | |||
| 位字段顺序 | |||
| 校验算法 | |||
| 校验初值 | |||
| 校验覆盖范围 | |||
| 帧间隔或换向 | |||
| 重同步规则 |
4. 消息契约¶
每个关键消息填写:
消息名称和ID:
方向:
请求/响应/广播:
最小和最大长度:
字段:
单位和比例:
坐标系:
枚举与保留值:
有效标志:
产生时间:
最大允许年龄:
序号或Transfer-ID:
重复处理:
乱序处理:
未知扩展处理:
错误响应:
5. 状态与权限¶
| 动作 | 来源要求 | 系统状态 | 幂等性 | 成功证据 | 失败/回滚 |
|---|---|---|---|---|---|
| 读取状态 | |||||
| 写参数 | |||||
| 保存配置 | |||||
| 修改端口 | |||||
| 切换模式 | |||||
| 解锁请求 | |||||
| 执行器命令 | |||||
| 重启/引导加载 | |||||
| 固件更新 |
检查:
- 地址或系统ID没有被当作认证;
- 校验或CRC没有被当作认证;
- 认证成功后仍执行授权和状态门禁;
- 超时与明确失败分开;
- 非幂等动作不会盲目重试;
- 断线后最终状态可以重新判定;
- 拒绝原因和审计记录可观察。
6. 带宽¶
串口¶
| 方向 | 帧 | 完整字节/帧 | 帧/秒 | 位/字节 | bit/s |
|---|---|---|---|---|---|
| 上行 | |||||
| 下行 |
CAN¶
7. 时延与新鲜度¶
| 数据或动作 | 起点 | 终点 | P50 | P95 | P99 | 最大 | 门限 |
|---|---|---|---|---|---|---|---|
8. 正常样本¶
先为每个正常、负面、恢复和专项用例建立一行记录。期望结果或安全环境为空时禁止执行;证据为空时不得标记通过:
| 用例ID | 环境 | 前置状态 | 输入/动作 | 期望结果 | 实际结果 | 证据 | 状态 |
|---|---|---|---|---|---|---|---|
| 离线/SITL/HITL/无功率级波形负载/独立CAN测试总线/拆桨隔离台架/不适用 | 未测试/通过/不通过/阻断/不适用 |
环境必须取表中一个值。涉及畸形电气时序、总线争用、错误帧洪泛或DShot特殊命令边界的用例,优先选择离线模型或无真实功率级的专用负载,不能因为机体已拆桨就默认允许执行。
- 最短合法帧;
- 最大合法帧;
- 零长度或最小载荷;
- 载荷尾零;
- 最小和最大字段值;
- 请求和成功响应;
- 错误响应;
- 单帧与多帧;
- 启动后的第一帧;
- 稳态连续帧;
- 重启后的恢复;
- 不同方向同时传输;
- 工具与设备显示一致。
每个样本还要在证据中包含文件、SHA-256摘要、原始字节或帧、校验复算和应用结果。
9. 负面和边界样本¶
- 帧头逐字节截断;
- 固定头完整但长度缺失;
- 长度小于最小值;
- 长度大于协议上限;
- 长度合法但超过本地缓冲;
- 载荷逐字节截断;
- 校验缺失;
- 校验错误;
- 未知消息;
- 未知兼容标志;
- 未知不兼容标志;
- 非法枚举;
-
NaN、无穷大或超范围数值; - 重复帧;
- 乱序帧;
- 过期帧;
- 噪声后合法帧;
- 载荷内嵌帧头;
- 队列满;
- 计数器回绕;
- 设备重启;
- 网关重启;
通过标准:
- 不崩溃;
- 不越界读写;
- 不无限循环;
- 不无界分配;
- 不执行部分命令;
- 错误分类正确;
- 错误日志限速;
- 后续合法帧可恢复;
- 高风险动作未发生。
10. 认证与防重放¶
测试:
- 正确认证;
- 错误认证;
- 缺失认证;
- 内容被修改;
- 相同帧重放;
- 旧时间戳或序号;
- 相同时间戳或序号;
- 发送端重启;
- 接收端重启;
- 多链路;
- 凭据轮换;
-
SETUP_SIGNING只在安全直连链路定向发送; -
SETUP_SIGNING的42字节完整解码布局、64位小端initial_timestamp和合法尾零裁剪已验证; - 初始时间戳没有回退接收端已接受的防重放状态;
-
SETUP_SIGNING广播被禁止; - 网关不会自动转发
SETUP_SIGNING; - 日志省略
SETUP_SIGNING或把32字节秘密替换为固定脱敏值; - 认证成功但状态不允许的命令仍被拒绝。
所有测试使用临时凭据和隔离环境,证据中不得包含密钥值。
11. 协议专项检查¶
CRSF¶
- 飞行端416666波特、8N1、非反相条件已核对;
- 常见420000兼容实现没有被误写成规范唯一值;
-
Length为2至62,完整帧不超过64字节; - CRC-8多项式
0xD5且覆盖Type至Payload; - 扩展帧目标和来源进入CRC;
- Direct Command命令CRC使用多项式
0xBA并覆盖类型、目标、来源、命令ID和命令载荷; - 外层CRC正确但Direct Command命令CRC错误时被拒绝;
- 16个11位通道按22字节连续位流解码;
- 空中协议与机内CRSF分开;
- 通道帧、链路统计和失联分别判断。
SBUS¶
- 100000波特、8E2和反相路径已核对;
- 固定25字节;
- 16个11位模拟通道;
- 数字通道17/18、帧丢失和失联位已解析;
- 未强制假设所有实现末字节为
0x00; - Fast SBUS仅在两端共同支持时启用;
- 缓存通道值没有覆盖失联状态。
Classic F.Port¶
- 固定范围为Classic F.Port,没有套用到F.Port 2.0或FBUS;
- 115200波特、8N1;
-
0x7E帧边界和0x7D转义已验证; - FrSky折叠加法校验已复算;
- 控制、遥测请求和遥测响应类型已区分;
- 有效请求后500至2000微秒响应窗口已测量;
- 错误长度、校验或类型不会触发遥测发送;
- 反相、半双工、线路释放和本机回显已验证;
- F.Port 2.0或FBUS若使用,已建立独立规范和测试卡。
MAVLink 2¶
- Magic为
0xFD; - 24位消息ID按低字节先传;
- 载荷尾零截断已测试;
- CRC覆盖头部和实际载荷并加入
CRC_EXTRA; - 扩展字段不改变旧消息
CRC_EXTRA; - 未知不兼容标志导致丢弃;
- 签名块为1+6+6字节;
- 签名明确不加密;
- 防重放按SystemID、ComponentID和LinkID维护;
- 线上原始帧用于证明签名,未只依赖
tlog。 -
SETUP_SIGNING未广播、未自动转发、未泄露到日志。
MSP¶
- v1方向、长度、命令和XOR正确;
- native v2的16位小端命令和长度正确;
- v2 CRC-8/DVB-S2覆盖范围正确;
- v2-over-v1命令255和双层校验正确;
- Betaflight固定接收器的内外长度偏差已做差分测试;
- 线格式版本与MSP API版本分开;
- 192字节接收缓冲与发送侧Jumbo单向边界已验证;
- 未知命令优雅失败;
- DisplayPort与视频码流分开。
DShot¶
- 11位数值、1位请求、4位校验;
- 0、1至47、48至2047已在离线编码器覆盖;
- 1至47未在实物上逐值扫描;
- 双向模式发送波形和校验反相;
- 传统遥测请求位未被当作双向回包开关;
- 返回GCR解码和校验已验证;
- eRPM周期、极对数和机械RPM分开;
- EDT返回槽与eRPM返回槽分开解释;
- EDT命令13/14、至少6次要求、固定实现10次行为和版本帧已验证;
- DShot释放后30微秒EDT响应边界已测量;
- 实物特殊命令逐项记录名称、目标、重复次数、预期副作用和可逆性;
- 特殊命令后冷启动并复核电机方向和电调持久状态。
DroneCAN/Cyphal¶
- 29位扩展ID布局按正确协议解释;
- 广播消息与点对点服务分开;
- 优先级0最高;
- Tail byte起止、Toggle和Transfer-ID正确;
- DroneCAN多帧CRC位于数据流开头;
- DroneCAN多帧CRC按低字节、再高字节传输;
- 单帧没有额外传输CRC;
- Transfer-ID状态按传输描述符维护;
- 模32回绕和2秒内重复已测试;
- 发送端映射删除后从Transfer-ID 0重建;
- 接收端2秒超时后可接受新的合法起始序列;
- 1秒传输中止和服务响应等待边界已测试;
- DroneCAN/UAVCAN v0与Cyphal/UAVCAN v1未混用;
- Classic CAN和CAN FD MTU一致;
- 节点ID冲突和重启已测试。
SmartAudio/Tramp¶
- SmartAudio为非反相单线半双工;
- SmartAudio主机命令和响应命令编码分开;
- 发送与接收CRC覆盖按固定实现核对;
- 自适应波特率未写成协议协商;
- Tramp控制焊盘、线数、TX/RX选择、驱动方式和回读路径均有硬件修订证据;
- 未把两个推挽输出直接相连;
- Tramp固定16字节;
- Tramp字节1至13做8位模加和;
- 写入后重新查询实际状态;
- 图传控制、OSD和视频载荷三条路径分开。
12. 恢复与回归¶
- 恢复原端口、速率和协议;
- 删除临时密钥;
- 恢复射频合法配置;
- 射频负载、屏蔽和合法性三项重新确认;
- 恢复终端和线束;
- 冷启动;
- 重新读取身份和配置;
- DShot特殊命令测试后逐个复核电机方向和电调持久状态;
- 正常输入、失联和恢复回归;
- 执行器仍处于物理安全状态;
- 错误计数回到已知基线;
- 原始证据和摘要归档;
- 未完成项进入问题单;
- 独立复核人签署。
结论¶
存在任一未关闭的阻断项时,整体结论必须为阻断,不能被局部通过或受限通过覆盖。
本卡通过只说明固定组合在记录范围内满足协议测试,不表示实体机已经通过动力、飞行、射频或法规放行。