UDS学习记录
UDS介绍
统一诊断服务(英语:Unified Diagnostic Services,简称UDS)是车用电子的通信协议,是电子控制器(ECU)中设备诊断用的网络传输协议,对应的标准是ISO 14229-1[1]。此标准是派生自ISO 14230-3(KWP2000)以及目前已不使用的ISO 15765-3 (控制器局域网上的诊断通信,DoCAN[2])。“统一诊断服务”中的“统一”是指此标准是国际性标准,不是特定公司的专用标准。目前所有一阶供应商新生产的ECU都已支持此通信协议,也已集成到其他标准中,例如AUTOSAR。现代汽车中的电子控制器控制了非常多的机能,包括燃料喷射设备(EFI)、发动机控制器、传动、防锁死刹车系统(ABS)、门锁、刹车、窗户动作等。wiki
为了更好的理解UDS,从这张图上可以看到,UDS可以简单理解为一种“汽车医生的语言”。它是一种标准化的通信协议,用于诊断和维护汽车中的电子控制单元(ECU),除了可以通过专用设备人为测试也可以通过车载中控系统对车辆上的其他部分进行诊断,通信,记录数据,执行指令,系统升级等等。
需要说明的是UDS是一套系统的协议规范,不仅仅只是一个会话控制或者服务或功能。
这里补充一下OSI模型,UDS作为通信协议栈,用OSI通信模型划分,它属于第五层(会话层)和第七层(应用层),
由于使用场景,所以我这里尽量简化。OSI中的第一层和第二层在单片机中绑定关系较高,所以这里放在一起,第三层和第四层放在一起组成了TP层,由ISO15765-2规定。第五层的功能就是被介绍最多的UDS实现的,基于会话实现的权限和认证控制。由于数据量比较小,第六层的数据处理目前则是由各大车厂自由发挥。第七层则是UDS主要的功能实现规范。最终大致分为四层
- 物理层:通过有线连接实现最基础的数据交换。
- 数据链路层:可以通俗理解为HAL库与单片机的外设所实现的数据交换。这里指的是CAN总线与HAL库。
- 传输层:可以根据数据量的大小做出合理分割,并实现拆包组包控制。在这里叫做TP层。
- 应用层:就是UDS的主要功能,主要是14229-1。
所以到这里,如果需要实现UDS的ECU端,我们需要实现的就是传输层和应用层。
传输层
关于传输层的任务主要就是实现路由寻址、分包组包、以及流控的功能。
在TP层,为了实现灵活的数据传输,将CAN帧分为四类,如图所示:从上到下依次是单帧、起始帧、连续帧、流控帧。
- SF:第一个字节的高4位固定为0000,表示这是单帧,低4位表示数据一共有多少字节。
- FF:第一个字节的高四位固定为0001,表示这是起始帧,第二个字节和第一个字节的低四位表示数据长度。
- CF:第一个字节的高四位固定为0010,表示这是连续帧,低四位用来表示连续帧的序列号,从0到15循环递增加1。
- FC:第一个字节的高四位固定为0011,表示这是流控帧。FLag=0x0表示继续发送,Flag=0x1表示等待,0x2表示过载,Block size表示接下来可以连续发送帧的数量,Separation time表示连续帧最小时间间隔。
接下来是流控方面,如图所示,蓝色表示客户端向ECU发起通信,如果数据量小于7个字节,那么一个单帧就可以完成,但是如果数据量超过了7个字节,就需要通过多帧的方式进行通信。需要注意的是,当发出了第一个FF后,接下来的CF从1开始递增,直到15然后继续从0开始递增以此循环。
关于寻址方面,UDS采用的方案是物理寻址和功能寻址,这里的意思是,在使用UDS通信时,CAN网络上挂载的不只是一个ECU设备,而是有着各自模块的ECU,所以要排查出问题就要知道自己和谁通信。
- 物理寻址顾名思义就是每个设备都有一个自己本身的地址,可以通过这个地址进行通信。
- 功能寻址的使用场景是当我们不知道设备的物理地址时,使用一个统一的功能寻址向CAN网络发起广播,等待ECU接受到了广播检查自己是否符合条件从而发起响应。
一般采用legislated OBD/WWH-OBD的地址方案:(定义于ISO 15765-4)
应用层
关于UDS的应用层,这里是应用层的帧结构:
这里的PCI就是传输层的帧结构中添加的帧类型等标识符,接下来就是SID和对应的参数和数据,一般在CAN发送中是需要占位符的,就是图中的Padding,保证每次CAN通信的数据都是8个字符。
关于SID,就是服务ID,也可以理解为指令ID,他的划分可以用这张图表示。SID的范围为0x00-0xFF,其中0x00-0x0F被规定为OBD使用,也就是车载诊断系统。
这里是SID的具体功能:
这里需要介绍一个会话的概念,UDS规定ECU启动后需要启动一个默认会话,然后需要通过会话控制指令进行会话切换,同时由于安全的要求,不同的会话也有不同的特性和功能,有些敏感的会话进入需要通过密钥或者安全认证,而且会话还有超时时间,当超过多长时间后会话会被自动切换回默认会话。同时会话控制的SID就是0x10。
0x10 会话控制
会话控制是UDS中最基础的一个服务,类似于模式的概念,通过指令切换会话,为安全保护或者管理提供了有效的帮助。UDS中,会话控制包含3个子功能,0x01是默认会话,0x02是编程会话,0x03是扩展会话。其中,默认会话权限最低,可以使用的服务最少。当切换至其他会话时,服务端会开始计时,当无操作多久后会自动切换回默认会话。
这里引用一下这个图,当我们需要发送一次切换会话的指令时,例如上图中的1,假设CAN ID为物理地址0x7E0,则需要发送的就是:0x7E0 02 10 01 00 00 00 00 00
为了方便理解这里加了空格。0x02就是PCI,表示这里是一个单帧,而且数据长度为2(10 01),SID就是0x10,表示会话控制服务,0x01表示切换目标为默认会话。
正常情况下服务端回返回0x7E8 06 50 01 00 32 01 90 AA
,这里解释一下返回格式,首先是0x7E8,是返回地址,在发送地址的基础上+8,0x06是PCI,表示这是单帧,且长度为6,0x50表示这是0x10的返回,0x01表示切换为默认会话,也就是发送指令时的参数0x01。这就是常规的返回帧参数,后边的0x00 32 01 90是会话控制服务中要求的返回值,表示的是P2server_max和P2*server_max。
关于会话中的时间参数:
客户端:
- P2client_max:初始/默认值超时时间
- P2* client_max:接收到一次否定响应0x78后,等待下次消息响应的超时时间
- S3 client time:诊断工具(客户端)发送tester present请求的等待时间
服务端:
- P2 server_max:客户端发请求后,服务器端处理请求的溢出时间
- P2* server_max:回复否定响应0x78后,在这个参数设置的时间内依然无法回复请求,时间溢出后要再次发送0x78
- S3 Server time离开非默认状态时间
如果是非正常情况下,就会返回下边这张图的格式,这里是当发送0x22时的返回值,0x7F表示固定的错误SID,0x22表示请求服务的ID,0x13表示NRC,也就是错误代码,为什么会错误。
这里是错误代码一览表:
0x3E 会话保持
该服务用于向服务器指示诊断仪仍然连接在网络上,之前已经激活的诊断服务功能可以仍然保持激活状态。
0x11 ECU复位
顾名思义,0x11的作用就是让ECU复位,该服务只有一个参数,就是复位方式,具体如下图:
返回值中也只有一个参数:
0x27 安全访问
安全访问也是UDS的一项基础服务,主要功能是相当于给汽车ECU上了一把锁,只有对应的钥匙才能打开,而且还可以分不同的等级,通过不同的验证可以解锁不同的安全等级,而通过这个功能可以保证部分服务的安全。主要是所有写入相关的操作都需要安全访问的保护。
他的工作流程是先向ECU发起请求一份种子,然后得到种子计算出结果并发送给ECU校验,校验通过了就表示通过验证,需要说明的是,这里也会启动计时,当超时过后也会自动上锁。
这些服务功能是笔者认为UDS中最基础的一些服务功能,其他的一些服务则是在这些的基础之上进行的,理解了这些服务后相当于对UDS有了一定的认识,下一步可以针对特定的服务功能进行更改或者结合相应标准进行开发