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
一、代码架构设计
二、完整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增强功能应用
-
诊断优化特性
// 增强型响应处理(支持多帧响应解析) diagSetParameter("CanTp", "EnhancedResponseHandling", 1); // 精确时间戳记录(微秒级精度) testSetTimestampResolution(TIME_MICROSECONDS);
-
测试报告增强
功能点 实现方式 输出示例 上下文数据绑定 testStepPassWithContext
“安全等级: 0x00 @09:05:23.456” 差异值高亮 testCaseFailEx
条件判断红色标注DTC数量差值 时序关系可视化 自动生成Mermaid时序图 显示请求/响应时间间隔
四、执行验证说明
-
环境配置要求
[DiagnosticConfig] ActiveSecurityLevel=0x00 DTCGroupLock=0x000102 MaxResponseTime=2000 [TestReport] DetailLevel=5 AutoGraphGeneration=1
-
预期测试日志
[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
五、异常场景处理扩展
-
安全状态异常检测
// 在VerifySystemIntegrity中增加: if(reqVerifySec.Response.Data[0] > 0x00) { testCaseAddWarning("安全状态异常提升", "当前等级: 0x%02X", reqVerifySec.Response.Data[0]); // 强制复位安全状态 diagRequest ResetSecurity: 0x11[0x01]; diagSendRequest(ResetSecurity); }
-
DTC数据篡改监控
// 在VerifySystemIntegrity中增加哈希校验: diagRequest ReadMemHash: 0x23[0x12, 0x34, 0x1000, 0x200]; ReadMemHash.SendRequest(); if(memcmp(ReadMemHash.Response.Data, gTestState.memoryHash, 32) != 0) { testCaseFailEx("存储数据篡改", "内存哈希校验失败"); }
技术提示:
- 使用
diagGetLastErrorCode()
获取详细错误信息- 推荐启用
Security Audit Trail
功能记录所有安全相关事件- 对于Autosar系统,需在
Dcm模块
配置中开启DTC_WRITE_PROTECTION
选项