CAPL 封装了的SeedKey解锁函数,高复用性

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAPL 封装了的SeedKey解锁函数,高复用性相关的知识,希望对你有一定的参考价值。


📘前言

  • 🍅 诊断测试用到27服务,解锁,一般都i有好多个解锁等级(subfunction ),甚至不同的解锁等级的种子字节长度还不一致,今天我就整合划一,封装了一个高复用性的函数

  • 🍅 演示软硬件环境 Windows11 x64CANoe 11 SP2 x64

目录


📙 代码

🍅 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>

  • 测试结果

🌎总结

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。

以上是关于CAPL 封装了的SeedKey解锁函数,高复用性的主要内容,如果未能解决你的问题,请参考以下文章

CAPL 封装了的SeedKey解锁函数,高复用性

高复用性响应对象类

封装了几个CAPL发送诊断相关函数,具有较高的可复用性

封装了几个CAPL发送诊断相关函数,具有较高的可复用性

封装了几个CAPL发送诊断相关函数,具有较高的可复用性

CAPL脚本中 getSignal和 setSignal 函数的封装,看完本节足够适应所有测试场景