You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++代码通过ZMQ向GNU Radio Companion发送数据失败?

问题:GNU Radio无法接收ZMQ发送端数据

代码片段

发送端代码(zmq_send.cpp)

#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
using namespace std;

int main (void)
{
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_PUSH);
    zmq_connect (requester, "tcp://192.168.0.243:2000");

    unsigned short buffer[1];
    buffer[0] = 1;

    while(1)
    {
        cout << "Sending " << buffer[0] << endl;
        zmq_send (requester, buffer, 2*1, 0);
        buffer[0] = buffer[0] + 1;
        sleep(1);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

接收端测试代码(zmq_recv.cpp)

#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <iostream>
using namespace std;

int main (void)
{
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_PULL);
    int rc = zmq_bind (responder, "tcp://192.168.0.243:2000");
    assert (rc == 0);

    unsigned short buffer [1];

    while (1) {
        zmq_recv (responder, buffer, 2*1, 0);
        cout << buffer[0];
        cout << endl;
        sleep (1);
    }
    return 0;
}

问题现象

上述两段C++代码之间可正常完成ZMQ数据传输,但将zmq_send.cpp作为发送端向GNU Radio Companion(GRC)流图发送数据时,GRC中的Time Sink无数据显示,文件保存模块也未记录任何数据。

原因分析及解决方案

  • 套接字类型与连接逻辑不匹配:
    GRC的ZMQ源模块需配置为ZMQ_PULL类型,且需确保连接逻辑正确:发送端用zmq_connect,则GRC的ZMQ源需用zmq_bind绑定到同一地址端口(如tcp://192.168.0.243:2000),且必须先启动GRC流图,再运行发送端代码——ZMQ的PUSH/PULL模式要求接收端先完成绑定,否则初始发送的数据会丢失。

  • 数据类型不兼容:
    GNU Radio对输入数据类型有严格要求,需确保GRC中ZMQ源的Output Type设置为short(与发送端的unsigned short匹配)。若类型不匹配,GRC会解析出无效数据,表现为无输出。

  • 字节序(端序)问题:
    ZMQ传输的是原始字节流,若发送端与GRC的字节序不一致,会导致数据解析错误。可在发送端将数据转换为网络字节序后再发送,修改发送代码中的数据赋值部分:

    buffer[0] = htons(1); // 初始值转网络字节序
    // ...
    buffer[0] = htons(ntohs(buffer[0]) + 1); // 递增时先转回主机序,计算后再转网络序
    
  • GRC配置错误:
    检查ZMQ源模块的地址是否正确填写,确认无拼写错误;同时确保流图中ZMQ源后的处理模块(如Time Sink)已正确连接,且模块参数配置符合数据类型要求。

  • 网络或权限限制:
    检查防火墙是否允许端口2000的TCP通信,确保GNU Radio进程有绑定端口的权限,以及发送端与GRC运行环境的网络连通性。

内容的提问来源于stack exchange,提问作者Mobi Zaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:50:22