写在开篇:
上回说到,桃花岛的经历,让郭靖彻底搞清楚了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。