[英]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.