首页 > 解决方案 > 使用python接收高速率的UDP数据包

问题描述

我正在使用 python 来接收来自 FPGA 的 UDP 数据包流,试图丢失尽可能少的数据包。数据包速率从大约 5kHz 到一些 MHz,我们希望在特定的时间窗口(代码中的 acq_time)中获取数据。我们现在有这个代码:

BUFSIZE=4096
dataSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dataSock.settimeout(0.1)
dataSock.bind((self.HOST_IP, self.HOST_PORT))
time0=time.time()
data_list = []
while time.time()-time0<acq_time:
     fast_acquisition(data_list)

def fast_acquisition(data_list_tmp):
    data, addr = dataSock.recvfrom(self.BUFSIZE)
    data_list_tmp.append(data) 
    return len(data)

采集完成后,我们将 data_list 保存在磁盘上。

这段代码旨在尽可能简单和快速,但它仍然太慢了,即使在 5kHz 时我们也会丢失太多数据包,我们认为这是因为当我们读取并将一个数据包存储在列表中并检查时间时,下一个(矿石)到达并丢失。有什么办法让插座保持打开状态吗?我们是否可以通过并行处理“串联”打开多个套接字,以便当我们从第一个保存文件时,第二个可以接收另一个数据包?我们甚至可以考虑只使用另一种语言来接收数据包并将其存储在磁盘上。

标签: pythonperformancesocketsudpfpga

解决方案


您可以使用tcpdump在 C 中实现)来捕获 UDP 流量,因为它比python

#!/bin/bash

iface=$1 # interface, 1st arg
port=$2  # port, 2nd arg

tcpdump -i $iface -G acq_time_in_seconds -n udp port $port -w traffic.pcap

然后您可以使用 egscapy来处理该流量

#!/usr/bin/env python

from scapy.all import *

scapy_cap = rdpcap('traffic.pcap')
for packet in scapy_cap:
    # process packets...

推荐阅读