GNU Radio ZMQ 阻止 REP - REQ

GNU Radio ZMQ Blocks REP - REQ

我正在尝试使用 GR ZMQ REP / REQ 块将 GNU Radio 连接到 python 脚本。 GR 在路由器地址 192.168.1.25 上的 Raspberry Pi 4 上是 运行。 python 脚本位于另一台计算机上,我可以从中成功 ping 192.168.1.25。我在单独的端口 55555 和 55556 上设置 REQ-REP 对。

流程图:

import pmt
import zmq

# create a REQ socket
req_address = 'tcp://192.168.1.25:55555'
req_context = zmq.Context()
req_sock = req_context.socket (zmq.REQ)
rc = req_sock.connect (req_address)

# create a REP socket
rep_address = 'tcp://192.168.1.25:55556'
rep_context = zmq.Context()
rep_sock = rep_context.socket (zmq.REP)
rc = rep_sock.connect (rep_address)

while True:
    data = req_sock.recv()
    print(data)

    rep_sock.send (b'1')

运行 此代码导致以下错误: ZMQError:无法在当前状态下完成操作

此行标记了错误: 数据 = req_sock.recv()

您能评论一下错误的原因吗?我知道有一个严格的 REQ-REP, REQ-REP.. 关系,但我找不到我的错误。

您当前的代码有两个问题:

  • 您调用 req_socket.recv(),但随后调用 rep_sock.send():这不是 REQ/REP 对的工作方式。您只需要创建 one 套接字(REQ 套接字);它连接到远程 REP 套接字。

  • 当您创建一个 REQ 套接字时,您需要在收到 REPly 之前发送一个 REQuest。

此外,即使您有多个套接字,您也应该只创建一个 ZMQ 上下文。

您的代码的功能版本可能如下所示:

import zmq

# create a REQ socket
ctx = zmq.Context()
req_sock = ctx.socket (zmq.REQ)

# connect to a remote REP sink
rep_address = 'tcp://192.168.1.25:55555'
rc = req_sock.connect(rep_address)

while True:
    req_sock.send (b'1')
    data = req_sock.recv()
    print(data)

我针对以下 GNU Radio 配置测试了以上代码:

options:
  parameters:
    author: ''
    catch_exceptions: 'True'
    category: '[GRC Hier Blocks]'
    cmake_opt: ''
    comment: ''
    copyright: ''
    description: ''
    gen_cmake: 'On'
    gen_linking: dynamic
    generate_options: qt_gui
    hier_block_src_path: '.:'
    id: example
    max_nouts: '0'
    output_language: python
    placement: (0,0)
    qt_qss_theme: ''
    realtime_scheduling: ''
    run: 'True'
    run_command: '{python} -u {filename}'
    run_options: prompt
    sizing_mode: fixed
    thread_safe_setters: ''
    title: Example
    window_size: (1000,1000)
  states:
    bus_sink: false
    bus_source: false
    bus_structure: null
    coordinate: [8, 8]
    rotation: 0
    state: enabled

blocks:
- name: samp_rate
  id: variable
  parameters:
    comment: ''
    value: '32000'
  states:
    bus_sink: false
    bus_source: false
    bus_structure: null
    coordinate: [184, 12]
    rotation: 0
    state: enabled
- name: analog_sig_source_x_0
  id: analog_sig_source_x
  parameters:
    affinity: ''
    alias: ''
    amp: '1'
    comment: ''
    freq: '1000'
    maxoutbuf: '0'
    minoutbuf: '0'
    offset: '0'
    phase: '0'
    samp_rate: samp_rate
    type: complex
    waveform: analog.GR_COS_WAVE
  states:
    bus_sink: false
    bus_source: false
    bus_structure: null
    coordinate: [184, 292.0]
    rotation: 0
    state: true
- name: blocks_throttle_0
  id: blocks_throttle
  parameters:
    affinity: ''
    alias: ''
    comment: ''
    ignoretag: 'True'
    maxoutbuf: '0'
    minoutbuf: '0'
    samples_per_second: samp_rate
    type: complex
    vlen: '1'
  states:
    bus_sink: false
    bus_source: false
    bus_structure: null
    coordinate: [344, 140.0]
    rotation: 0
    state: true
- name: zeromq_rep_sink_0
  id: zeromq_rep_sink
  parameters:
    address: tcp://0.0.0.0:55555
    affinity: ''
    alias: ''
    comment: ''
    hwm: '-1'
    pass_tags: 'False'
    timeout: '100'
    type: complex
    vlen: '1'
  states:
    bus_sink: false
    bus_source: false
    bus_structure: null
    coordinate: [504, 216.0]
    rotation: 0
    state: true

connections:
- [analog_sig_source_x_0, '0', blocks_throttle_0, '0']
- [blocks_throttle_0, '0', zeromq_rep_sink_0, '0']

metadata:
  file_format: 1