第4章:UDS应用层基础:ISO 14229-1标准概述、UDS服务分类(强制与可选)、诊断会话控制(0x10服务)、安全访问(0x27服务)

各位同学,欢迎来到第四章。今天我们要聊的,是UDS协议里最核心、最基础的部分——应用层。

说实话,ISO 14229-1这个标准,我刚入行那会儿看着它厚厚一本,心里直发怵。但干久了你会发现,它就像一本字典,你不需要背下所有单词,但得知道怎么查,以及哪些词最常用。

4.1 ISO 14229-1标准概述

ISO 14229-1,全称是“道路车辆——统一诊断服务——第1部分:应用层”。

它定义了什么呢?说白了,就是ECU和诊断仪之间,到底该用什么“语言”来对话。这个“语言”包括:

  • 服务的格式:请求长什么样?响应长什么样?
  • 服务的含义:0x10代表什么?0x27又代表什么?
  • 服务的时序:什么时候该发请求?什么时候该等响应?

我个人习惯把ISO 14229-1看作是UDS协议的“宪法”。它规定了所有ECU都必须遵守的基本规则。但注意,它只规定了“应用层”,至于这些数据怎么通过CAN总线、LIN总线或者以太网传出去,那是ISO 15765、ISO 14230这些“交通规则”该管的事。

核心要点: ISO 14229-1只关心“说什么”,不关心“怎么说”。

我在项目中遇到过不少新手,把UDS和CAN诊断混为一谈。其实UDS是应用层协议,CAN只是它常用的一个载体。你完全可以用UDS over LIN,甚至UDS over Ethernet。

4.2 UDS服务分类:强制与可选

ISO 14229-1里定义了一大堆服务,但并不是所有服务ECU都必须支持。标准把服务分成了两类:

  • 强制服务(Mandatory):所有ECU必须实现。这是底线,没得商量。
  • 可选服务(Optional):根据ECU的功能需求,可以选择实现或不实现。

嗯,这里要注意。强制服务其实很少,但它们是整个诊断体系的基石。我列个表,大家看得更清楚:

服务ID 服务名称 分类 说明
0x10 诊断会话控制 强制 所有ECU必须支持,用于切换会话模式
0x11 ECU复位 强制 所有ECU必须支持,用于复位ECU
0x27 安全访问 可选 用于解锁受保护的功能,如刷写、配置
0x22 读取数据标识符 可选 读取ECU内部数据,如电压、温度
0x2E 写入数据标识符 可选 写入数据到ECU,如配置参数
0x19 读取故障码信息 可选 读取DTC(诊断故障码)
0x14 清除诊断信息 可选 清除DTC和冻结帧

你想想看,为什么0x10和0x11是强制服务?因为如果没有会话控制,ECU就不知道你处于什么模式;如果没有复位,ECU出了问题你连重启都做不到。这是最基本的“保命”功能。

我的经验: 在写ECU诊断规范时,我建议先把强制服务列出来,确保它们都实现了。然后再根据功能需求,去添加可选服务。千万别一上来就想着把所有服务都塞进去,ECU的ROM空间可是很宝贵的。

4.3 诊断会话控制(0x10服务)

0x10服务,全称是“DiagnosticSessionControl”。它的作用,就是让ECU在不同的“会话模式”之间切换。

为什么会需要不同的会话模式?

嗯,这就像你家里的路由器。平时正常上网,是“运行模式”;你要改WiFi密码,得先登录管理后台,这是“配置模式”。ECU也一样,不同的模式,开放不同的功能。

ISO 14229-1定义了三种标准的会话模式:

  • 默认会话(Default Session,0x01):ECU上电后的默认模式。在这个模式下,只能执行一些基本的安全相关的诊断服务,比如读取VIN码、读取故障码。不能刷写软件,也不能做复杂的配置。
  • 编程会话(Programming Session,0x02):用于ECU软件刷写。在这个模式下,ECU会关闭一些非必要的通信和功能,确保刷写过程稳定可靠。
  • 扩展诊断会话(Extended Diagnostic Session,0x03):用于更复杂的诊断和配置。比如读写校准参数、执行特殊功能(如执行器测试)。

请求格式很简单:

请求:0x10 + 会话ID
例如:切换到扩展诊断会话
发送:03 10 03

响应格式:

肯定响应:0x50 + 会话ID + 附加信息(如P2定时器值)
例如:03 50 03 00 32 00 0A

这里有个细节,响应里的P2定时器值,告诉诊断仪“我处理请求需要多长时间”。这个值在默认会话和扩展会话里可能不一样。我曾经调试过一个ECU,发现它在扩展会话里响应特别慢,查了半天,原来是P2定时器设得太长了。

避坑指南: 我曾经遇到过一个项目,ECU在编程会话里没有正确关闭CAN报文发送,导致刷写过程中总线负载过高,刷写失败。所以,切换会话时,ECU内部一定要做好“状态清理”工作。

4.4 安全访问(0x27服务)

0x27服务,全称是“SecurityAccess”。它的作用,就是给诊断功能加一把“锁”。

你想想看,如果任何人都能通过诊断仪刷写ECU的软件,那岂不是乱套了?所以,对于一些敏感操作,比如刷写、配置、执行特殊功能,ECU会要求你先通过安全访问验证。

安全访问的流程,说白了就是“挑战-应答”机制:

  1. 请求种子(Seed):诊断仪发送0x27 + 安全级别,请求一个随机数(种子)。
  2. 发送种子(Seed):ECU返回一个随机数(种子)。
  3. 发送密钥(Key):诊断仪根据种子,通过一个约定的算法,计算出一个密钥,发送给ECU。
  4. 验证密钥(Key):ECU用同样的算法,自己算一遍密钥。如果匹配,就解锁成功。

请求和响应的格式:

步骤1:请求种子
请求:02 27 01
响应:06 67 01 11 22 33 44  // 种子是 0x11223344

步骤2:发送密钥
请求:06 27 02 AA BB CC DD  // 密钥是 0xAABBCCDD
响应:02 67 02  // 解锁成功

这里的安全级别(0x01、0x02等)是ECU厂商自己定义的。比如,0x01可能用于解锁刷写功能,0x03用于解锁配置功能。不同的级别,可能对应不同的种子和算法。

核心要点: 安全访问的算法是保密的,通常由ECU厂商自己实现。诊断仪需要拿到这个算法,才能计算出正确的密钥。

我在项目中遇到过最头疼的问题,就是安全访问的“防破解”机制。有些ECU会限制尝试次数,比如连续3次输错密钥,ECU就会锁定一段时间,甚至永久锁定。所以,在开发诊断仪时,一定要处理好重试逻辑,别把ECU给锁死了。

我的建议: 在测试阶段,可以跟ECU厂商要一个“测试密钥”或者“调试模式”,绕过安全访问,提高开发效率。但量产时,一定要把安全访问加上,这是保护ECU不被非法篡改的最后一道防线。

好了,这一章的内容就到这里。我们讲了ISO 14229-1的定位,UDS服务的分类,以及两个最基础的服务——0x10和0x27。下一章,我们会深入聊聊0x22和0x2E这两个读写服务,它们在实际项目中用的最多。

记住,诊断协议不是死记硬背,而是理解它的设计思想。为什么要有会话控制?为什么要有安全访问?想通了这些,你就能灵活运用UDS了。