车载以太网之要火系列 - 第33篇:郭大侠学UDS(10服务)- 桃花岛内规矩多,模式切换要会说

写在开篇

上回说到,黄蓉读94 01("谁是靖哥哥最爱的心上人")被拒,郎中帮她"转了个身份"才读出来。具体怎么转的,正在气头上的蓉儿没顾得上细看。

第二天,等缓过神来,她直接拉着郭靖奔郎中店里。

"郎中!你昨天帮我转的那个'身份'到底是啥?为啥一转就能读靖哥哥的私密柜子了?"

郎中捋着胡子笑了:

"今天咱们就好好唠唠 UDS的另一个服务------10服务:诊断会话控制。说白了,就是ECU的'岛上身份'。"

黄蓉眼珠一转:"岛上身份?就像我爹桃花岛那套------一般游客模式、亲信弟子模式、岛主本尊模式?"

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

一、10服务:ECU的"桃花岛身份之谜"

10服务大名 DiagnosticSessionControl ,不读数据也不写数据,只做一件事:切换ECU的工作模式

身份 会话模式 能干啥 像谁
游客 默认会话(01) 读VIN、读故障码 岛上普通访客
弟子 扩展会话(03) 写数据、例程控制 亲信弟子
岛主 编程会话(02) 刷固件、改底层 黄岛主本尊

郎中在白板上写下这句口诀:

默认会话只能读,扩展会话可以写,编程会话才能刷。

郭靖念了一遍:"读、写、刷......郎中,这句好记!"

黄蓉也点头:"比降龙十八掌的口诀好背多了!"

二、会话状态机:桃花岛的三重身份

郎中画了张状态机图:

郎中指着图,四条规矩------

规矩一:上岛默认是游客(默认会话状态)

ECU上电自动进入默认会话,想升级?自己发命令。

规矩二:游客不能直接变岛主

默认会话不能直切编程会话(10 01 → 10 02禁止)。必须先切扩展会话,再切编程会话。

黄蓉秒懂:"想见我爹?得先当弟子,不能从大门口直接闯密室。"

规矩三:就算同级身份,重新切一次,锁也会重置

从非默认会话切到非默认会话(包括10 0310 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。

相关推荐
智者知已应修善业1 小时前
【51单片机从奇数始再转偶数逐一点亮并循环】2023-9-8
c++·经验分享·笔记·算法·51单片机
sealaugh321 小时前
react native(学习笔记第三课) 英语打卡微应用(2)-从上传图片开始
笔记·学习·react native
ACP广源盛139246256731 小时前
一芯搞定多屏高清@ACP#GSV1221 DP 1.4 MST 转 HDMI 1.4 高集成转换芯片
网络·人工智能·嵌入式硬件·计算机外设·电脑
Empty-Filled2 小时前
AI Agent 测试入门:从回答问题到执行任务
网络·人工智能
李李李勃谦2 小时前
鸿蒙PC打造电子书阅读器:支持 EPUB/PDF、书签同步、笔记管理
笔记·华为·pdf·harmonyos
Yupureki2 小时前
《Linux网络编程》4.应用层HTTP协议
linux·服务器·c语言·网络·c++·http
m0_738120722 小时前
网路安全编程——熟悉并使用Scapy简单实现捕捉主流邮箱协议(SMTP、POP3和IMAP) 的身份凭证
网络·python·网络协议·tcp/ip·安全·网络安全
U盘失踪了2 小时前
【笔记】Cookie 请求头的写法
笔记
Brilliantwxx2 小时前
【C++】认识vector(概念+题目OJ)
开发语言·c++·笔记·算法