问题描述
因此,一方面,我有一个来自 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 进程间通信)或几个“专家”传输接口获得低开销数据传递接口。>