当前位置: 首页 > news >正文

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

  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
  • 🍅 玩转CANoe,博客目录大全,点击跳转👉

📘前言

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

  • 🍅 演示软硬件环境 Windows11 x64CANoe 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>

  • 测试结果

在这里插入图片描述

在这里插入图片描述

🌎总结

23

  • 🍅 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。

7

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

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

相关文章:

  • 异常数据处理——3σ原则、箱线图
  • vue3.0 + tsx 构建el-button
  • 基于JAVA的TCP网络QQ聊天工具系统
  • 【WLAN】【调试】netsh wlan常用命令使用说明
  • 教程图文详解 - 网络安全(第八章)
  • Python数据分析案例08——预测泰坦尼克号乘员的生存(机器学习全流程)
  • 计算机四级——操作系统原理常用知识点个人总结(上)
  • 【学姐面试宝典】—— 前端基础篇Ⅰ
  • c++之二叉树
  • 字符串训练赛
  • Android性能优化之【启动优化】
  • Java 集合与数据结构 · 接口 interfaces ·Collection 常用方法 · Map 常用方法
  • 面试面不过?大厂面试官是这样说的···
  • 秒懂YUV444/YUV422/YUV420计算(二十九)
  • 模方重大更新,支持3ds max、新版大疆数据、匀色、多原点数据等
  • 深入了解以太坊
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 「面试题」如何实现一个圣杯布局?
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【个人向】《HTTP图解》阅后小结
  • android图片蒙层
  • Date型的使用
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • js正则,这点儿就够用了
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Magento 1.x 中文订单打印乱码
  • python学习笔记-类对象的信息
  • ReactNativeweexDeviceOne对比
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 温故知新之javascript面向对象
  • 小程序 setData 学问多
  • 2017年360最后一道编程题
  • Spring Batch JSON 支持
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)(4.6) Triducer
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Note)C++中的继承方式
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (三)docker:Dockerfile构建容器运行jar包
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)可以带来幸福的一本书
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .NET中GET与SET的用法
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @property python知乎_Python3基础之:property
  • @RunWith注解作用
  • [2669]2-2 Time类的定义
  • [C]编译和预处理详解
  • [iOS]iOS获取设备信息经常用法
  • [Latex学习笔记]数学公式基本命令