繁体   English   中英

Python-can:可以在 CAN 总线上注入故障吗?

[英]Python-can: Fault injection on CAN bus possible?

我目前正在对 CAN 节点进行一些测试,其中我使用 python-can 和 Linux SocketCAN 从节点发送和接收 CAN 帧。

定期发送和接收工作正常,但现在我想注入故障并查看 CAN 节点的行为。

有谁知道是否可以这样做,例如通过更改帧的 CRC。 我已经进行了一项测试,我取消了 CAN 接口,因此节点关闭了总线,但要测试的 CAN 错误太多了。

编辑:为了清楚起见:我正在研究一个测试框架,使用 pytest 和 python-can,并且为了定期发送 CAN 帧,我有以下代码:

import can
bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=250000)
msg = can.Message(arbitration_id=can_id,
                  data=data,
                  is_extended_id=False)
bus.send(msg)

在这里它对我来说停止了,我可以为 API 读取什么,这里没有故障注入选项( Pyhon-can API )。

我今天所拥有的另一个例子:

import can
bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=250000)
msg = can.Message(arbitration_id=can_id,
                  data=data,
                  is_error_frame=True)
bus.send(msg)

以上代码在总线上生成错误帧,这是我正在设计的故障处理测试的一部分。

所以,我不熟悉图书馆,但是似乎是图书馆中唯一公开 CRC 一词的地方。

我担心可能没有一种本地方法可以做到这一点,但是您可以扩展库的类并自己覆盖 CRC 字段,也许吧。

can.message的实现不允许你接触 CRC。 然而,这是一个“meh”消息,因为当您第一次创建can.message()对象时不会计算 CRC。

socketcan.send()方法中的快速搜索也没有提及 CRC,因此它可能在两者之间计算。 或者,我更害怕这个,它是由外部库libc计算的,该库再次在can.interfaces.socketcan类中引用:

try:
    libc = ctypes.CDLL(ctypes.util.find_library("c"), use_errno=True)
    libc.bind.errcheck = check_status
    libc.connect.errcheck = check_status
    libc.sendto.errcheck = check_status
    libc.recvfrom.errcheck = check_status
except:
    log.warning("libc is unavailable")
    libc = None

如果是这种情况,您将很难解决 CRC。 我真诚地希望这为您指明了正确的方向,我对这个特定图书馆的了解非常有限,我真的不能做更多。

我现在已经对此进行了更多调查,并且还与我的 CAN 加密狗的硬件供应商进行了核对。 看来我想做的事情从SW端是不可能的,我需要购买另一个可以支持这种错误注入的HW CAN dongle。

硬件供应商还告诉我,这些类型的测试通常由 CAN 控制器供应商完成,所以这不是(据他说)不是一个正常且简单的测试用例。

所以我现在离开这个话题,并继续进行其他测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM