从客户端读取来自 GNU Radio UDP 接收器的信号

Reading signal from GNU Radio UDP sink from client side

老实说我有点困惑,我想错误很明显。不管怎样

所以,一方面我有一个从 GNU Radio 发送数据到 Python 客户端的 UDP 接收器。

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

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

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

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

所以,在另一边我会得到 1500 字节,不是吗? 1472 的有效载荷 +28 的 UDP header.

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

data_tmp, addr = sock.recvfrom(1500)

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

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

那么,我错过了什么?

谢谢!!

[1] 还有许多其他类似的方法,关键是我假设该方法将 header 从有效负载中拆分出来。 https://www.binarytides.com/programming-udp-sockets-in-python/

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

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

我一般建议不要使用UDP(你必须自己处理数据包丢失,甚至可能是L2碎片等),但是ZeroMQ接收器之一(PUSH套接字在这里是个好主意)和你最喜欢的 Python ZeroMQ 库(pyzmq)作为另一端(PULL 套接字);你得到 low-overhead 通过 TCP(如果你需要通过网络)、IPC(如果你的 GNU Radio 流程图和接收程序可以使用 Unix inter-process 通信)或一对“专家”的数据传递接口运输。