注意:我不确定这是编程问题,还是与硬件/OS相关的问题。
我正在尝试使用Python3.3的套接字类捕获原始以太网帧。直接查看PyDoc网站中的示例
import socket
import struct
# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))
while True:
cf, addr = s.recvfrom(can_frame_size)
print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
try:
s.send(cf)
except OSError:
print('Error sending CAN frame')
try:
s.send(build_can_frame(0x01, b'\x01\x02\x03'))
except OSError:
print('Error sending CAN frame')我得到以下错误:
OSError: Errno 97地址家族不受协议支持。
打破了这条特定的路线:
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)我对代码所做的唯一更改是实际的接口名称(即'em1')。我用的是Fedora 15。
进一步看一下Python代码,似乎AF_CAN (地址系列)和CAN_RAW (协议)并不是正确的一对。
如何捕获用于进一步处理的原始以太网帧?
最终,我需要做的是捕获原始以太网帧,并在进入系统时对它们进行处理。
发布于 2013-12-20 13:39:41
我终于能够做到以下几点:
import socket
import struct
import time
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
test = []
while(1):
now = time.time()
message = s.recv(4096)
# Process the message from herehttps://stackoverflow.com/questions/20339377
复制相似问题