写在开篇

上回说到,黄蓉读94 01("谁是靖哥哥最爱的心上人")被拒,郎中帮她"转了个身份"才读出来。具体怎么转的,正在气头上的蓉儿没顾得上细看。
第二天,等缓过神来,她直接拉着郭靖奔郎中店里。
"郎中!你昨天帮我转的那个'身份'到底是啥?为啥一转就能读靖哥哥的私密柜子了?"
郎中捋着胡子笑了:
"今天咱们就好好唠唠 UDS的另一个服务------10服务:诊断会话控制。说白了,就是ECU的'岛上身份'。"
黄蓉眼珠一转:"岛上身份?就像我爹桃花岛那套------一般游客模式、亲信弟子模式、岛主本尊模式?"
郎中竖起大拇指:"对头!"
一、10服务:ECU的"桃花岛身份之谜"
10服务大名 DiagnosticSessionControl ,不读数据也不写数据,只做一件事:切换ECU的工作模式。
| 身份 | 会话模式 | 能干啥 | 像谁 |
|---|---|---|---|
| 游客 | 默认会话(01) | 读VIN、读故障码 | 岛上普通访客 |
| 弟子 | 扩展会话(03) | 写数据、例程控制 | 亲信弟子 |
| 岛主 | 编程会话(02) | 刷固件、改底层 | 黄岛主本尊 |
郎中在白板上写下这句口诀:
默认会话只能读,扩展会话可以写,编程会话才能刷。
郭靖念了一遍:"读、写、刷......郎中,这句好记!"
黄蓉也点头:"比降龙十八掌的口诀好背多了!"
二、会话状态机:桃花岛的三重身份
郎中画了张状态机图:

郎中指着图,四条规矩------
规矩一:上岛默认是游客(默认会话状态)
ECU上电自动进入默认会话,想升级?自己发命令。
规矩二:游客不能直接变岛主
默认会话不能直切编程会话(10 01 → 10 02禁止)。必须先切扩展会话,再切编程会话。
黄蓉秒懂:"想见我爹?得先当弟子,不能从大门口直接闯密室。"
规矩三:就算同级身份,重新切一次,锁也会重置
从非默认会话切到非默认会话(包括10 03 → 10 03),安全锁会重置。
黄蓉扭头看郭靖:"所以你写94 01的时候,郎中帮你切扩展会话、对暗号、写进去------一气呵成。我后来自己也切了会话才读到。不是靖哥哥藏私,是ECU的规矩在保护我的好奇心。"
规矩四:在高级房里不说话,会被请回大厅
服务端超时被请回:进入非默认会话后,如果在超时时间内没收到任何诊断请求,ECU会自动退回默认会话。
"那不想被踢怎么办?"黄蓉问。
郎中捋着胡子:"这就是3E服务------Tester Present的活了。"
三、3E保活:告诉ECU"我还在"
"3E服务特别简单,就一个功能:保活。"
| 服务 | 命令 | 响应 | 说明 |
|---|---|---|---|
| Tester Present | 3E 00 |
7E 00 |
"我还在,别踢我" |
"进入扩展会话或编程会话后,ECU会启动一个S3定时器(通常5秒)。如果你在S3时间内没发任何诊断请求,ECU就当你走了,自动退回默认会话。"
黄蓉:"所以不想被踢,就得不停地跟ECU说'还在还在'?"
郎中点头:"对!每2秒 发一次3E 00,S3定时器不断重置,你就一直待在高级房间里。"
郭靖挠挠头:"那不发会咋样?"
"试试呗。"郎中切了扩展会话,然后故意不发3E 。等了5秒,再发22 F1 90读VIN------
结果收到:7F 22 22
"0x22------条件不满足。ECU已经把你踢回默认会话了,所以读VIN被拒。"
黄蓉咬了口糖葫芦:"哦~~就像在书房待太久不说话,管家会来问'还在吗',你要回一句'在',不然就被请回大厅了!"
郎中竖起大拇指:"就是这个理!"
四、切换身份不是你想切就能切
发10 03,ECU会先查你有没有资格进书房(就是必须要满足定义的切换条件哦):
| 条件类型 | 举例 | 不满足时返回的NRC |
|---|---|---|
| 车速条件 | 车速必须为0才能进编程会话 | 0x22(条件不满足) |
| 发动机状态 | 发动机不能运转 | 0x22 |
| 安全条件 | 车辆必须处于安全状态 | 0x22 |
| 权限条件 | 特定客户端ID才有资格切扩展会话 | 0x7E |
| 顺序条件 | 默认会话不能直切编程会话 | 0x7E |
很多厂家还规定:想进扩展会话,必须先过27服务。
这也是为什么先切会话、再对暗号------因为对暗号本身就需要扩展会话权限。
郭靖恍然大悟:"所以我写94 01的时候,郎中先让我从游客变弟子(10 03),然后才能对暗号(27服务),最后才写进去。顺序不对,ECU根本不认!默认会话只能读,扩展会话可以写,编程会话才能刷------顺序错了,啥也干不了。"
五、武功高不高 且看数据包
1. 切扩展会话(10 03)
03 FC 80 01 00 00 00 02 10 03
| 字段 | 值 | 说明 |
|---|---|---|
| Protocol Version | 0x03 |
版本3 |
| Inverse Version | 0xFC |
暗号 |
| Payload Type | 0x80 0x01 |
诊断消息 |
| Payload Length | 0x00 00 00 02 |
2字节 |
| UDS命令 | 0x10 0x03 |
切扩展会话 |
2. 切扩展会话成功(50 03)
03 FC 80 01 00 00 00 08 50 03 00 32 01 F4 00 00
| 字段 | 值 | 说明 |
|---|---|---|
| DoIP头部 | 03 FC 80 01 00 00 00 08 |
负载长度8字节 |
| UDS响应 | 50 03 00 32 01 F4 00 00 |
正响应+参数,最后补0 |
响应里带两个时间参数:
-
00 32(50ms):P2Server_max,ECU处理请求的最大时间 -
01 F4(500ms):P2*Server_max,ECU返回NRC 0x78后的最大等待时间
3. 3E保活
请求:03 FC 80 01 00 00 00 02 3E 00
响应:03 FC 80 01 00 00 00 02 7E 00
4. S3超时后,被踢回大厅
ECU不主动发消息,只是把你踢下线。你发下一个请求时,它直接回NRC 0x22------你才发现已经被赶回大厅了。
六、这些坑,靖哥哥替你先踩了
| 坑 | 真相 |
|---|---|
| 以为只有27服务就能写 | 必须先切扩展会话 |
| 以为切一次会话永久有效 | 重新切同级会话,安全锁会重置 |
| 以为游客能直接变岛主 | 必须经过扩展会话 |
| 以为S3超时ECU会喊你 | 不会,下一脚直接踢 |
| 以为所有DID默认会话都能读 | 94 01这种,游客就是看不了 |
| 以为3E是"心跳"必须一直发 | 只要在S3时间内发一次就行,不用无脑狂刷 |
七、下步目标
郭靖感慨:"默认会话只能读,扩展会话可以写,编程会话才能刷------原来10服务就是ECU的'桃花岛身份',什么身份干什么活。3E保活就是告诉ECU'我还在',免得被踢出去。"
郎中笑着点头:"10服务和3E保活都讲完了。会话切换有顺序、有条件、有超时,3E续命,S3超时回退。
下一篇我们进入真正的硬仗------34/36/37刷写固件:换药方。"
黄蓉咬一口糖葫芦:
"桃花岛内规矩多,模式切换要会说。靖哥哥,你终于明白我为什么非得把94 01读出来了吧?"
郭靖老老实实:
"明白了。不是为了查岗,是想确认......有些话,你真的写进去了。"
黄蓉愣了一下,没接话,偷笑着把糖葫芦棍儿扔进垃圾桶。
写在最后
10服务 = ECU的"桃花岛身份":默认会话只能读,扩展会话可以写,编程会话才能刷。
3E服务 = 保活续命:告诉ECU"我还在",别踢我。
郭靖叹口气:"桃花岛内规矩多,学完10服务才敢说,真听懂了蓉儿的潜台词。"
打完收工,886。