Bootstrap

【UDS诊断(ClearDiagnosticInformation_0x84服务)测试用例CAPL代码全解析⑥】


ISO 14229-1:2023 UDS诊断【ClearDiagnosticInformation_0x84服务】_TestCase06

作者:车端域控测试工程师
更新日期:2025年03月08日
关键词:UDS诊断协议、清除诊断信息服务、ClearDiagnosticInformation_0x84服务、ISO 14229-1:2023

TC84-006测试用例

用例ID测试场景验证要点参考条款预期结果
TC84-006安全访问未授权操作未解锁安全权限时清除关键DTC§7.5.7.3.3返回NRC=0x33(安全拒绝)

TC8406 安全访问未授权操作CAPL测试代码
更新时间:2025年3月8日 09:05
协议版本:ISO 14229-1:2020
开发环境:CANoe 11.0 SP0 + CAPL 7.3


一、代码架构设计

NRC=0x33
其他响应
数据一致
数据异常
初始化测试环境
捕获系统基础状态
发送未授权清除请求
响应验证
执行系统状态二次验证
标记测试失败
测试通过
测试失败

二、完整CAPL代码

/* ================================================================= 
   TC8406 安全访问未授权操作验证(CANoe 11.0 SP0优化版)
   核心特性:
   - 安全状态双重校验机制 
   - 动态DTC数据对比 
   - 增强型错误追踪 
================================================================== */
variables {
  // 协议常量 
  const dword kClearService = 0x84;
  const byte kSubFunction = 0x01;
  const dword kDTCGroup = 0x000102;       // 动力总成关键DTC组 
  const byte kExpectedNRC = 0x33;         // 预期否定响应码 
  
  // 运行时状态 
  struct {
    word initialDTCs;                    // 初始DTC数量 
    byte securityLevel;                  // 当前安全等级 
    timer responseTimer;                 // 响应超时监控 
  } gTestState;
}
 
//  系统状态捕获 
void CaptureSystemState() {
  // 获取当前安全等级 
  diagRequest reqSecLevel: 0x27[0x01];
  if(diagSendRequest(reqSecLevel) == diagOK) {
    gTestState.securityLevel = reqSecLevel.Response.Data[0];
    testStepPassWithContext("安全状态记录", 
      "当前安全等级: 0x%02X", gTestState.securityLevel);
  }
  
  // 读取DTC总数 
  diagRequest reqDTC: 0x19[0x02, 0xFF, 0x00];
  reqDTC.SendRequest();
  gTestState.initialDTCs = reqDTC.Response.NumberOfDTCs;
  testStepPassWithContext("DTC基准记录", 
    "当前DTC数量: %d", gTestState.initialDTCs);
}
 
//  响应处理 
on diagResponse kClearService::kSubFunction {
  cancelTimer(gTestState.responseTimer);  // 取消超时监控 
  
  if(this.Nrc == kExpectedNRC) {
    testStepPassWithContext("安全拦截验证", 
      "预期NRC=0x%02X | 实际NRC=0x%02X", kExpectedNRC, this.Nrc);
    
    // 启动系统状态校验 
    VerifySystemIntegrity();
  } else {
    testCaseFailEx("权限验证异常", 
      "非法响应码: 0x%02X", this.Nrc);
  }
}
 
//  系统完整性校验 
void VerifySystemIntegrity() {
  diagRequest reqVerifyDTC: 0x19[0x02, 0xFF, 0x00];
  diagRequest reqVerifySec: 0x27[0x01];
  
  // 并行发送验证请求 
  reqVerifyDTC.SendRequest();
  reqVerifySec.SendRequest();
  
  // 数据对比分析 
  if((reqVerifyDTC.Response.NumberOfDTCs == gTestState.initialDTCs) &&
     (reqVerifySec.Response.Data[0] == gTestState.securityLevel)) {
    testCasePassEx("系统状态一致性确认",
      "DTC差值: %d | 安全等级: 0x%02X", 
      reqVerifyDTC.Response.NumberOfDTCs - gTestState.initialDTCs,
      reqVerifySec.Response.Data[0]);
  } else {
    testCaseFailEx("系统状态异常", 
      "DTC变化: %d | 安全等级变化: 0x%02X→0x%02X",
      reqVerifyDTC.Response.NumberOfDTCs - gTestState.initialDTCs,
      gTestState.securityLevel, reqVerifySec.Response.Data[0]);
  }
}
 
//  超时处理 
on timer gTestState.responseTimer {
  testCaseFailEx("服务响应超时", "等待时间: 2000ms");
}
 
//  主测试逻辑 
testcase TC8406_SecurityAccessValidation() {
  testCaseBegin("TC8406 安全访问未授权操作验证");
  
  // █ 阶段1:环境预置 
  CaptureSystemState();
  
  // █ 阶段2:发送清除请求 
  byte groupBytes[3] = {
    (kDTCGroup >> 16) & 0xFF, 
    (kDTCGroup >> 8) & 0xFF, 
    kDTCGroup & 0xFF 
  };
  
  diagRequest reqClear: kClearService[kSubFunction, groupBytes];
  diagSendRequest(reqClear);
  testStepPassWithContext("诊断请求发送", 
    "报文内容: %02X %02X %02X%02X%02X",
    kClearService, kSubFunction, 
    groupBytes[0], groupBytes[1], groupBytes[2]);
  
  // 启动超时监控 
  gTestState.responseTimer.set(2000);
}

三、CANoe 11.0 SP0增强功能应用

  1. 诊断优化特性

    // 增强型响应处理(支持多帧响应解析)
    diagSetParameter("CanTp", "EnhancedResponseHandling", 1);
    
    // 精确时间戳记录(微秒级精度)
    testSetTimestampResolution(TIME_MICROSECONDS);
    
  2. 测试报告增强

    功能点实现方式输出示例
    上下文数据绑定testStepPassWithContext“安全等级: 0x00 @09:05:23.456”
    差异值高亮testCaseFailEx条件判断红色标注DTC数量差值
    时序关系可视化自动生成Mermaid时序图显示请求/响应时间间隔

四、执行验证说明

  1. 环境配置要求

    [DiagnosticConfig]
    ActiveSecurityLevel=0x00 
    DTCGroupLock=0x000102 
    MaxResponseTime=2000 
    
    [TestReport]
    DetailLevel=5 
    AutoGraphGeneration=1 
    
  2. 预期测试日志

    [09:05:23.456] TEST CASE BEGIN: TC8406 安全访问未授权操作验证 
    [09:05:23.458] ✔ 安全状态记录 | 当前安全等级: 0x00 
    [09:05:23.460] ✔ DTC基准记录 | 当前DTC数量: 8 
    [09:05:23.462] ✔ 诊断请求发送 | 报文内容: 84 01 000102 
    [09:05:23.465] ✔ 安全拦截验证 | 预期NRC=0x33 | 实际NRC=0x33 
    [09:05:23.470] ✔ 系统状态一致性确认 | DTC差值: 0 | 安全等级: 0x00 
    [09:05:23.472] TEST CASE PASS: 执行耗时 16ms 
    

五、异常场景处理扩展

  1. 安全状态异常检测

    // 在VerifySystemIntegrity中增加:
    if(reqVerifySec.Response.Data[0] > 0x00) {
      testCaseAddWarning("安全状态异常提升", 
        "当前等级: 0x%02X", reqVerifySec.Response.Data[0]);
      
      // 强制复位安全状态 
      diagRequest ResetSecurity: 0x11[0x01];
      diagSendRequest(ResetSecurity);
    }
    
  2. DTC数据篡改监控

    // 在VerifySystemIntegrity中增加哈希校验:
    diagRequest ReadMemHash: 0x23[0x12, 0x34, 0x1000, 0x200];
    ReadMemHash.SendRequest();
    if(memcmp(ReadMemHash.Response.Data, gTestState.memoryHash, 32) != 0) {
      testCaseFailEx("存储数据篡改", 
        "内存哈希校验失败");
    }
    

技术提示:

  1. 使用diagGetLastErrorCode()获取详细错误信息
  2. 推荐启用Security Audit Trail功能记录所有安全相关事件
  3. 对于Autosar系统,需在Dcm模块配置中开启DTC_WRITE_PROTECTION选项
;