第三十篇技术笔记:郭大侠学UDS - 人有生老三千疾,望闻问切良方医

写在开篇:

上回说到,桃花岛的经历,让郭靖彻底搞清楚了27服务的多级权限------桃花迷阵27绝,过哪级关,进哪级门。

回到家后,郭靖就拉着蓉儿又跑去了4S店。

"郎中!我岳父的三重门我都闯过了,27服务也搞明白了。现在是不是该学学'看病'了?"

郎中捋着胡子笑了:"郭大侠,您前面学的那些------插网线、分IP、亮帖子、报工号、过暗号、闯迷阵......统统都是'进门 '。今天,咱们终于可以开始'把脉'了!"

黄蓉咬了一口糖葫芦:"人有生老三千疾,望闻问切良方医。郎中,您这是要给车开方子了?"

郎中竖起大拇指:"对头!"

一、真经难取不易得,八十一难多波折

郎中拿出笔墨纸砚,在上面画了一条时间线:

复制代码
┌─────────────────────────────────────────────────────────────────────┐
│                    真经难取不易得,八十一难多波折                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ① 插上网线,激活线拉低(车辆唤醒)                                   │
│                    ↓                                                │
│  ② IP地址分配(DHCP客栈分房 / Auto-IP破庙过夜)                       │
│                    ↓                                                │
│  ③ 车辆发现(亮帖子:VIN + 逻辑地址)                                 │
│                    ↓                                                │
│  ④ TCP连接建立(端口13400)                                          │
│                    ↓                                                │
│  ⑤ 路由激活请求(报工号)                                            │
│                    ↓                                                │
│  ⑥ 安全访问(对暗号:UDS 0x27服务,拿种子、算密钥)                    │
│                    ↓                                                │
│  ⑦ 路由激活响应(0x10——门开了,请进!)                              │
│                    ↓                                                │
│  ⑧ 级别权限(桃花迷阵27绝:客厅/书房/密室)                           │
│                    ↓                                                │
│  ⑨ 终于可以“看病”了!← 我们在这里!                                 │
│                    ↓                                                │
│  ⑩ 诊断消息(UDS命令 + 响应)—— 本篇!                               │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

黄蓉数了数:"好家伙,看病之前要过九道关!真经难取不易得,八十一难多波折------咱俩这都快赶上唐僧取经了!"

郎中哈哈大笑:"黄姑娘,安全第一嘛!现在咱们开始第十步------望闻问切,把脉开方!"

二、书同文,车同轨,UDS是个什么鬼?

郎中用笔在白板上写了三个大字:

**UDS:**Unified Diagnostic Services

"UDS,全称Unified Diagnostic Services,统一诊断服务。秦始皇统一六国后,搞了个'书同文,车同轨'------UDS干的就是这个活!"

"不管你是BBA、还是国产新能源,诊断的'话术'是统一的------都用UDS。就像不管你是桃花岛、全真教还是丐帮,见了面都抱拳说'幸会'。"

郭靖挠挠头:"所以UDS就是诊断界的'小篆'?全国统一文字?"

郎中竖起大拇指:"对头!UDS就是诊断江湖的通用语言------不管哪家车厂的ECU,都听得懂这套'黑话'。"

黄蓉咬了一口糖葫芦:"那'车同轨'呢?"

郎中捋着胡子:"车轮间距统一了,马车才能在同样的轨道上跑。UDS也一样------诊断命令统一了,诊断仪才能跨品牌跨车型用。"

秦始皇的功绩 UDS的对应
书同文 所有ECU用同一套UDS命令
车同轨 所有诊断仪用同一种"话术"沟通

黄蓉恍然大悟:"哦~~所以UDS就是诊断江湖的'圣旨'!不管你是什么车,都得按这套规矩来!"

三、好奇害死猫,我想看看数据包

郭靖问:"郎中,那这个'UDS命令'怎么装进DoIP报文里?好奇害死猫,我想看看数据包长啥样!"

郎中又轻描淡写,画了一张图:

复制代码
┌─────────────────────────────────────────────────────────────────────┐
│                   诊断消息(Type 0x8001)完整结构                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │              DoIP头部(8字节)                                │   │
│  │  ┌──────┬──────┬──────────┬──────────────┐                 │   │
│  │  │ 0x03 │ 0xFC │ 0x80 0x01 │  Payload     │                 │   │
│  │  │Ver+Inv│暗号  │诊断消息   │  Length      │                 │   │
│  │  └──────┴──────┴──────────┴──────────────┘                 │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                              ↓                                      │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │            DoIP负载(Payload)                               │   │
│  │  ┌──────────────┬──────────────┬────────────────────────┐   │   │
│  │  │   0x0E 0x80  │   0x0E 0x01  │     UDS命令数据        │   │   │
│  │  │   源逻辑地址  │   目标逻辑地址│  (这才是真正的“药方”) │   │   │
│  │  │   (诊断仪)  │   (网关)   │                        │   │   │
│  │  └──────────────┴──────────────┴────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

"关键点:Payload Type = 0x8001,表示'这是诊断消息'。负载里先写源逻辑地址、目标逻辑地址,最后才是UDS命令。"

郭靖盯着图看了半天:"郎中,那UDS命令长啥样?举个例子呗。"

四、四万里长征第一步 读个VIN探探路

郎中拿起笔,写了一个最简单的例子------读VIN

"人有生老三千疾,看病先看身份证。给车看病也一样,先读个VIN,看看这车是谁。四万里长征第一步,读个VIN探探路!"

请求(诊断仪 → 网关)

字段 说明
Protocol Version 0x03 版本3
Inverse Version 0xFC 暗号
Payload Type 0x80 0x01 诊断消息
Payload Length 0x00 0x00 0x00 0x07 7字节
源逻辑地址(SA) 0x0E 0x80 诊断仪
目标逻辑地址(TA) 0x0E 0x01 网关
UDS命令 0x22 0xF1 0x90 读数据(DID=0xF190,VIN)
复制代码
完整16进制报文:
03 FC 80 01 00 00 00 07  0E 80 0E 01  22 F1 90
└─DoIP头部─┘           └─SA/TA─┘  └─UDS─┘

响应(网关 → 诊断仪)

字段 说明
DoIP头部 03 FC 80 01 00 00 00 XX 同上
源逻辑地址(SA) 0x0E 0x01 网关
目标逻辑地址(TA) 0x0E 0x80 诊断仪
UDS响应 0x62 0xF1 0x90 + VIN数据 正响应 + VIN
复制代码
响应示例(假设VIN=WVWZZZ3CZJEXXXXX):
03 FC 80 01 00 00 00 18  0E 01 0E 80  62 F1 90 57 56 57 5A 5A 5A 33 43 5A 4A 45 58 58 58 58 58 58
└─DoIP头部─┘           └─SA/TA─┘  └────────UDS响应(含VIN 17字节)─────────┘

黄蓉盯着看了一会儿:"哦~~22 F1 90是'我要读VIN';62 F1 90是'好的,VIN是......'这跟咱们在桃花岛对暗号一样------你问'天王盖地虎',我回'宝塔镇河妖'!"

郎中竖起大拇指:"对头!UDS就是一套标准化的'问诊暗号'!"

五、YES or NO 正、负响应看个够

郭靖问:"郎中,那如果ECU不认识这个命令,或者权限不够,会咋样?"

郎中捋着胡子:"那就不是62了,是**7F**------负响应,意思是'这病我看不了'或'你没资格问'。"

响应类型 格式 例子 说明
正响应 0x40 + 服务ID + 数据 62 F1 90 ... 服务ID=22,0x40+22=0x62
负响应 0x7F + 服务ID + 错误码 7F 22 12 错误码0x12=子功能不支持

常见的"负响应"错误码

错误码 含义 江湖版
0x10 一般拒绝 "不治"
0x11 不支持该服务 "我这不治这个病"
0x12 子功能不支持 "你这偏方我没听过"
0x13 报文长度错误 "你这方子剂量不对"
0x22 条件不满足 "先交钱再治病"
0x31 请求超出范围 "你这病超出我能力了"
0x33 安全访问拒绝 "你没过暗号,不给你看"
0x78 请求正确,但ECU忙 "忙着呢,等会儿"

黄蓉咬了一口糖葫芦:"这不就跟咱俩去找我爹看病一样嘛------他说'没空'(0x78),或者'你先对暗号'(0x33)!"

郎中哈哈大笑:"黄姑娘总结得太到位了!"

六、华佗神医百宝箱 件件堪称济世方

郎中用笔写了一张UDS命令表,贴在白板上:

服务名 十六进制 干啥的 江湖版
DiagnosticSessionControl 0x10 切换会话(默认/扩展/编程) "换个身份看病"
ECUReset 0x11 复位ECU "重启一下"
ReadDataByIdentifier 0x22 通过ID读数据(如VIN) "看脉相"
ReadMemoryByAddress 0x23 通过地址读内存 "看骨头"
WriteDataByIdentifier 0x2E 通过ID写数据 "开药方"
RoutineControl 0x31 执行例程(自检、擦除Flash) "运功疗伤"
RequestDownload 0x34 请求下载(刷写第一步) "准备吃药"
TransferData 0x36 传输数据(刷写主体) "吃药"
RequestTransferExit 0x37 退出传输(刷写结束) "药吃完了"
TestPresent 0x3E 保活(告诉ECU"我还在") "还在吗?别踢我"
SecurityAccess 0x27 咱们前几篇刚讲过的! "对暗号"

"这些就是UDS的'常用药方'。华佗神医百宝箱,件件堪称济世方!咱们第一篇诊断,先开最简单的------读VIN。"

七、郎中看病有规章,一件一件莫要慌

郎中在白板上画了完整流程:

复制代码
诊断仪(黄蓉)                              网关(门房/ECU)
      │                                           │
      │  ========== 八十一难多波折(略) ==========   │
      │                                           │
      │ ① 诊断消息:22 F1 90(读VIN)              │
      │   Type 0x8001, SA=0x0E80, TA=0x0E01      │
      │──────────────────────────────────────────>│
      │                                           │
      │  ② 网关:把请求转给对应的ECU               │
      │                                           │
      │  ③ ECU回复VIN数据                         │
      │                                           │
      │ ④ 诊断消息响应:62 F1 90 + VIN            │
      │   Type 0x8001, SA=0x0E01, TA=0x0E80      │
      │<──────────────────────────────────────────│
      │                                           │
      │  ⑤ 诊断仪显示VIN:“WVWZZZ3CZJEXXXXX”      │
      │                                           │
      ▼                                           ▼

郎中指着图说:"郎中看病有规章,一件一件莫要慌。发命令、等响应、解数据,三步走,错不了。"

黄蓉恍然大悟:"哦~~原来'看病'就是------诊断仪发个UDS命令(望闻问切),ECU回个响应(说哪儿不舒服)。"

郎中竖起大拇指:"对头!"

八、这些坑,靖哥哥替你先踩了

坑1:以为"UDS命令就是DoIP的全部"。

后来才搞明白,DoIP是"运输工具",UDS是"看病话术"。报文头8字节是DoIP的,UDS命令只是装在负载里的"信纸"。

坑2:以为"所有UDS命令都能随便发"。

后来才搞明白,得先过安全访问(27服务)解锁权限。读VIN不用,刷固件必须过级别3。

坑3:以为"UDS响应都是正响应"。

后来才搞明白,有正响应(0x40+服务ID)负响应(0x7F。负响应会带错误码,告诉你为啥"看不了病"。

坑4:以为"一次会话只用一个UDS命令"。

后来才搞明白,诊断是一个交互过程------问一句,答一句,再问,再答。读VIN只是第一步。

黄蓉补刀:"靖哥哥,你是不是以为问一句'你咋了',人家就能把全身的病都告诉你?"

郭靖憨笑:"蓉儿说得对......望闻问切,得一步一步来。"

九、下步目标

诊断消息搞清楚了------DoIP头部+SA/TA+UDS命令,三板斧完整体。

郭靖点点头:"郎中,我现在知道怎么'读VIN'了。那读故障码、刷固件,是不是换几个UDS命令就行?"

郎中笑了笑:"对头!0x19读故障码,0x14清故障码,0x2E写数据,0x31例程控制......咱们下一篇就讲------读故障码。"

黄蓉把最后一颗糖葫芦咬下来,含混不清地说:"人有生老三千疾,望闻问切良方医。靖哥哥,你今天学会了'把脉'(读VIN),明天是不是该学学'看病历'了?"

郭靖憨憨一笑:"蓉儿说得对。明天,学读故障码去!"

于是,小两口又开心地开着国产智能网联新车,幸福地回家喽。

微风吹过,郎中捋着胡子,望着他们远去的背影,微微一笑。

他看得出来,靖哥哥今天终于"把上脉"了。从插网线到读VIN,从扒底裤到开方子,一路走来,不容易。

但这个憨小子,总还有几分似懂非懂的疑惑------

"UDS命令那么多,都咋用?"

"读故障码跟读VIN,有啥不一样?"

郎中轻轻摇了摇头,眼里满是欣慰。

他知道,这个憨小子,一定会再过来的。

呵呵。

十、写在最后

这一篇最大的收获:

书同文,车同轨,UDS是个什么鬼?------秦始皇统一文字和车轨,UDS统一诊断语言。DoIP把脉,UDS开方。DoIP负责"运输"(头部8字节 + SA/TA),UDS负责"把脉"(22 F1 90读VIN、19读故障码、34/36/37刷固件)。两套配合,才能给车看病。

郭靖感叹:真经难取不易得,八十一难多波折。从扒底裤到读VIN,整整折腾了10篇!四万里长征第一步,读个VIN探探路------郎中看病有规章,一件一件莫要慌。后面的路还长着呢!

打完收工,886。

相关推荐
数智工坊2 小时前
【SAM-DETR论文阅读】:基于语义对齐匹配的DETR极速收敛检测框架
网络·论文阅读·人工智能·深度学习·transformer
tq10863 小时前
数学:约束表征空间的最小闭包
笔记
时空自由民.3 小时前
蓝牙协议之GAP协议
linux·服务器·网络
灰子学技术3 小时前
Envoy HTTP Connection Manager (HCM) 技术文档
网络·网络协议·http
byoass3 小时前
企业云盘与设计软件深度集成:AutoCAD/Revit/SolidWorks插件开发与API集成实战
服务器·网络·数据库·安全·oracle·云计算
智慧光迅AINOPOL4 小时前
全光网设备厂家选型参考:评估要点与技术标准说明
网络·全光网解决方案·全光网·酒店全光解决方案·泛住宿全光网解决方案
freexyn4 小时前
Matlab自学笔记七十六:表达式的展开、因式分解、化简、合并同类项
笔记·算法·matlab
qq_三哥啊4 小时前
【mitmproxy】提取 OpenCode 的 API 接口
网络·代理模式
dog2504 小时前
圆锥曲线和二次曲线
开发语言·网络·人工智能·算法·php