ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase06
作者:车端域控测试工程师
更新日期:2025年02月14日
关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023
TC10-006测试用例
用例ID测试场景验证要点参考条款预期效果TC10-006会话嵌套冲突检测在编程会话中哀求切换至扩展会话§7.5.3返回NRC=0x22(条件不满意)- /*-------------------------------------------------------------------
- 测试用例 TC10-006:会话嵌套冲突检测(增强版)
- 标准依据:ISO 14229-1 §7.5.3
- 验证目标:编程会话中禁止切换其他会话模式
- 预期响应:NRC=0x22(conditionsNotCorrect)
- -------------------------------------------------------------------*/
- variables {
- message 0x7E0 DiagReq = {dlc=8}; // 诊断请求报文
- message 0x7E8 DiagRes; // 诊断响应报文
- msTimer securityDelay; // 安全延时计时器
- byte currentSession; // 当前会话状态
- byte securityLevel; // 安全访问级别
- byte seed[4]; // 安全种子存储
- byte key[4]; // 计算密钥存储
- }
-
- //==================== 预置条件设置函数 ====================
- void Precondition_ProgrammingSession() {
- /
- 分步式会话建立流程:
- 1. 强制进入默认会话
- 2. 请求进入编程会话
- 3. 执行安全访问解锁
- 4. 验证最终状态
- /
-
- // 阶段1:确保默认会话
- sysSetVariable("Diag::Session", 0x01);
- DiagReq.byte(0) = 0x10; // 诊断会话控制
- DiagReq.byte(1) = 0x01; // 默认会话
- DiagReq.dlc = 2;
- output(DiagReq);
- testWaitForMessage(0x7E8, 1000);
- if(DiagRes.byte(0) != 0x50 || DiagRes.byte(1) != 0x01) {
- testStepAbort("默认会话建立失败");
- }
-
- // 阶段2:进入编程会话
- DiagReq.byte(1) = 0x02; // 编程会话
- output(DiagReq);
- testWaitForMessage(0x7E8, 1500);
- if(DiagRes.byte(0) != 0x50 || DiagRes.byte(1) != 0x02) {
- testStepAbort("编程会话进入失败,代码:0x%02X%02X",
- DiagRes.byte(0), DiagRes.byte(1));
- }
-
- // 阶段3:安全访问解锁(示例算法)
- // 步骤3.1:请求种子
- DiagReq.byte(0) = 0x27; // 安全访问服务
- DiagReq.byte(1) = 0x01; // 请求种子
- output(DiagReq);
- testWaitForMessage(0x7E8, 2000);
- if(DiagRes.byte(0) == 0x67 && DiagRes.byte(1) == 0x01) {
- // 提取种子值(假设4字节种子)
- seed[0] = DiagRes.byte(2);
- seed[1] = DiagRes.byte(3);
- seed[2] = DiagRes.byte(4);
- seed[3] = DiagRes.byte(5);
-
- // 步骤3.2:发送密钥(示例:取反算法)
- key[0] = ~seed[0];
- key[1] = ~seed[1];
- key[2] = ~seed[2];
- key[3] = ~seed[3];
-
- DiagReq.byte(1) = 0x02; // 发送密钥
- DiagReq.byte(2) = key[0];
- DiagReq.byte(3) = key[1];
- DiagReq.byte(4) = key[2];
- DiagReq.byte(5) = key[3];
- DiagReq.dlc = 6;
- output(DiagReq);
- testWaitForMessage(0x7E8, 2000);
- if(DiagRes.byte(0) != 0x67 || DiagRes.byte(1) != 0x02) {
- testStepAbort("安全解锁失败,代码:0x%02X%02X",
- DiagRes.byte(0), DiagRes.byte(1));
- }
- } else {
- testStepAbort("种子获取失败,代码:0x%02X%02X",
- DiagRes.byte(0), DiagRes.byte(1));
- }
-
- // 阶段4:最终状态验证
- if(sysGetVariable("Diag::Session") != 0x02 ||
- sysGetVariable("Security::Unlocked") != 0x01) {
- testStepAbort("预置条件验证失败:会话=0x%02X 安全=0x%02X",
- sysGetVariable("Diag::Session"),
- sysGetVariable("Security::Unlocked"));
- }
- }
-
- //==================== 主测试用例 ====================
- testcase TC10_006_SessionNestingCheck()
- {
- // 执行增强型预置条件设置
- Precondition_ProgrammingSession();
- write("预置条件验证通过:已进入安全解锁的编程会话");
-
- //==================== 测试步骤执行 ====================
- DiagReq.byte(0) = 0x10; // 诊断会话控制
- DiagReq.byte(1) = 0x03; // 扩展会话
- DiagReq.dlc = 2;
- output(DiagReq); // 发送冲突请求
-
- //==================== 响应分析 ====================
- testWaitForMessage(0x7E8, 1500); // 1.5秒响应超时
- if(TestGetLastError() == teTimeout) {
- testStepFail("ECU响应超时");
- }
- else if(DiagRes.byte(0) == 0x7F && DiagRes.byte(2) == 0x22) {
- testStepPass("NRC 0x22验证成功");
- }
- else {
- testStepFail("异常响应:0x%02X%02X%02X",
- DiagRes.byte(0), DiagRes.byte(1), DiagRes.byte(2));
- }
-
- //==================== 后置清理 ====================
- // 发送硬件复位恢复初始状态
- DiagReq.byte(0) = 0x11; // ECU复位
- DiagReq.byte(1) = 0x01; // 硬件复位
- output(DiagReq);
- testWaitForTimeout(3000); // 等待ECU重启
- }
-
- /*------------------------- 执行日志示例 -------------------------
- [2025-02-15 21:47:15] 进入默认会话成功
- [2025-02-15 21:47:16] 编程会话建立成功
- [2025-02-15 21:47:17] 安全解锁完成(种子:A7 3B F0 89)
- [2025-02-15 21:47:18] 发送非法会话切换请求:10 03
- [2025-02-15 21:47:18] 收到预期响应:7F 10 22
- [2025-02-15 21:47:21] ECU复位成功
- ----------------------------------------------------------------*/
复制代码 加强特性说明
- // 分阶段建立目标状态(取代直接设置变量)
- Precondition_ProgrammingSession();
复制代码- // 预留安全算法扩展点(示例为取反算法)
- on key* {
- // 可替换为实际安全算法
- key[i] = ~seed[i];
- }
复制代码- // 实时监控诊断状态
- on sysvar Diag::Session changed {
- write("会话变更:0x%02X → 0x%02X @ %dms",
- @sysvar::Diag::Session, @this, timeNow());
- }
复制代码 预置条件流程图
关键改进点
- 真实环境模仿
- 使用现实诊断流程建立会话状态,而非直接设置系统变量
- 包罗完整的安全访问流程(27服务)
- 错误传播机制
- // 分级错误处理
- if(DiagRes.byte(0) != 0x67) {
- testReportPicture("安全服务异常", "响应代码:0x%02X", DiagRes.byte(0));
- testStepAbort("安全服务异常终止");
- }
复制代码 - 可维护性加强
- 将预置条件封装为独立函数
- 使用常量界说代替魔术数字
- 添加详细的调试日志
测试数据记载发起
在测试报告中应包罗以下关键数据:
- 会话切换时间序列
- 安全种子-密钥对验证记载
- ECU响应时间统计(单元:ms)
- 总线错误帧计数
- 温度/电压等环境参数(若可获取)
摆设说明:
- 将安全算法部分替换为现实ECU使用的算法
- 根据总线类型调整DLC设置(CAN/CAN FD)
- 在testcase前添加环境查抄:
- if(sysGetVariable("ECU::PowerStatus") != 0x01) {
- testReportWarning("ECU未上电,测试中止");
- return;
- }
复制代码 - 发起共同使用CAPL的testmodule功能实现批量测试
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |