摘要:本文介绍一款可解释的 AUTOSAR 协议栈仿真工具,它从 PHY 一路跑到 DoIP / UDS,导出 pcap 后在 Wireshark 里逐字节对账。工具零依赖、纯前端、数据不出本地,内置演示模式(15 阶段 / 331 步 / 80 帧)和 10 个独立场景,对每一帧都回答“这个字节是谁加的、为什么是这个值、怎么证明它是对的”三个问题,帮助读者看清整条通信链路每一层的职责与数据流向。
从 PHY 一路跑到 DoIP / UDS,导出 pcap,在 Wireshark 里逐字节对账。
零依赖 · 纯前端 · 数据不出本地 | 演示模式 15 阶段 / 331 步 / 80 帧 | 另有 10 场景(含 S0 上电初始化 30 步) · 90 帧 · 7697 字节 · 518 项独立检查

0 · 这份工具是什么
它不是“报文生成器”,而是一个可解释的协议栈。区别在于:普通生成器给你一堆字节,这份工具对每一帧都回答三个问题——
- 这个字节是谁加的? —— COM / PduR / SoAd / TcpIp / EthIf / Eth / EthTrcv / PHY,每层各记各的账。
- 为什么是这个值? —— 每个字段都带一句人话说明,包括“写错会怎样”。
- 怎么证明它是对的? —— 构造时算一次,从最终字节反读再算一次,再让 Python 从零解析一遍。
界面导览
打开工具默认是演示模式:它不是把 10 个场景排成一列,而是一条连续跑完的链路——一个仿真器实例从复位矢量一路跑到“导出对账”,全程 15 个阶段、331 步、80 帧。顶栏右侧的「切换」按钮可以在演示模式与场景模式之间来回切。
| 模式 | 内容 | 适合什么时候用 |
|---|---|---|
| 演示模式(默认) | 15 阶段 / 331 步 / 80 帧,一个 Sim 连续跑 | 想看清"整条链路到底怎么连起来"——ARP 完了才能发 IP,TCP 连上了才能做诊断 |
| 场景模式 | 10 个场景各自独立重放 | 想死磕某一个协议细节(比如只看 S8 的 UDS 全流程) |
阶段表与步号口径
顶栏显示 步骤 N / M,其中 M 是当前阶段的累计结束步号**,不是总步数。停在 ARP 阶段末尾时就是 64 / 64。这条口径很关键:它让你随时知道“我在整条链路的哪一段、这一段还有多长”。
| # | 阶段 | 步数 | 起–止 | 主要产出 |
|---|---|---|---|---|
| 1 | 上电初始化 | 36 | 1–36 | 0 帧——只做初始化,但决定后面能不能通 |
| 2 | ARP 地址解析 | 28 | 37–64 | 2 帧 ARP(广播请求 + 单播应答) |
| 3 | 周期报文发送 | 11 | 65–75 | 1 帧 SOME/IP,完整走一遍 9 层发送链 |
| 4 | 报文接收 | 39 | 76–114 | 3 帧,走 3 遍 9 层接收链 + DMA/过滤/时间戳 |
| 5 | ICMP 连通性 | 12 | 115–126 | 1 帧 ping(ICMP 无伪首部) |
| 6 | TCP 连接管理 | 14 | 127–140 | 3 帧三次握手 + 挥手规则 |
| 7 | SOME/IP-SD 服务发现 | 26 | 141–166 | 3 帧 SD(Offer / Find / 单播应答) |
| 8 | 方法远程调用 | 30 | 167–196 | 4 帧(REQUEST / RESPONSE / ERROR) |
| 9 | 事件订阅与通知 | 28 | 197–224 | 3 帧(订阅 / Ack / 通知) |
| 10 | 字段读写 | 24 | 225–248 | 4 帧(Getter / Setter / Notifier) |
| 11 | CAN ↔ 以太网网关 | 22 | 249–270 | 2 帧以太网 + 4 帧 CAN(IpduM 容器) |
| 12 | DoIP 诊断连接 | 26 | 271–296 | 12 帧(找车 → 建链 → 激活 → 保活) |
| 13 | UDS 诊断路由 | 22 | 297–318 | 8 组 UDS 交换(10/27/22/2E/31/19/14/11) |
| 14 | 故障注入与恢复 | 10 | 319–328 | 12 帧(含 6 帧带故障,按可见性分类) |
| 15 | 完成与逐字节对账 | 3 | 329–331 | 0 帧——四种对账方式收尾 |
| 合计 | 331 | 1–331 | 80 帧 / 5419 字节 / 未归属字节 0 / 非预期异常 0 |
| 区域 | 内容 |
|---|---|
| 顶栏 | 运行状态(未启动 / 仿真运行中 / 已暂停 / 已完成)+ 阶段徽章(阶段 N/15 · 名称,颜色随阶段变)+ 步骤 N / M(M = 当前阶段的累计结束步号)+ 帧·收·发 + 故障 / 恢复 + 进度条(可拖到任意进度) + 链路速率 + 播放倍率 1×/2×/5× + 模式切换 + 连续运行(可中断)/ 单步 / 跑完全部 / 复位 / 导出 pcap / 导出对照表 / 全场景自检 |
| 左栏 | 场景阶段(15 个阶段,各自带一条进度条,点一下跳到该阶段末尾)、运行统计(2×5 共 10 项)、 AUTOSAR 模块树(高亮 = 当前层;上电阶段则显示就绪状态点:灰=未初始化,黄=待后续步骤,蓝=本步就绪,绿=已就绪)、导出选项 |
| 中栏 | 当前步骤:阶段徽章 + 标题 + 彩色分层标签胶囊(这一步涉及哪些层) → "做了什么 / 预期什么 / 本步产出"→ 日志 → 视图区 11 种(分层行走 / 网络拓扑 / 启动序列 / 时钟树 / 引脚复用 / 寄存器位段 / 配置表 / 路由 / 服务 / 信号表 / 观测与校验) → 路径面包屑(场景 › 阶段 › 步骤 › 视图 › 触发条件 › 本步产出)→ 附近步骤列表(可下断点) |
| 右栏 | 运行数据面板 6 个页签:报文列表 / 信号表 / 硬件寄存器 / 服务与订阅 / 网络拓扑 / 数据字段与路由,下方是选中帧的 5 个逐字节明细页签 |
| 底栏 | 步骤时间线:331 根竖条按阶段着色(已跑过实心、当前步高亮、有报文的那一步更高、 打过断点的顶部标红),点任意一根直接跳到那一步;右侧是运行状态条 |

| “为什么不直接抓实车的包来学?” | 实车抓包是结果,你不知道每个字节为什么是这个值;仿真器能让你看到过程——谁写的、为什么。两者互补,不是替代。 |
|---|---|
| “校验和为什么还要自己算?网卡不是会算吗?” | 正因为网卡会算(checksum offload),你抓到的包里校验和常常是还没填完的残值,Wireshark 会标 [incorrect]——那是抓包环境的假象。本工具导出的包校验和永远正确,可以拿它当正确参照物去反查真实抓包里的 offload 假错。 |
| “PduR 到底有什么用?” | 它是路由表:这条 PDU 走 UDP 还是 TCP、走哪个接口、要不要经过网关。它不碰数据,只决定数据的去向——所以它加 0 字节。 |
| “我工作中用得上哪部分?” | 做测试:用 S9 学会认故障特征;做诊断:S7+S8 是完整的 DoIP/UDS 链路;做通信:S2+S3 是 SOME/IP 的核心。 |
| “这个工具能发真包吗?” | 不能,也不该。它是教学与对账工具,不碰网卡、不联网,所以数据不出本地。 |
