写在开篇上回说到桃花岛的经历让郭靖彻底搞清楚了27服务的多级权限——桃花迷阵27绝过哪级关进哪级门。回到家后郭靖就拉着蓉儿又跑去了4S店。“郎中我岳父的三重门我都闯过了27服务也搞明白了。现在是不是该学学‘看病’了”郎中捋着胡子笑了“郭大侠您前面学的那些——插网线、分IP、亮帖子、报工号、过暗号、闯迷阵……统统都是‘进门’。今天咱们终于可以开始‘把脉’了”黄蓉咬了一口糖葫芦“人有生老三千疾望闻问切良方医。郎中您这是要给车开方子了”郎中竖起大拇指“对头”一、真经难取不易得八十一难多波折郎中拿出笔墨纸砚在上面画了一条时间线┌─────────────────────────────────────────────────────────────────────┐ │ 真经难取不易得八十一难多波折 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ① 插上网线激活线拉低车辆唤醒 │ │ ↓ │ │ ② IP地址分配DHCP客栈分房 / Auto-IP破庙过夜 │ │ ↓ │ │ ③ 车辆发现亮帖子VIN 逻辑地址 │ │ ↓ │ │ ④ TCP连接建立端口13400 │ │ ↓ │ │ ⑤ 路由激活请求报工号 │ │ ↓ │ │ ⑥ 安全访问对暗号UDS 0x27服务拿种子、算密钥 │ │ ↓ │ │ ⑦ 路由激活响应0x10——门开了请进 │ │ ↓ │ │ ⑧ 级别权限桃花迷阵27绝客厅/书房/密室 │ │ ↓ │ │ ⑨ 终于可以“看病”了← 我们在这里 │ │ ↓ │ │ ⑩ 诊断消息UDS命令 响应—— 本篇 │ │ │ └─────────────────────────────────────────────────────────────────────┘黄蓉数了数“好家伙看病之前要过九道关真经难取不易得八十一难多波折——咱俩这都快赶上唐僧取经了”郎中哈哈大笑“黄姑娘安全第一嘛现在咱们开始第十步——望闻问切把脉开方”二、书同文车同轨UDS是个什么鬼郎中用笔在白板上写了三个大字UDSUnified 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 │ │ │ │ │ │VerInv│暗号 │诊断消息 │ Length │ │ │ │ │ └──────┴──────┴──────────┴──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ DoIP负载Payload │ │ │ │ ┌──────────────┬──────────────┬────────────────────────┐ │ │ │ │ │ 0x0E 0x80 │ 0x0E 0x01 │ UDS命令数据 │ │ │ │ │ │ 源逻辑地址 │ 目标逻辑地址│ 这才是真正的“药方” │ │ │ │ │ │ 诊断仪 │ 网关 │ │ │ │ │ │ └──────────────┴──────────────┴────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘“关键点Payload Type 0x8001表示‘这是诊断消息’。负载里先写源逻辑地址、目标逻辑地址最后才是UDS命令。”郭靖盯着图看了半天“郎中那UDS命令长啥样举个例子呗。”四、四万里长征第一步 读个VIN探探路郎中拿起笔写了一个最简单的例子——读VIN。“人有生老三千疾看病先看身份证。给车看病也一样先读个VIN看看这车是谁。四万里长征第一步读个VIN探探路”请求诊断仪 → 网关字段值说明Protocol Version0x03版本3Inverse Version0xFC暗号Payload Type0x80 0x01诊断消息Payload Length0x00 0x00 0x00 0x077字节源逻辑地址SA0x0E 0x80诊断仪目标逻辑地址TA0x0E 0x01网关UDS命令0x22 0xF1 0x90读数据DID0xF190VIN完整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同上源逻辑地址SA0x0E 0x01网关目标逻辑地址TA0x0E 0x80诊断仪UDS响应0x62 0xF1 0x90 VIN数据正响应 VIN响应示例假设VINWVWZZZ3CZJEXXXXX 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 ...服务ID220x40220x62负响应0x7F 服务ID 错误码7F 22 12错误码0x12子功能不支持常见的“负响应”错误码错误码含义江湖版0x10一般拒绝“不治”0x11不支持该服务“我这不治这个病”0x12子功能不支持“你这偏方我没听过”0x13报文长度错误“你这方子剂量不对”0x22条件不满足“先交钱再治病”0x31请求超出范围“你这病超出我能力了”0x33安全访问拒绝“你没过暗号不给你看”0x78请求正确但ECU忙“忙着呢等会儿”黄蓉咬了一口糖葫芦“这不就跟咱俩去找我爹看病一样嘛——他说‘没空’0x78或者‘你先对暗号’0x33”郎中哈哈大笑“黄姑娘总结得太到位了”六、华佗神医百宝箱 件件堪称济世方郎中用笔写了一张UDS命令表贴在白板上服务名十六进制干啥的江湖版DiagnosticSessionControl0x10切换会话默认/扩展/编程“换个身份看病”ECUReset0x11复位ECU“重启一下”ReadDataByIdentifier0x22通过ID读数据如VIN“看脉相”ReadMemoryByAddress0x23通过地址读内存“看骨头”WriteDataByIdentifier0x2E通过ID写数据“开药方”RoutineControl0x31执行例程自检、擦除Flash“运功疗伤”RequestDownload0x34请求下载刷写第一步“准备吃药”TransferData0x36传输数据刷写主体“吃药”RequestTransferExit0x37退出传输刷写结束“药吃完了”TestPresent0x3E保活告诉ECU“我还在”“还在吗别踢我”SecurityAccess0x27咱们前几篇刚讲过的“对暗号”“这些就是UDS的‘常用药方’。华佗神医百宝箱件件堪称济世方咱们第一篇诊断先开最简单的——读VIN。”七、郎中看病有规章一件一件莫要慌郎中在白板上画了完整流程诊断仪黄蓉 网关门房/ECU │ │ │ 八十一难多波折略 │ │ │ │ ① 诊断消息22 F1 90读VIN │ │ Type 0x8001, SA0x0E80, TA0x0E01 │ │──────────────────────────────────────────│ │ │ │ ② 网关把请求转给对应的ECU │ │ │ │ ③ ECU回复VIN数据 │ │ │ │ ④ 诊断消息响应62 F1 90 VIN │ │ Type 0x8001, SA0x0E01, TA0x0E80 │ │──────────────────────────────────────────│ │ │ │ ⑤ 诊断仪显示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/TAUDS命令三板斧完整体。郭靖点点头“郎中我现在知道怎么‘读VIN’了。那读故障码、刷固件是不是换几个UDS命令就行”郎中笑了笑“对头0x19读故障码0x14清故障码0x2E写数据0x31例程控制……咱们下一篇就讲——读故障码。”黄蓉把最后一颗糖葫芦咬下来含混不清地说“人有生老三千疾望闻问切良方医。靖哥哥你今天学会了‘把脉’读VIN明天是不是该学学‘看病历’了”郭靖憨憨一笑“蓉儿说得对。明天学读故障码去”于是小两口又开心地开着国产智能网联新车幸福地回家喽。微风吹过郎中捋着胡子望着他们远去的背影微微一笑。他看得出来靖哥哥今天终于“把上脉”了。从插网线到读VIN从扒底裤到开方子一路走来不容易。但这个憨小子总还有几分似懂非懂的疑惑——“UDS命令那么多都咋用”“读故障码跟读VIN有啥不一样”郎中轻轻摇了摇头眼里满是欣慰。他知道这个憨小子一定会再过来的。呵呵。十、写在最后这一篇最大的收获书同文车同轨UDS是个什么鬼——秦始皇统一文字和车轨UDS统一诊断语言。DoIP把脉UDS开方。DoIP负责“运输”头部8字节 SA/TAUDS负责“把脉”22 F1 90读VIN、19读故障码、34/36/37刷固件。两套配合才能给车看病。郭靖感叹真经难取不易得八十一难多波折。从扒底裤到读VIN整整折腾了10篇四万里长征第一步读个VIN探探路——郎中看病有规章一件一件莫要慌。后面的路还长着呢打完收工886。