吉林省住房和城乡建设厅网站申报/推广普通话宣传语手抄报

吉林省住房和城乡建设厅网站申报,推广普通话宣传语手抄报,枣庄机关建设网站,wordpress什么编辑器好用吗【GNU Radio】ZMQ模块学习 ZMQ 介绍前置知识Socket通信模型PUB/SUB(发布/订阅)模型PUSH/PULL(推/拉)模型REQ/REP(请求/响应)模型 ZMQ 详解基于通信模型分析基于数据格式分析Data BlocksMessage Blocks ZMQ …

【GNU Radio】ZMQ模块学习

  • ZMQ 介绍
  • 前置知识
    • Socket
    • 通信模型
      • PUB/SUB(发布/订阅)模型
      • PUSH/PULL(推/拉)模型
      • REQ/REP(请求/响应)模型
  • ZMQ 详解
    • 基于通信模型分析
    • 基于数据格式分析
      • Data Blocks
      • Message Blocks
    • ZMQ 模块作用

ZMQ 介绍

ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It’s fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems.
——《ZeroMQ 官网》

ZeroMQ(也称为 ØMQ、0MQ 或 zmq)看起来像一个可嵌入的网络库,但其作用类似于并发框架。它为您提供了跨各种传输(如进程内、进程间、TCP 和多播)携带原子消息的套接字。您可以使用扇出、发布—订阅、任务分发、请求/响应等通信模式,N 对 N 地连接 socket。它的速度足以成为集群产品的结构。它的异步 I/O 模型可让你以异步消息处理任务的形式构建可扩展的多核应用程序。它拥有大量语言 API,可在大多数操作系统上运行。

ZeroMQ 提供了类似于 Socket 的一系列接口,它跟 Socket 的区别是:普通的 Socket 是端到端的(1对1的关系),而 ZMQ 却是可以 N 对 N 的关系。

前置知识

Socket

Socket(套接字)是计算机网络中的一种抽象概念,用于在不同设备或同一设备的不同进程之间进行通信。它提供了一种在应用程序和网络协议之间进行数据传输的接口。Socket 本身并不是协议,而是基于协议实现的一种通信机制。

套接字的概念起源于 Unix 系统,它允许程序之间进行双向通信,就像一个管道一样,数据可以从一端流入,从另一端流出。通过套接字,程序可以发送和接收数据,就像在电话线上进行通话一样。

套接字有多种,常见的有 BSD 套接字、Winsock 套接字等,按照套接字的功能和特性,可以将套接字分为以下几种:

  • 流式套接字(SOCK_STREAM)
    这种套接字类型使用 TCP 协议,是一种面向连接的套接字。它提供可靠的、双向的、有序的数据传输服务。数据在传输过程中不会丢失、重复或无序。流式套接字适用于需要稳定可靠数据传输的场景,如文件传输、网页浏览等。
  • 数据报套接字(SOCK_DGRAM)
    数据报套接字使用 UDP 协议,是一种无连接的套接字。它提供不可靠、无序的数据传输服务,数据在传输过程中可能会丢失、重复或无序。但它的传输速度较快,适用于对速度要求较高、对数据丢失不太敏感的场景,如视频直播、在线游戏等。
  • 原始套接字(SOCK_RAW)
    原始套接字允许应用程序直接访问较低级别的网络协议,如 IP 协议。它通常用于开发网络协议或工具等,具有较高的灵活性和复杂度,但使用门槛也较高。

套接字的用途较多,主要有以下几个原因:

  • 跨平台支持
    套接字是一种跨平台的通信机制,几乎所有的操作系统都支持套接字编程,这使得基于套接字开发的应用程序可以在不同的平台上运行。

  • 灵活性和通用性
    套接字支持多种网络协议(如 TCP、UDP 等),可以根据不同的应用场景选择合适的协议。TCP 提供可靠的、面向连接的通信,适用于需要保证数据完整性和顺序的场景;UDP 则是无连接的、轻量级的通信方式,适用于对实时性要求较高的场景。

  • 丰富的应用场景
    套接字可以用于实现各种网络应用,如 Web 服务器、邮件服务器、即时通讯工具、在线游戏等。在这些应用中,套接字提供了数据传输的基础。

  • 高效的通信方式
    通过套接字,程序可以直接在底层网络协议上进行通信,从而减少中间层的开销,提高通信效率。

通信模型

PUB/SUB(发布/订阅)模型

PUB/SUB是一种异步通信模型,由发布者(Publisher)和订阅者(Subscriber)组成。

Publisher 将消息发送到特定主题(Topic),Subscriber 订阅感兴趣的主题以接收消息(即在此模型下,订阅者可以对发布者的消息进行过滤)。它们之间通过消息代理(Broker)进行消息传递,实现解耦。

这种模型适合一对多广播场景,例如实时事件分发、数据流处理等。

PUSH/PULL(推/拉)模型

PUSH/PULL也是一种异步通信模型,由发送者(PUSH)和接收者(PULL)组成。

PUSH 套接字将消息以负载均衡的方式发送给多个 PULL 套接字,每个消息只发送给一个 PULL 套接字。

适用于任务分发和负载均衡场景,如将任务分配给多个工作节点。

REQ/REP(请求/响应)模型

REQ/REP 是一种同步通信模型,由客户端(REQ)和服务器(REP)组成。客户端发送请求后等待服务器响应,服务器接收请求并返回响应。

适用于需要可靠传输和交互的应用,如远程过程调用(RPC)。

ZMQ 详解

基于通信模型分析

根据博文《[SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解 》,GNU Radio 中的 ZMQ 块按照通信模型分为以下三种:

SINkSOURCE特征
PUBSUB广播,可一对多
PUSHPULL点播,点对点对等网络
REQREP点对点链路,一个请求一个回复,类似客户端服务器

其中,SOURCE 通常作为客户端,负责从 ZMQ 网络中获取数据并将其传递给 GNU Radio 的处理块。SINK 通常作为服务器,负责接收来自 GNU Radio 处理块的数据并通过 ZMQ 网络发送出去。

这种角色分配的原因在于数据流向和通信的发起方式:

  • 数据流向
    在 GNU Radio 的流图中,数据通常从 SOURCE 流向 SINK。SOURCE 从外部获取数据(如从网络、文件或硬件),而 SINK 将处理后的数据发送到外部。
  • 通信的发起
    在 ZMQ 中,SOURCE作为客户端主动连接到SINK(服务器),以确保数据可以正确地从 SOURCE 流向 SINK。这种设计使得通信的发起方(客户端)可以灵活地连接到服务器,而服务器只需要监听端口等待连接。

将 SINK 作为服务器的核心原因可以归结为:

  • 被动接收数据
    SINK 通常等待 SOURCE 发送数据,而不是主动请求数据。这符合服务器的特性,即被动等待客户端的连接和数据发送。

  • 简化网络配置
    将 SINK 设置为服务器可以简化网络配置。服务器只需要绑定到一个端口并等待连接,而客户端(SOURCE)则需要知道服务器的地址和端口才能建立连接。这种设计使得 SINK 可以更方便地接收来自不同 SOURCE 的数据。

  • 符合 ZMQ 的通信模式
    在 ZMQ 的 PUB/SUB 或 PUSH/PULL 模式中,数据的发送方(如 PUB 或 PUSH)通常需要先启动并绑定到一个端口,而接收方(SUB 或 PULL)则连接到该端口。在 GNU Radio 中,SINK 作为数据的发送方,自然承担服务器的角色。

基于数据格式分析

在 GNU Radio 中,ZMQ块按照块中的数据格式分为 Data BlocksMessage Blocks,区别如下:

Data Blocks

定义用于传输原始流数据,没有格式化
数据处理方式数据类型采样率由发送端的流程图决定,接收端需要知道这些参数才能正确解读数据
适用场景需要实时数据流处理、高效传输大量连续数据等场景

Message Blocks

定义使用PMT(Polymorphic Types)对数据进行编码和解码
数据处理方式数据是离散的消息单元,可以包含多个部分,每个部分都有明确的长度定义。消息是不透明的二进制数据,应用层需要自行进行序列化和反序列化
适用场景需要传递结构化数据或进行复杂消息处理的场景,如远程过程调用(RPC)等

总结来说,Data Blocks适合传输连续的原始数据流,而Message Blocks则适合传输结构化的消息数据,两者的应用场景和数据处理方式各有侧重。

ZMQ 模块作用

对应于上述通信模型与数据格式,ZMQ 在 GNU Radio 中被分成 6 个 Source Block 和 6 个 Sink Block,每个 Source Block 都有相对应的 Sink Block。Source Block 用来传输进入 GNU Radio 的数据,而 Sink Block 则用来将数据传输出去

以下为对应的12个 ZMQ 模块:

  • ZMQ PUB Message Sink & ZMQ SUB Message Source

    • ZMQ PUB Message Sink
      作为发布者,从 GNU Radio 的流程图中接收消息,并通过 ZMQ 的 PUB 套接字发布出去。PUB 套接字可以有多个订阅者,这些订阅者可以是其他 GNU Radio 的 ZMQ SUB Message Source 块,也可以是非 GNU Radio 的 ZMQ 套接字。

      数据流向:GNU Radio 的流程图中 → P U B S o c k e t \xrightarrow{PUB~Socket} PUB Socket GNU Radio 的外面

    • ZMQ SUB Message Source
      作为订阅者,从 ZMQ 的 SUB 套接字接收消息,并将这些消息提供给 GNU Radio 的流程图进行处理。它会订阅由 PUB 套接字发布的内容。

      数据流向:GNU Radio 的流程图中 ← S U B S o c k e t \xleftarrow{SUB~Socket} SUB Socket GNU Radio 的外面

  • ZMQ PUB Sink & ZMQ SUB Source

    • ZMQ PUB Sink
      与 ZMQ PUB Message Sink 类似,但传输的是原始流数据而不是消息。该组件通过将数据发送到 ZMQ 的 PUB 套接字,供多个订阅者接收。

      数据流向:GNU Radio 的流程图中 → P U B S o c k e t \xrightarrow{PUB~Socket} PUB Socket GNU Radio 的外面

    • ZMQ SUB Source
      作为订阅者,从 ZMQ 的 SUB 套接字接收原始流数据,并将其作为数据源提供给 GNU Radio 的流程图。

      数据流向:GNU Radio 的流程图中 ← S U B S o c k e t \xleftarrow{SUB~Socket} SUB Socket GNU Radio 的外面

  • ZMQ REQ Message Sink & ZMQ REP Message Source

    • ZMQ REQ Message Sink
      作为客户端,该组件向 ZMQ 的 REQ 套接字发送请求消息并等待来自 REP 套接字的回复,将从 GNU Radio 的流程图中接收到的消息传输出去。

      数据流向:GNU Radio 的流程图中 → R E Q S o c k e t \xrightarrow{REQ~Socket} REQ Socket GNU Radio 的外面

    • ZMQ REP Message Source
      作为服务器端,该组件从 ZMQ 的 REP 套接字接收请求消息,并在处理后发送回复消息。该组件会一直等待请求的到来。

      数据流向:GNU Radio 的流程图中 ← R E P S o c k e t \xleftarrow{REP~Socket} REP Socket GNU Radio 的外面

  • ZMQ REQ Sink & ZMQ REP Source

    • ZMQ REQ Sink
      与 ZMQ REQ Message Sink 类似,但该组件处理的是原始流数据。该组件通过 REQ 套接字发送数据请求,并接收来自 REP 套接字的回复数据。

      数据流向:GNU Radio 的流程图中 → R E Q S o c k e t \xrightarrow{REQ~Socket} REQ Socket GNU Radio 的外面

    • ZMQ REP Source
      作为服务器端,该组件从 REP 套接字接收数据请求,并发送回复数据。该组件用于点对点链路,一个请求对应一个回复。

      数据流向:GNU Radio 的流程图中 ← R E P S o c k e t \xleftarrow{REP~Socket} REP Socket GNU Radio 的外面

  • ZMQ PUSH Message Sink & ZMQ PULL Message Source

    • ZMQ PUSH Message Sink
      该组件将消息推送到 ZMQ 的 PUSH 套接字,通常用于将消息发送到一个或多个 PULL 套接字,适用于点对点的对等网络。

      数据流向:GNU Radio 的流程图中 → P U S H S o c k e t \xrightarrow{PUSH~Socket} PUSH Socket GNU Radio 的外面

    • ZMQ PULL Message Source
      作为接收端,该组件从 ZMQ 的 PULL 套接字接收消息,并将这些消息提供给 GNU Radio 的流程图进行处理。

      数据流向:GNU Radio 的流程图中 ← P U L L S o c k e t \xleftarrow{PULL~Socket} PULL Socket GNU Radio 的外面

  • ZMQ PUSH Sink & ZMQ PULL Source

    • ZMQ PUSH Sink
      与 ZMQ PUSH Message Sink 类似,但传输的是原始流数据。该组件将数据推送到 PUSH 套接字,供 PULL 套接字接收。

      数据流向:GNU Radio 的流程图中 → P U S H S o c k e t \xrightarrow{PUSH~Socket} PUSH Socket GNU Radio 的外面

    • ZMQ PULL Source
      作为接收端,从 PULL 套接字接收原始流数据,并作为数据源提供给 GNU Radio 的流程图。

      数据流向:GNU Radio 的流程图中 ← P U L L S o c k e t \xleftarrow{PULL~Socket} PULL Socket GNU Radio 的外面

关于 ZMQ 模块的具体使用可以参照《[SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解 》、《ZeroMQ-Python》和《ZeroMQ-GNURadio》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】深度学习模型训练的 GPU 内存优化之旅:综述篇

开设此专题,目的一是梳理文献,目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化,所以最初思考的专题名称是“显存突围:深度学习模型训练的 GPU 内存优化之旅”,英文缩写是 “MLSys_GPU_Memory_Opt”。…

Vue 3 Diff 算法深度解析:与 Vue 2 双端比对对比

文章目录 1. 核心算法概述1.1 Vue 2 双端比对算法1.2 Vue 3 快速 Diff 算法 2. 算法复杂度分析2.1 时间复杂度对比2.2 空间复杂度对比 3. 核心实现解析3.1 Vue 2 双端比对代码3.2 Vue 3 快速 Diff 代码 4. 性能优化分析4.1 性能测试数据4.2 内存使用对比 5. 使用场景分析5.1 Vu…

神经网络的基本知识

感知机 输入:来自其他 n 个神经元传递过来的输入信号 处理:输入信号通过带权重的连接进行传递, 神经元接受到总输入值将与神经元的阈值进行比较 输出:通过激活函数的处理以得到输出 感知机由两层神经元组成, 输入层接受外界输入信号传递给…

C++相关基础概念之入门讲解(上)

1. 命名空间 C中的命名空间(namespace)是用来避免命名冲突问题的一种机制。通过将类、函数、变量等封装在命名空间中,可以避免不同部分的代码中出现相同名称的冲突。在C中,可以使用namespace关键字来定义命名空间。 然后我们在调…

网络协议栈

网络协议栈的位置 用户在应用层的各种请求最终会下达给操作系统,操作系统内除了进程管理、文件管理、内存管理、驱动管理之外,还有一个内嵌的软件协议栈,协议栈将用户的数据进行各种封包后,通过网卡将数据传递到网络当中&#xf…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器,这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

mysql、oracle、SQLserver之间的区别和优势

MySQL、Oracle和SQL Server都是常见的关系型数据库管理系统(RDBMS),它们在某些方面有一些区别和优势。 MySQL: MySQL是一种开源的RDBMS,由Oracle公司开发和维护。它具有快速、稳定和易于使用的特点。MySQL适用于中小型…

75.HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二)

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二) 一、手势系统架构 .gesture(GestureGroup(GestureMode.Exclusiv…

Qt 控件概述 QWdiget

Qt为我们提供了很多控件,这些控件拿过来就可以使用 目录 QWidget 属性 WindowFrame的影响 QWidget Qt中所有的组件都是继承自QWidget Qt Creator中的右侧可以看到QWidget的各种属性 其中各种属性都可以在Qt文档中找到说明 ​ 属性 enabled:描述该组…

适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读:适合企业内训的 AI 工具实操培训教程 在当今数字化时代,人工智能(AI)技术迅速发展,深度融入到各个领域,AIGC(人工智能生成内容)更是成…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息,您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南,帮助您完成这一过程: 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户(如果您还没有的话)。在Twi…

【最后203篇系列】015 几种消息队列的思考

背景 队列还是非常重要的中间件,可以帮助我们:提高处理效率、完成更复杂的处理流程 最初,我觉得只要掌握一种消息队列就够了,现在想想挺好笑的。 过去的探索 因为我用python,而rabbitmq比较贴合快速和复杂的数据处…

TensorFlow 与 TensorFlow Lite:核心解析与层应用

1. 引言 TensorFlow 是 Google 开发的开源机器学习框架,支持从数据预处理、模型训练到推理部署的完整生命周期。然而,在嵌入式和移动设备上,原生 TensorFlow 过于庞大,因此 Google 推出了轻量级版本——TensorFlow Lite&#xff…

DeepSeek大模型在政务服务领域的应用

DeepSeek大模型作为国产人工智能技术的代表,近年来在政务服务领域的应用呈现多点开花的态势。通过多地实践,该技术不仅显著提升了政务服务的效率与智能化水平,还推动了政府治理模式的创新。以下从技术应用场景、典型案例及发展趋势三个维度进…

电子电气架构 --- 分布到集中的动カ系统及基于域控制器的架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

深入理解C/C++堆数据结构:从原理到实战

一、堆的本质与特性 1.1 什么是堆数据结构? 堆(Heap)是一种特殊的完全二叉树,它满足以下核心性质: 堆序性:每个节点的值都满足特定顺序关系 结构性:完全二叉树的结构特性(除最后一…

Python学习第十七天

Django框架-SQLite3 介绍 Django内置了对 SQLite3 数据库的支持。SQLite3 是一个轻量级的嵌入式数据库引擎,非常适合开发、测试和小型项目。以下是关于 Django 中 SQLite3 的介绍和应用指南。(除了这些还支持mysql、oracle以及其他查询文档,…

Docker 》》Docker Compose 》》network 网络 compose

docker 默认的网络 三种模式 # 列出所有当前主机上或Swarm集群上的网络 docker network ls#查看网络详情 docker network inspect network名称# 清除未使用的docker网络 docker network prune -f# 创建网络 ocker network create -d bridge 网络名称 docker network create –s…

Python数字信号处理之最佳等波纹滤波器阶数估计原理

Matlab中的阶数估计函数 在MATLAB中,使用firpmord函数可以估算等波纹FIR滤波器的最小阶数。该方法基于Parks-McClellan算法,通过通带和阻带的频率边界、幅度响应及允许的最大误差来自动计算参数。 rp 3; % Passband ripple in dB rs 40; …

JumpServer基础功能介绍演示

堡垒机可以让运维人员通过统一的平台对设备进行维护,集中的进行权限的管理,同时也会对每个操作进行记录,方便后期的溯源和审查,JumpServer是由飞致云推出的开源堡垒机,通过简单的安装配置即可投入使用,本文…