Python 套接字无法读取 Jetson 硬件上的 UDP 数据包

问题描述 投票:0回答:2

我有 UDP 数据包通过以太网连接发送到我的设备。我正在尝试使用 Python 中的

socket
库(版本 3.8.10)读取它们的数据;然而,尽管当我运行
tcpdump
时它们显示在设备上,但我的 Python 程序从未收到数据,我不确定为什么。

我想从我的本地端口接收数据

2368
;但是,它不起作用。我将在下面提供更多信息。


这是我用来从我感兴趣的套接字读取数据的代码。

import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as soc:
    soc.bind(("", 2368))
    data = soc.recv(2000) # I'm using an arbitrary buffer size
    print("Received Data!", data)

主要问题:我在运行此代码时遇到问题的硬件是带有 Ubuntu 20.04.5 LTS 和 Gnome 3.36.8 的 Jetson Xavier(我不太确定 Gnome 是什么)。当我尝试在此硬件上运行上面的 Python 代码时,

soc.recv(2000)
函数会阻塞,因为它无法从端口读取数据,并且永远不会到达打印语句。但是,当我在命令行中运行
tcpdump
时,我得到以下输出。

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:07:29.621066 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.622382 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.623765 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.625010 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.626340 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.627667 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.628815 IP 192.168.1.201.8308 > 255.255.255.255.8308: UDP, length 512
15:07:29.628819 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.630328 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
15:07:29.631656 IP 192.168.1.201.2368 > 255.255.255.255.2368: UDP, length 1206
10 packets captured
24 packets received by filter
0 packets dropped by kernel

因此,我相信 Jetson(我所在的计算机)正在通过以太网连接接收 UDP 数据包;但是,由于某种原因,我无法从 Python UDP 服务器读取它。如果有人对发生这种情况的原因有任何建议,以及如何解决此问题有任何建议,请告诉我。我只想通过Python程序读取UDP数据包。我不确定这是否是由于程序不当而导致的错误(我认为这不是由于我在下面提供的附加信息而导致的问题),或者是Python程序和

tcpdump
命令之间的网络被分割了或者防火墙阻止了它们,例如此链接。我对 Ubuntu 很不熟悉,所以如果这是防火墙问题,我希望得到一些有关如何调整防火墙以解决此问题的指导。我尝试禁用
ufw
并添加一条规则,谢谢!


附加信息:有关一些附加信息,我尝试在运行 MacOC Monterey (12.5.1) 并连接以太网连接的 2019 MacBook Pro 上运行此代码,并且在阻塞

soc.recv(2000)
调用能够执行的情况下,它运行得非常好。返回,并到达打印语句。下面,我列出了 UDP 数据包发送到 MacBook 时的
tcpdump
输出。这让我相信我的代码是正确的,但由于某些与操作系统或硬件相关的原因,我无法简单地将代码复制到 Jetson 上并正确运行它。

Jetson(上面不起作用)和 Macbook(下面起作用)之间的两个

tcpdump
输出之间存在一些显着差异,例如提到
broadcasthost
opentable
。我不完全确定这些意味着什么,所以任何有助于我理解这些的帮助也将不胜感激。

tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes
15:47:32.528190 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.529466 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.530802 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.532092 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.533425 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.534734 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.536098 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.536350 IP 192.168.1.201.8308 > broadcasthost.8308: UDP, length 512
15:47:32.537433 IP 192.168.1.201.opentable > broadcasthost.opentable: UDP, length 1206
15:47:32.537868 IP 192.168.1.201.8308 > broadcasthost.8308: UDP, length 512
10 packets captured
16 packets received by filter
0 packets dropped by kernel

如果我可以提供任何其他信息或有关如何在 Stackoverflow 上构建我的问题的任何指导,请告诉我,谢谢!

python sockets ubuntu udp jetson-xavier
2个回答
0
投票

发送到计算机的数据包是由 Velodyne LiDAR 发送的。有说明手动设置我们从中接收数据的以太网连接的 IP 地址,并遵循这些说明,使我能够使用上面编写的代码并从 LiDAR 读取数据包。


0
投票

我的 Jetson Nano 也有同样的问题。你能解决这个问题吗?我正在使用 Jetson nano 和 DCA1000EVM 板。

© www.soinside.com 2019 - 2024. All rights reserved.