UDS诊断应用层笔记

UDS概述

UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是在汽车电子ECU环境下的一种诊断通信协议,在 ISO 14229中规定。它是从ISO 14230-3(KWP2000)和ISO 15765-3协议衍生出来的。”统一”这个词意味着它是一个”国际化的”而非”公司特定的”标准。到目前为止,这种通信协议被用在几乎所有由OEM一级供应商所制造的新ECU上面。这些ECU控制车辆的各种功能,包括电控燃油喷射系统(EFI),发动机控制系统,变速箱,防抱死制动系统(ABS),门锁,制动器等。

诊断工具与车内的所有控制单元均有连接,且这些控制单元均启用了UDS服务。不同于仅使用OSI模型第一层、第二层的CAN协议,UDS服务使用OSI模型的第五层和第七层(会话层和应用层)。 服务ID(SID) 和与服务相关的参数包含在CAN数据帧的8个数据字节中,这些数据帧是从诊断工具发出的。

目前市面上的新车都具有用于车外诊断的诊断接口,这使得我们可以用 电脑或诊断工具(业内称为测试器Tester)连接到车辆的总线系统上。因此,UDS中定义的消息可以发送到支持UDS服务的控制器(业内称ECU)。这样我们就可以访问各个控制单元的故障存储器或用新的固件更新ECU的程序。除此之外,UDS还用于下线检测时把一些信息(如VIN码)写入到汽车的各个零部件中。这些功能也是UDS最为核心的功能。

为什么我们要设计UDS这样的诊断协议呢?在汽车诊断协议诞生之前,修车只能靠师傅的经验,因为汽车零部件不会告诉你它哪里出了问题。但有了诊断协议之后,一旦零部件出了问题或者出过问题,它们会把故障信息保存在内存里面,维修师傅就可以通过通信总线读取这些故障信息,比如一个ECU经历欠压故障之后,它会将欠压故障代表的DTC(诊断故障码)存储起来,可选择性保存的还有发生故障时的快照信息(比如此时的车速、读到的电压值等)。快照信息有助于测试工程师和售后技师查找发生故障的原因。

除了CAN总线以外,UDS也可在不同的汽车总线(例如 LIN, Flexray, Internet 和K-line)上实现。

UDS诊断应用层笔记

UDS诊断应用层笔记

应用层服务

UDS本质上是一系列的服务,共包含 6大类26种。每种服务都有自己独立的ID, 即SID

SID:Service Identifier,诊断服务ID。UDS本质上是一种定向的通信,是一种交互协议(Request/Response),即诊断方给ECU发送指定的请求数据(Request),这条数据中需要包含SID。如果是肯定的响应(Positive Response),回复 [SID+0x40],就是请求10,响应50;请求22,响应62,回复的是一组数据。如果是否定的响应(Negative Response),回复 7F+SID+NRC,回复的是一个声明。肯定响应和否定响应的形式一定要熟记。

UDS诊断应用层笔记

UDS诊断应用层笔记

0x10诊断会话

0x10包含3个子功能:

  • 01 :默认会话(权限最小,操作服务少)
  • 02 :编程会话(用于解锁bootloader相关)
  • 03 :扩展会话(解锁高权限服务:写入数据和诊断码)

ECU上电时,进入的是 默认会话.如果您进入了一个 非默认会话的状态,一个定时器会运转,如果一段时间内没有请求,那么到时间后, 诊断退回到默认会话01(最低权限)。当然,我们有一个 0x3E的服务,可以使诊断保持在非默认的状态。

0x10服务否定响应码:

  • 0x12:不支持请求服务的功能
  • 0x13:请求报文的数据长度或者格式不合法
  • 0x22:条件不满足
  • 0x31:请求超出范围

02 10 01 00 00 00 00 00 发送 06 50 01 00 32 00 C8 AA 接收 02 10 02 00 00 00 00 00 发送 03 7F 10 22 AA AA AA AA 失败

0x3E待机握手

0x3E服务用于向服务器指示诊断仪仍然连接在网络上,之前已经激活的诊断服务功能可以仍然保持激活状态。

0x3E否定码:

  • 0x12:不支持请求服务的功能
  • 0x13:请求报文的数据长度或者格式不合法

发送一个3E服务的报文,保持非默认会话状态。80表示无需回复。

02 3E 00 55 55 55 55 55 发送 02 7E 00 xx xx xx xx xx 否定 02 3E 80 xx xx xx xx xx 接收

0x27安全访问

0x27安全访问:ECU当中有很多数据是整车厂独有的,并不希望开放给所有客户,它需要做一个保密的设定。我们在读取一些特殊数据的时候,要先进行一个 安全解锁ECU上电之后是一个锁定的状态(Locked),我们通过0x27服务,加上一个子服务,再加上一个钥匙,这样的服务请求可以进行解锁。

比如下面的例子,2n-1是一个子服务,这里我们先用n=1,即01子服务来举例子。通过首轮Tester种子的请求(27+01),ECU会返回67+01+AA+BB+CC+DD,AA~DD就是种子了。之后第二轮,诊断端的Tester会利用种子进行运算(根据整车厂的算法),生成k1(不一定是1个字节),之后发送请求,子服务是2n,这里我们还是假定n=1,即02子服务。这样Tester发出的就是27+02+[k1]。之后,ECU同样也会根据第一轮的种子自行算出k2。当ECU检查出k1和k2完全一致时,解锁(Unlocked)成功。

UDS诊断应用层笔记

0x27否定码:

  • 0x12:不支持请求服务的功能
  • 0x13:请求报文的数据长度或者格式不合法
  • 0x22:条件不满足
  • 0x24:请求顺序错误
  • 0x31:请求超出范围
  • 0x35:无效密钥
  • 0x36:尝试次数超限
  • 0x37:延时数据未到

例子:

Tester: 02 27 05 00 00 00 00 00 安全访问,05子功能

ECU: 06 67 05 08 27 11 F0 00 肯定响应,回复了对应安全级别的种子

Tester: 06 27 06 FF FF FF FF 00 发送密钥,4个FF。注意06是与05成对使用的。

ECU: 03 7F 27 78 00 00 00 00 若为否定响应,7F+27+NRC

ECU: 02 67 06 00 00 00 00 00 若为肯定响应,通过安全校验

细说下安全验证算法。安全验证算法包括1个核心,3个主体。

第一个主体通常和ECU有关。比如我们先用22服务读取ECU的SN,取其中4个字节,作为”调味料”参与,显然这个”调味料”对于这个ECU来说是不变的,也能通过22服务方便的读取到。

第二个主体seed,通常与ECU的运行时间有关系,是主料,在27服务发送奇数子功能时回复。seed通常一直在发生变化,无法发现其规律。

第三个主体是执行次数,就是算法要执行几轮。执行1轮和2轮得到的结果肯定是不一样的对吧。

最大的核心就是算法了。举个简单的算法,比如seed和ECU SN前4个字节加一下,循环左移两位,执行3轮,return这个数作为key,结束。安全验证就是一把锁,算法越复杂,短时间解开的成本越高,越不易被破解掉。如果失败次数过多还会触发惩罚机制,一段时间内都无法再尝试解锁,防止人为的破解。

0x22读数据

0x22读数据,Request(请求):22+DID(数据标识符,通常是两个字节)

Response(响应):62+DID+Data

UDS诊断应用层笔记

DID有一部分已经被ISO 14229-1规定:

  1. 0xF186就是当前诊断会话数据标识符
  2. 0xF187就是车厂备件号数据标识符
  3. 0xF188就是车厂ECU软件号码数据ID
  4. 0xF189就是车厂ECU软件版本号数据标识符

0x21写数据

0x2E写数据,Request(请求):2E+DID+Data

Response(响应):6E+DID

UDS诊断应用层笔记

由上图可知,请求格式分为三部分
第一部分:请求SID:0x2E,占用一个字节
第二部分:dataIdentifier(DID),需要写入数据对应的DID标识符值。占用两个字节
第三部分:dataRecord,需要写入的数据

UDS诊断应用层笔记

由上图可知,响应格式分为两个部分
第一部分:response SID:0x6E
第二部分:dataIdentifier(DID),请求DID的echo

UDS诊断应用层笔记

0x19读DTC

19服务是一套诊断服务中的重中之重

DTC:如果系统检测到了一个错误,它将存储为DTC。DTC可表现为:一个显而易见的故障;通讯信号的丢失(不会使故障灯亮起);排放相关的故障;安全相关的错误等。DTC可以揭示错误的位置和错误类型。通常DTC占用3个字节

故障码包括四个大类,分别是PCBU,P是动力系统,C是底盘,B是车身,U是通信系统。一个DTC信息占用4个字节。最后一个字节是DTC的状态。一个DTC除了它自己的3个字节, 还有一个字节专门用于表达DTC的状态,这个字节我们叫它DTC状态掩码 .

第一个字节在乘用车中,前两个bit代表P/C/B/U(动力/底盘/车身/网络)中的一个,之后六个bit是数字,合在一起的样子形如”C01″。第一个字节的前2个bit中,用00/01/10/11分别表示P/C/B/U

0x19拥有28个子服务。常用的子服务有:

  • 01 (读取符合掩码条件的DTC数量)(必须支持),后面的参数是DTC状态掩码,若为01表示我想读当前故障,若为08表示我想读历史故障,若为09表示当前故障和历史故障都想读。 在肯定回复时,组合应该是59(19+40) – 01 (子功能) – 09 (本ECU所支持的掩码条件)-01 DTC的格式 – 00 01 (目前满足条件的DTC有一个)
  • 02(读取符合掩码条件的DTC列表及其状态)(必须支持),后面的参数是DTC状态掩码,解读同上。 在肯定回复是,59 – 02(子功能)- 09(本ECU所支持的掩码条件) – XX XX XX ( DTC,车厂定义 ) – 01
  • 04(读取快照信息),也叫冻结帧。
  • 06(读取扩展信息)
  • 0A(读取ECU支持的所有DTC列表及其状态)(必须支持)。这个就不必发DTC状态掩码了。所有支持的DTC列表及其状态都会打印出来。

0x14清除DTC

清除(复位)DTC格式,它可以改变DTC的状态。DTC状态中的八个位,除bit4和bit6外均会被清零,包含当前故障和历史故障。bit4和bit6这两个testNotCompleted开头的会被强制置1。

3个FF代表清除所有DTC。

UDS诊断应用层笔记

由上图可知请求格式分为两个部分
第一部分:请求SID:0x14,占用一个字节
第二部分:groupOfDTC,由厂家自定义,占用三个字节

UDS诊断应用层笔记

由上图可知响应格式只有response SID:0x54,占用一个字节

groupOfDTC为3个FF代表清除所有DTC

UDS诊断应用层笔记

0x2F IO控制

该服务可以通过DID(数据标识符)来进行输入信号的替换和控制零部件负载输出。这是一个用在产线上较多的服务。该报文的请求至少由4个字节组成。第一个字节是2F,第二第三字节是DID

IO控制类型分为4类,

  • 00是控制权还给ECU
  • 01是复位为默认值
  • 02是冻结当前的状态
  • 03是短暂接管控制权

若控制类型是00-02这三种,请求报文是4个字节。

若控制类型是03,请求报文的第5字节是控制代码,可以是数字量,比如01是开,00是关;也可以是模拟量,比如空调风门的开度。

0x2F否定码:

  • 0x13:请求报文的数据长度或者格式不合法
  • 0x22:条件不满足
  • 0x31:请求超出范围
  • 0x33:安全访问拒绝

Original: https://www.cnblogs.com/Ye-Wei/p/16102951.html
Author: 西故黄鹤楼
Title: UDS诊断应用层笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607072/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux系统查看磁盘可用空间的5个命令

    大家好,我是良许。 工作中,经常会遇到磁盘爆满的情况,尤其是一台服务器运行了 N 年之后,里面会充满各种各样垃圾文件,比如:编译产生的中间文件、打包的镜像文件、日志文件,等等。 别…

    Linux 2023年5月27日
    0133
  • dpdk21.11 添加igb_uio模块

    dpdk 21.11 添加 IGB_UIO模块 IGB_UIO模块 两种添加方式 零、 下载IGB_UIO模块 一、 直接添加到文件中 1.1 复制 dpdk-kmods/linu…

    Linux 2023年6月6日
    0108
  • 有道云笔记迁移到为知笔记

    背景 之前一直用的有&am…

    Linux 2023年6月14日
    0110
  • C 中的字符数组

    在C语言中没有专门的字符串变量,字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。通常用一个 字符数组来存…

    Linux 2023年6月13日
    098
  • Nginx/Tengine安装配置详解

    1 概念 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。官方测试…

    Linux 2023年6月14日
    094
  • CentOS 7.6 安装 MySQL-5.7.31(RPM方式安装)

    准备工作: 注:5.7.31版本安装步骤及初始化和之前版本有较大区别 CentOS 7.6 系统: 带GUI的服务器 默认安装 MySQL 5.7.31 安装包: 1.RPM安装包…

    Linux 2023年6月8日
    089
  • 自定义Naive UI的数据表格Data Table中按钮Button图标

    { title: "Action", key: "actions", render(row) { return h( NButton, { …

    Linux 2023年6月8日
    0112
  • 飞鸽传书:一个局域网QQ

    推荐一个类似局域网QQ的免费软件——飞鸽传书,支持windows、mac、Linux、安卓、苹果手机。 飞鸽传书:一个局域网QQ 局域网文件和消息互传应该用什么呢?在这里推荐一个类…

    Linux 2023年6月6日
    0113
  • tiddlywiki-nodejs 安装部署

    安装 tiddlywiki (root) 确认 npm 包全局&amp…

    Linux 2023年6月14日
    093
  • LeetCode-329. 矩阵中的最长递增路径

    题目来源 329. 矩阵中的最长递增路径 题目详情 给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。 对于每个单元格,你可以往上,下,左,右四个方向…

    Linux 2023年6月7日
    080
  • k8s vs k3s: 差异解析

    2. K3s的优势 小型 K3s 的最大优势是它的尺寸最小(小于 100 MB),这有助于它以最少的设置在小型硬件中启动 Kubernetes 集群。 快速部署 curl -sfL…

    Linux 2023年6月13日
    0118
  • 批量新建域用

    前几个章节我们讲到Windows Server 2016-图形化新建域用户(一),本章节我们简单讲解下如何通过命令批量创建域用户,以便高效完成日常工作中实际批量创建用户需求,内容涉…

    Linux 2023年6月13日
    099
  • Linux远程连接管理(命令)

    1.ftp服务器的搭建 ftp的作用:文件的上传和下载,不允许操作目录,如果想操作目录只能用tar打包。 (1)服务器端: ①.输入”sudo apt-get inst…

    Linux 2023年6月8日
    0120
  • EKS助力小白实践云原生——通过k8s部署wordpress应用

    目前云原生在大厂已经有了充分的实践,也逐渐向小厂以及非互联网公司推广。适逢12月20日,腾讯云原生【燎原社】精心打造了云原生在线技术工坊,让零基础的同学也能快速入门和实践 Dock…

    Linux 2023年6月13日
    090
  • Java8新特性终极指南

    欢迎来到Java学习之Java8新特性终极指南 目录 系列文章目录 @ 目录 系列文章目录 Java语言新特性 Lambda表达式 函数式接口 方法引用 接口的默认方法 重复注解 …

    Linux 2023年6月13日
    0115
  • linux版powershell中,tab补全,linux外部命令参数名,的模块介绍

    关键字 linux powershell pwsh 补全 complete bash zsh 摘要:linux用户的福音!在linux版powershell中,补全linux外部命…

    Linux 2023年5月27日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球