4. 路由激活:路由激活请求/响应流程、激活类型(Default/PreProgramming/Programming)、安全认证机制

好,咱们进入第四章。路由激活,这个名字听起来挺唬人,对吧?

说白了,它就是DoIP通信里,客户端(比如你的诊断仪)和ECU之间建立“正式对话”的第一步。你想想看,物理层连上了,TCP也握上手了,但ECU凭什么听你的?你得先“激活”它,告诉它你是谁,你想干嘛。

4.1 路由激活请求/响应流程

这个流程其实不复杂。客户端发一个请求,ECU回一个响应。但这里面的门道,我当年可是踩过坑的。

先看请求报文的结构:

| 字节 | 字段名 | 描述 |
|------|--------|------|
| 0 | 协议版本 | 通常为0x02 (ISO 13400-2:2012) |
| 1 | 保留字节 | 固定为0x00 |
| 2-3 | 激活类型 | 见下文详解 |
| 4-7 | 保留字节 | 固定为0x00000000 |
| 8-11 | OBD保留字节 | 通常为0x00000000 |
| 12-15 | 认证方法 | 0x00=无认证, 0x01=安全认证 |
| 16-19 | 认证数据长度 | 认证数据的字节数 |
| 20-n | 认证数据 | 可选,根据认证方法填充 |

响应报文的结构:

| 字节 | 字段名 | 描述 |
|------|--------|------|
| 0 | 协议版本 | 与请求一致 |
| 1 | 保留字节 | 固定为0x00 |
| 2-3 | 响应代码 | 0x00=成功, 0x01=拒绝, 0x02=待认证... |
| 4-7 | 保留字节 | 固定为0x00000000 |
| 8-11 | 客户端逻辑地址 | ECU分配给客户端的临时地址 |
| 12-15 | OBD保留字节 | 固定为0x00000000 |
| 16-19 | 认证方法 | 与请求一致 |
| 20-23 | 认证数据长度 | 认证数据的字节数 |
| 24-n | 认证数据 | 可选 |

嗯,这里要注意。响应代码0x02(待认证)是个特殊状态。它表示ECU说:“我知道你想激活,但你先证明你是谁。” 这时候就需要走安全认证流程了。

核心要点: 路由激活请求必须在TCP连接建立后的5秒内发出。超过这个时间,ECU会主动断开连接。我见过不少测试用例,就是因为忽略了这5秒窗口期,导致激活失败。

4.2 激活类型:Default / PreProgramming / Programming

激活类型决定了你能对ECU做什么。三种类型,对应三种权限等级。

激活类型 权限范围 典型场景
Default (默认) 0x0001 读取诊断信息、清除故障码 售后维修、日常检测
PreProgramming (预编程) 0x0002 进入编程模式前的准备操作 刷写前的握手、安全解锁
Programming (编程) 0x0003 刷写ECU固件、配置数据 OTA升级、产线刷写

我个人习惯把PreProgramming和Programming看作一对“兄弟”。PreProgramming是敲门,Programming是进门。没有敲门,直接想进门?ECU会直接拒绝你。

我记得有一次做项目,客户反馈说ECU刷写总是失败。我排查了半天,发现是测试脚本里直接发了Programming激活,跳过了PreProgramming。ECU的逻辑是:你连预编程都没做,凭什么直接刷我?

避坑指南: 我曾经在测试中遇到过,某些ECU在PreProgramming状态下,会限制某些诊断服务的可用性。比如,你只能在PreProgramming状态下执行安全解锁,而Programming状态下才能执行写入操作。设计用例时,一定要确认ECU的具体行为。

4.3 安全认证机制

安全认证,说白了就是ECU问你要密码。但DoIP里的认证,比简单的密码要复杂一些。

认证流程通常分三步:

  1. 客户端发起认证请求:在路由激活请求中,将认证方法设为0x01,并携带认证数据。
  2. ECU返回挑战码:如果ECU需要进一步验证,它会返回响应代码0x02,并在认证数据中携带一个随机挑战码(Challenge)。
  3. 客户端响应挑战:客户端根据挑战码和预共享密钥,计算出一个响应值(Response),再次发送路由激活请求。

这里的关键是挑战-响应算法。常见的算法有:

  • 简单异或:挑战码与密钥异或。安全性低,但实现简单。
  • AES-128:使用AES算法加密挑战码。安全性高,但需要硬件支持。
  • 自定义算法:OEM自己定义的算法。我见过最奇葩的是用VIN码的后几位做密钥。

你可能会问:“为什么不用简单的密码?” 原因很简单,防止重放攻击。如果每次都用固定密码,别人抓一次包就能冒充你。挑战-响应机制保证了每次的认证数据都不一样。

警告: 安全认证不是必须的。很多ECU在Default激活类型下,根本不走认证流程。但一旦你请求Programming激活,ECU大概率会要求认证。设计用例时,一定要覆盖“认证失败”的场景。比如,发送错误的响应值,看看ECU会不会断开连接。

嗯,最后再提一句。路由激活成功后,ECU会分配一个客户端逻辑地址。这个地址在后续的通信中会用到。如果地址分配失败,ECU会返回响应代码0x03(地址冲突)。我遇到过两次,都是因为测试工具同时模拟了多个客户端,导致地址冲突。

好了,路由激活这块,核心就是这些。记住:激活类型决定权限,认证机制保证安全。下一章,咱们聊聊DoIP的车辆信息请求。