从客户端读取来自 GNU Radio UDP sink 的信号

问题描述

说实话,我有点困惑,我想错误很明显。无论如何。

因此,一方面,我有一个来自 GNU Radio 的 UDP 接收器向 Python 客户端发送数据。

问题是我收到的数据没有多大意义(如果我从文件接收器读取数据,我能够正确读取数据,所以这与我处理网络部分的方式有关).

我已经尝试过小端和大端,以防万一,我仍然会得到垃圾

因此,在接收器端(服务器端),块配置是:

self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_gr_complex*1,"the_ip",8080,1472,True)

所以,另一方面我会得到 1500 个字节,不是吗? UDP报头的有效载荷+28的1472。

我所做的,基于这个 [1] 示例似乎没问题,正在客户端读取 1500 个字节,并假设标头是通过 recvfrom 方法取出的:

data_tmp,addr = sock.recvfrom(1500)

我假设 data_tmp 应该是 1472 字节的数据,至少长度匹配)。

当我发送 gr_complex 时,我读取了 8 个字节(两个浮点小端,一个用于 I,一个用于 Q 组件)。

那么,我错过了什么?

谢谢!!

[1] 还有很多其他类似的,重点是我假设该方法将标头与有效载荷分开。 https://www.binarytides.com/programming-udp-sockets-in-python/

解决方法

当您从套接字读取时,UDP 标头已被删除,因此您不应尝试读取 1500 字节而是 1472。

除此之外,这看起来不错。

我通常建议不要使用 UDP(你必须自己处理数据包丢失,甚至可能是 L2 碎片等),但是 ZeroMQ 接收器之一(PUSH Socket 会是一个很好的选择)想法在这里)和你最喜欢的 Python ZeroMQ 库(pyzmq)作为另一端(PULL socket);您可以通过 TCP(如果需要通过网络)、IPC(如果您的 GNU Radio 流图和接收程序可以使用 Unix 进程间通信)或几个“专家”传输接口获得低开销数据传递接口。>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...