簡體   English   中英

如何使用Python 3.3實現原始幀捕獲?

[英]How do I implement a raw frame capture using Python 3.3?

注意:我不確定這是編程問題還是硬件/操作系統特定的相關問題。

我正在嘗試使用Python 3.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(協議)不是正確的對。

如何捕獲原始以太網幀以進行進一步處理?


最終,我需要做的是捕獲原始的以太網幀,並在將其進入系統時對其進行處理。

我終於可以做到以下幾點:

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 here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM