CAPL 封装了的SeedKey解锁函数,高复用性
- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📘前言
-
🍅 诊断测试用到27服务,解锁,一般都i有好多个解锁等级(subfunction ),甚至不同的解锁等级的种子字节长度还不一致,今天我就整合划一,封装了一个高复用性的函数
-
🍅 演示软硬件环境
Windows11 x64
;CANoe 11 SP2 x64
目录
- 📘前言
- 📙 代码
- 🍅 SeedKey解锁函数
- 🍅 测试用例
- 🌎总结
📙 代码
🍅 SeedKey解锁函数
-
函数参数模型:
void cal_seedKey(byte gSecurityLevel)
-
就一个输入参数,解锁等级,不用你去定义 diagrequest;也不需要关注seed和key有多少字节
void cal_seedKey(byte gSecurityLevel)
{
diagrequest *DiagSeedKey ;
long i, resSize,ret;
byte gSeedArray[255];
int gSeedArraySize ;
char gVariant[200] = "Variant1";
char gOption[200] = "option";
byte gKeyArray[255];
int gMaxKeyArraySize = 255;
dword gActualSize = 0;
//发送 0x27 xx
diagResize(DiagSeedKey,2);
DiagSetPrimitiveByte(DiagSeedKey,0,0x27);
DiagSetPrimitiveByte(DiagSeedKey,1,gSecurityLevel);
if(Send_DiagRequest_diag(DiagSeedKey) == 1)//上一步骤是pass
{
resSize = DiagGetRespPrimitiveSize(DiagSeedKey);
gSeedArraySize = resSize - 2 ; //去除诊断头部
for(i = 0; i < gSeedArraySize; i ++)
{
gSeedArray[i] = DiagGetRespPrimitiveByte(DiagSeedKey, i+2);
write("gSeedArray[%d]:0x%x",i,gSeedArray[i]);
}
//计算 Key
ret = DiagGenerateKeyFromSeed (gSeedArray, gSeedArraySize , gSecurityLevel, gVariant, gOption, gKeyArray, gMaxKeyArraySize, gActualSize); //generate key
if(ret==0)
{
//发送 0x27 xx+1
diagResize(DiagSeedKey,2+gActualSize);
DiagSetPrimitiveByte(DiagSeedKey,0,0x27);
DiagSetPrimitiveByte(DiagSeedKey,1,gSecurityLevel + 1);
for(i = 0; i < gActualSize; i ++) //去除诊断头部
{
DiagSetPrimitiveByte(DiagSeedKey,i+2,gKeyArray[i]);
}
Send_DiagRequest_diag(DiagSeedKey);
}
else
{
TestStepFail("can't generate key.");
}
}
}
//发送诊断,并判断是否是正响应
long Send_DiagRequest_diag(diagrequest *DiagReq)
{
char tempStr[100];
long retVal,lastCode;
// 下面两个参数应该是个全局变量
const long SendTimeout = 100;//ms
const long ReceiveTimeout = 1000;//ms
TestReportWriteDiagObject(DiagReq); //打印发送诊断
DiagSendRequest(DiagReq);
if (TestWaitForDiagRequestSent(DiagReq, SendTimeout)== 1)
{
//等待诊断响应
retVal = TestWaitForDiagResponse( DiagReq, ReceiveTimeout);
TestReportWriteDiagResponse(DiagReq); //打印诊断接收
if(retVal == 1) // 有响应
{
retVal = DiagGetLastResponseCode(DiagReq);
if(retVal == -1)//有正响应
{
TestStepPass("Positival response received, as expected.");
}
else
{
TestStepFail("Expected Positival response, But Not.");
return 0 ;
}
}
else
{
TestStepFail("Expected Positival response, But Not.");
return 0 ;
}
}
else
{
TestStepFail("Request could not be sent!");
return 0 ;
}
return 1;
}
🍅 测试用例
- 测试用例:
testcase TC_015()
{
diagRequest DefaultSession_Start req_DefaultSession_Start; //1001
diagRequest ExtendedDiagnosticSession_Start req_ExtendedSession_Start; //1003
diagSetTarget(ECU_Name);
Send_DiagRequest_diag(req_DefaultSession_Start);
Send_DiagRequest_diag(req_ExtendedSession_Start);
cal_seedKey(0x01);
Send_DiagRequest_diag(req_DefaultSession_Start);
Send_DiagRequest_diag(req_ExtendedSession_Start);
cal_seedKey(0x07);
}
- xml 脚本
<testmodule title="诊断函数测试" version="1.1">
<externalref type="url" title="CSDN蚂蚁小兵">
https://blog.csdn.net/qq_34414530
</externalref>
<testgroup title="TestGroup_1">
<capltestcase name="TC_015" title="TC_015"/>
</testgroup>
</testmodule>
- 测试结果
🌎总结
- 🍅 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。