如何截获J1939 CAN消息?

时间:2018-11-01 13:49:46

标签: matlab simulation simulink can-bus j1939

我正在用Simulink建立HIL / SIL测试,该测试从车辆上测试车辆控制单元(VCU)。该VCU通过J1939 CAN网络与配电模块(PDM)进行通信。 PDM处理开关和执行器的输入和输出,并将信息放置在CAN总线上。然后,VCU知道从连接的传感器看到的PDM。反过来,VCU将有关PDM如何控制连接的执行器的信息放在CAN总线上。

我的笔记本电脑通过Vector适配器和Simulink连接到同一CAN总线。

要测试VCU,我需要模仿PDM并将消息发送到VCU,就像我是PDM一样。然后,VCU必须采取正确的措施并相应地控制实际的PDM。

很明显,如果我只是模仿PDM,则我的消息将干扰从实际PDM发送的消息。因此,基本上,我需要PDM关闭并仅收听。我为PDM发言。但是,PDM无法配置为仅侦听模式,因此我必须拦截其发送的所有消息,以使它们永远不会到达VCU。

我的想法是,当PDM开始发送时,我会检测(通过观察所有消息的仲裁字段),并在仲裁字段中拉低一点。它认识到我的“消息”优先于自身的消息,并且会停止传输。好像CAN总线总是忙于为PDM腾出空间。这将关闭PDM,而不会引发错误。但是欢迎其他建议。

那么(怎么)可以在MATLAB / Simulink或单独的CAN控制器中拦截J1939 CAN消息?

1 个答案:

答案 0 :(得分:2)

这是一个想法,如何实现您要寻找的东西。但是,您需要一些额外的硬件。

这是粗略的轮廓:

  • 设置一个CAN网关设备,该设备具有两个独立的CAN接口can0can1
  • 断开PDM与CAN总线的连接,然后将其连接到CAN网关的接口之一,例如can0
  • 将CAN网关的第二个接口can1连接到原始CAN总线,其中还包括您的笔记本电脑和VCU
  • 对您的CAN网关进行编程,以将can1上的所有传入CAN帧转发到can0接口
  • 当您要忽略来自PDM的所有消息时,只需忽略接口can0中进入的CAN帧,然后将其转发到can1

示例,如何实现这样的CAN网关:

  • 硬件:使用具有两个can接口的Raspberry Pi和CAN扩展板,例如PiCAN2 duo板。
  • 软件:使用Linux中已经包含的socketcan,编写一个小程序来在接口can0can1之间转发流量。
  • 如果您的设备通过更高层的J1939传输协议进行通信,则可能还需要使J1939 transport protocol在Raspberry Pi上运行。如果仅使用最大有效载荷为8字节数据的29位标识符,则也不必这样做。
  • 或者,您也可以使用更昂贵的商业解决方案,例如CAN-Router

您的原始想法:

我认为您的设想在技术上是可行的,但可能还有其他缺点。

  • 由于can控制器的驱动程序通常在传输仍在进行时不公开接口以交互方式操纵CAN帧,因此您可以直接从微控制器访问can-收发器
  • 一些研究人员通过将仲裁ID之后的CAN帧中的第一个隐性位转换为某些选定的CAN-ID的显性位来实现CAN Denial of service attack。他们使用了Arduino Uno和Microchip MCP2551 E / P CAN收发器。所使用的代码也是available online。由于在传输过程中对CAN帧的这种交互操作与您要寻找的东西有关,因此这可能是您的一个很好的起点。
  • 当您以这种方式使PDM静音时,我仍然看到一些缺点:
    • 您不仅将以这种方式使PDM静音,而且(至少)延迟具有仲裁ID的CAN总线上其他节点的传输,这些仲裁ID具有 优先级比PDM中的消息低
    • 当重试一定次数后,PDM无法成功将其CAN帧发送到总线时,PDM很可能会进入某种错误状态

又一个想法:

如果您能够改编VCU的软件,请以不消耗PDM的CAN帧,而是使用不同的CAN-ID来使用笔记本电脑的CAN帧的方式更改它消息。为此,您将不得不更改dbc文件。