GNU Radio教程 8.消息传递( 三 )


5.1C++
5.
六、流程图示例
下面是一个使用流和消息的流程图的简单示例:

GNU Radio教程 8.消息传递

文章插图
有几件有趣的事情需要指出 。首先,有两个源块,它们都固定间隔地输出item,每 1000 毫秒一个和每 750 毫秒一个 。虚线表示连接的消息端口,而实线表示连接的流端口 。在流程图的上半部分,我们可以看到实际上可以在消息传递端口和流端口之间切换,但前提是 PMT 的类型与流端口的类型匹配(在本例中,流端口的粉红色表示字节,这意味着如果我们想要流式传输我们作为 PMT 发送的相同数据,则 PMT 应该是一个 ) 。
另一个有趣的事实是,我们可以将多个消息输出端口连接到单个消息输入端口,这对于流端口是不可能的 。这是由于消息的异步特性:接收块将在有机会时处理所有消息,而不必按任何特定顺序 。从多个块接收消息仅仅意味着可能有更多消息需要处理 。
消息发布到一个模块后会发生什么情况?这取决于实际的块实现,但有两种可能性:
1) 调用消息处理程序,立即处理消息 。
2) 消息被写入 FIFO 缓冲区,块可以随时使用它,通常是在工作函数中 。
对于同时具有消息端口和流端口的块,这两个选项中的任何一个都可以,具体取决于应用程序 。但是,我们强烈反对在工作函数内部处理消息,而是建议使用消息处理程序 。在工作函数中使用消息会鼓励我们在工作中阻塞等待消息到达 。这对于永远不应该阻塞的工作函数来说是不好的行为 。如果块依赖于消息来操作,则使用消息处理程序概念来接收消息,然后当调用工作函数时,该消息可用于通知块的操作 。只有在特别明确的情况下,我们才应该在一个块中使用上面的方法 2 。
使用消息传递接口,我们可以编写没有流端口的块,然后工作函数变得无用,因为它是设计用于处理流项目的函数 。事实上,没有流端口的块通常甚至没有工作功能 。
七、PDUs
在前面的流程图中,我们有一个称为PDU to的块 。GNU Radio 中的 PDU(协议数据单元)有一个特殊的 PMT 类型,它是字典里的一个键值对(在 CAR 上)和一个统一向量类型 。请参阅(PMTs)#Pairs 。因此,这将产生一个有效的 PDU,没有元数据和 10 个零作为流数据:
然后字典中的键/值对被解释为流标签的键/值对 。
流程图示例:聊天应用程序
让我们构建一个使用消息传递的应用程序 。聊天程序是一个理想的用例,因为它等待用户输入消息,然后发送 。因此,不需要块 。
创建以下流程图并将其保存为“.grc”:
ZMQ 消息块的地址为“tcp://127.0.0.1:50261” 。一旦按下 Enter 键,将发送在QT GUI 消息编辑框中键入的文本 。输出在启动 - 的终端屏幕上 。
如果您想与其他用户(而不仅仅是您自己)交谈,您可以创建一个具有不同名称的附加流程图,例如“.grc” 。然后按如下方式更改 ZMQ 端口号:
【GNU Radio教程 8.消息传递】聊天应用程序2
ZMQ PUSH Sink:tcp://127.0.0.1:50261
ZMQ PULL 来源:tcp://127.0.0.1:50262
聊天应用程序3
ZMQ PUSH Sink:tcp://127.0.0.1:50262
ZMQ PULL 来源:tcp://127.0.0.1:50261
使用 GRC 时,执行和/或 Run 会创建一个与 .grc 文件同名的文件 。您可以执行文件而无需再次运行 GRC 。
为了测试这个系统,我们将使用两个进程,所以我们需要两个终端窗口 。
1:
由于您刚刚流程图,因此您可以执行run 。
2:
打开另一个终端窗口 。
更改为您用于生成.grc的任何目录 。