Canoe/Canalyzer中加载DLL文件“自动“解锁UDS诊断27服务

点击返回「《UDS/OBD诊断需求编辑工具》总目录」

目录

1 如何在CanOe / Canalyzer中加载“DLL动态链接库文件”

2 如何制作该“DLL动态链接库文件”

2.1 如何获取“DLL动态链接库文件”的DEMO

2.2 使用Visual Studio打开“DLL动态链接库文件”的DEMO

2.2.1 API接口参数说明

2.2.2 举例:27服务解锁算法

2.2.3 生成DLL文件

结尾


案例背景

在CanOe / Canalyzer中加载诊断描述文件(CDD,PDX,Arxml…)时,Diagnotic Console窗口中,您可以看到这个诊断描述文件对应variant变体所支持的Service服务列表。在其中我们选中一个Service服务的Subfuncton/DID/RID…,并双击,或者选中一个Service服务的Subfuncton/DID/RID…,并单击Execute,即可通过CanOe / Canalyzer向下位机发送该UDS diagnostic request诊断请求

在请求某些UDS服务(如2E服务写DID…)前,需要先进行27服务对应security level安全等级解锁,Diagnotic Console窗口可以手动输入Key密钥进行解锁,如果解锁算法非常复杂,使用起来会非常的不便。

幸运的是:CanOe / Canalyzer提供加载DLL动态链接库文件,该DLL文件中集成了27服务security level安全等级解锁算法,自动完成“通过Seed计算得到Key”整个过程。

1 如何在CanOe / Canalyzer中加载“DLL动态链接库文件”

在CanOe / Canalyzer中,完成加载诊断描述文件(CDD,PDX,Arxml…)后,菜单栏依次选择Diagnostics -- > Diagnostic/ISO TP,在弹出的Diagnostic/ISO TP Configuration对话框中,选择对应CAN通道诊断描述文件中的Diagnostic Layer,在子页中找到Seed & Key DLL,加载DLL文件的存放路径。

2 如何制作该“DLL动态链接库文件”

2.1 如何获取“DLL动态链接库文件”的DEMO

无论是CanOe还是Canalyzer,在其安装路径下都会有下图这样的文件夹KeyGenDll_GenerateKeyExKeyGenDll_GenerateKeyExOpt,这就是制作该DLL文件的DEMO。

Canoe 11的路径:

Vector CANoe 11.0\Sample Configurations 11.0.55\CAN\Diagnostics\UDSSystem\SecurityAccess\Sources

Canalzyer 12的路径:

Diagnostics\UDSSystem\SecurityAccess\Sources

2.2 使用Visual Studio打开“DLL动态链接库文件”的DEMO

下面以文件夹KeyGenDll_GenerateKeyEx为例。双击打开GenerateKeyExImpl.vcproj文件(须确保电脑已经安装Visual Studio)。

使用Visual Studio打开该工程后,在右侧的“解决方案资源管理器”中,依次选择GenerateKeyExImpl -- > Source Files -- > GenerateKeyExImpl.cpp,接着在左侧你会看到被打开的GenerateKeyExImpl.cpp文件,在其中你会看到一个API GenerateKeyEx接口,在该API接口中完成“27服务各security level安全等级解锁算法”即可。

2.2.1 API接口参数说明

iSeedArray:表示接收到的27服务奇数subfunction中的Seed种子字节值“数组”;

iSeedArraySize:表示接收到的27服务奇数subfunction中的Seed种子长度;

iSecurityLevel:表示接收到的27服务Security Level安全等级;

iVariant:表示CanOe / Canalyzer中加载的诊断描述文件“当前使用的变体”;

ioKeyArray:表示27服务偶数subfunction中发送的Key密钥字节值“数组”;

iKeyArraySize:表示27服务偶数subfunction中的发送的Key密钥长度;

oSize:表示输出Key密钥长度,通常让oSize=iSeedArraySize;。

Key密钥通常按照以下方案在Tester中计算:

1)通过diagnostic request诊断请求从控制单元获取Seed种子

2)根据步骤 1 收到的Seed种子 (iSeedArray) 计算Key密钥 (ioKeyArray)。

为此,必须指定要生成Key密钥的控制单元的variant变体 (iVariant) 和security level安全等级 (iSecurityLevel)。可在diagnostic configuration dialog中配置用于计算的独立于manufacturer-dependent的 SeedKey-DLL 名称。

示例:

下面的 API 显示了计算Key密钥的函数的可能实现示例。API 因 OEM 而异。其他 API 的使用示例可在UDS Diagnostic System Configuration中找到。

KEYGENALGO_API VKeyGenResultEx GenerateKeyEx(const unsigned char* iSeedArray, unsigned int iSeedArraySize, const unsigned int iSecurityLevel, const char* iVariant, unsigned char* ioKeyArray, unsigned int iKeyArraySize, unsigned int& oSize)

3)在相应的diagnostic request诊断请求中设置步骤 2 计算出的Key密钥并发送至控制单元。

2.2.2 举例:27服务解锁算法

假设:Seed的长度为4,Key的长度也是4。Key = Seed + 123456。我们可以这样改写该API GenerateKeyEx接口。

KEYGENALGO_API VKeyGenResultEx GenerateKeyEx(
      const unsigned char*  iSeedArray,     /* Array for the seed [in] */
      unsigned int          iSeedArraySize, /* Length of the array for the seed [in] */
      const unsigned int    iSecurityLevel, /* Security level [in] */
      const char*           iVariant,       /* Name of the active variant [in] */
      unsigned char*        ioKeyArray,     /* Array for the key [in, out] */
      unsigned int          iKeyArraySize,  /* Maximum length of the array for the key [in] */
      unsigned int&         oSize           /* Length of the key [out] */
      )
{
    if (iSeedArraySize>iKeyArraySize)
      return KGRE_BufferToSmall;
    // for (unsigned int i=0;i<iSeedArraySize;i++)
    //  ioKeyArray[i]=~iSeedArray[i];
    unsigned int seed = 0;
    unsigned int key = 0;

    seed = ((iSeedArray[0] << 24) & 0xFF000000);
    seed |= ((iSeedArray[1] << 16) & 0x00FF0000);
    seed |= ((iSeedArray[2] << 8) & 0x0000FF00);
    seed |= ((iSeedArray[3] << 0) & 0x000000FF);

    key = seed + 123456;

    ioKeyArray[0] = ((key >> 24) & 0x000000FF);
    ioKeyArray[1] = ((key >> 16) & 0x000000FF);
    ioKeyArray[2] = ((key >> 8) & 0x000000FF);
    ioKeyArray[3] = ((key >> 0) & 0x000000FF);

    oSize = iSeedArraySize;
    
  return KGRE_Ok;
}

2.2.3 生成DLL文件

GenerateKeyExImpl.cpp文件编辑完成后,在右侧的“解决方案资源管理器”选中GenerateKeyExImpl,并鼠标右键,在其上下文中,单击生成。

在DEMO工程的路径下的Debug文件夹中,你会看到生成的SeednKey.dll文件。

将该SeednKey.dll文件加载到CanOe / Canalyzer中。

结尾

获取更多“汽车电子资讯”和“工具链使用”

请关注CSDN博客“汽车电子助手”,做您的好助手。

参考资源链接:[DoIP详解:远程诊断CANoe/CANalyzer应用](https://wenku.csdn.net/doc/1jpeqv0ga4?utm_source=wenku_answer2doc_content) 为了有效地配置CANoe/CANalyzer以使用DoIP进行车辆远程诊断,首先需要理解DoIP的基本概念和应用场景。推荐参考《DoIP详解:远程诊断CANoe/CANalyzer应用》一书,它详细讲解了如何在CANoe/CANalyzer中配置和实现DoIP通信,并提供了丰富的项目实战和常见问题解决方案。 在CANoe/CANalyzer中配置DoIP通信,通常涉及以下步骤: 1. **安装并启动CANoe/CANalyzer**:确保软件已正确安装,并熟悉其用户界面。 2. **加载描述文件(CDD/ODX)**:在软件中加载与目标ECU相对应的CDD或ODX描述文件,确保软件能够识别ECU的数据结构和通信协议。 3. **配置DoIP通道**:在CANoe/CANalyzer中配置DoIP通道,设置好逻辑地址,包括IP地址和端口号,以模拟车辆中的ECU。 4. **设置TCP/UDP协议**:选择合适的通信协议(TCP或UDP),并根据需要配置相关参数。例如,在TCP连接中设置正确的超时时间和重连策略。 5. **激活诊断连接**:通过OBD接口或CANoe/CANalyzer内置的DoIP模块激活诊断会话。 6. **多连接处理**:如果需要同时处理多个ECU的诊断请求,确保在逻辑地址中正确设置多连接参数,并在软件中管理好每个连接。 7. **数据监控和故障诊断**:在建立好诊断连接后,使用CANoe/CANalyzer的强大功能进行数据监控、故障诊断和分析。 在配置DoIP通信时,务必注意网络安全和数据安全的措施,保护诊断会话免受未经授权的访问和攻击。此外,确保逻辑地址的设置不会导致网络中的地址冲突。 完成以上配置后,你应该能够在CANoe/CANalyzer中成功建立DoIP通信,并进行车辆远程诊断。为了深入理解DoIP的工作原理以及如何在复杂网络中部署和管理DoIP通信,建议阅读《DoIP详解:远程诊断CANoe/CANalyzer应用》一书,它将帮助你更全面地掌握这一领域的知识。 参考资源链接:[DoIP详解:远程诊断CANoe/CANalyzer应用](https://wenku.csdn.net/doc/1jpeqv0ga4?utm_source=wenku_answer2doc_content)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车电子助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值