车载通信与DDS标准解读系列(4):DDSI-RTPS协议

▎什么是RTPS

在DDS协议中,主要描述了实现数据分发服务的DCPS模型和QoS策略,但是我们还不清楚数据怎样在网络中传输,想要了解这些内容,就需要请出咱们的数据搬运工——RTPS。

RTPS全称是Real-Time Publish-Subscribe Protocol,实时发布订阅协议,定义了DDS基于有线传输的通信行为、报文格式等内容。

RTPS的主要特点包括:

  • 支持QoS,可实现实时应用程序之间Best-Effort和Reliable两类通信
  • 容错性,允许创建没有单点故障的网络,不依赖集中式服务器
  • 可扩展性,允许复杂设备通过新的服务进行扩展,而不破坏向后兼容性和互操作性
  • 即插即用,应用程序之间通过自动发现机制,可随时加入或离开网络,而不需要重新配置
  • 模块化,允许简单设备实现协议的部分功能,仍可以参与网络通信

RTPS对底层传输要求:

  • 应存在广义概念上的单播地址(16Byte以内)
  • 具有端口广义概念(4B),可以是UDP端口,也可以是共享内存段等等
  • 可以将数据包(具有序列号)发送特定地址/端口
  • 可以在一个特定的地址/端口上接收一个数据包
  • 消息在传输过程中不完整或者损坏,RTPS将删除消息,即RTPS假设消息完整且未损坏

▎RTPS的内容

RTPS定义了四部分内容,分别为:

  • Structure Module:定义了RTPS entity和DDS entity之间的映射关系,以及用于数据交互的通信端点
  • Message Module:定义了通信端点之间交互的报文格式
  • Behavior Module:定义了通信端点之间的交互行为
  • Discovery Module:定义了RTPS entity之间如何自动发现和配置

Structure Module

Structure Module 描述了作为通信参与者的RTPS实体的结构,如下图所示,RTPS实体是被应用程序可见的DDS实体相互通信而使用的协议级端点。

在这里插入图片描述
Entity:所有RTPS实体的基类, 每一个RTPS实体对象都具有一个全局唯一标识符(GUID),GUID可以在RTPS消息中进行体现

Endpoint:RTPS实体对象的通信端点,可以是RTPS消息的源或目标的对象

Participant:在一个独立地址空间中的所有RTPS实体的容器,共享公共属性

Writer:RTPS的Endpoint,表示传递数据更改消息的发送端

Reader:RTPS的Endpoint,表示传递数据更改消息的接收端

HistoryCache:用于临时存储和管理对数据对象的更改集的容器类

CacheChange:对数据对象所做的更改。包括对数据对象的创建、修改和删除

Data:可能与对数据对象所做的更改相关联的数据

Messages Module

Messages模块描述了在RTPS Writer端点和RTPS Reader端点之间交换的消息的总体结构和逻辑内容,其结构如下所示。

在这里插入图片描述
RTPS消息的整体结构由固定大小的RTPS头部(Header)和可变数量的RTPS子消息部分组成。子消息的种类包括HeaderExtension、Data、DataFrag、Heartbeat、HeartbeatFrag、AckNack、NackFrag、Gap、InfoDestination、InfoSource、InfoReply、InfoTimestamp、Pad,每个子消息的报文格式依次由一个SubmessageHeader和一个可变数量的SubmessageElement组成。每个部分的作用如下:

Header:该报头用于标识RTPS报文,携带RTPS协议版本、供应商和GUID前缀等信息,其报文格式如下:

在这里插入图片描述
HeaderExtension:可以添加在Header字段之后。它扩展了报头中提供的信息,同时还能保持和以往RTPS协议版本的兼容。

Data:由RTPS Writer发给RTPS Reader,告知对端有数据更新,其报文格式如下:

在这里插入图片描述
DataFrag:由RTPS Writer发给RTPS Reader,告知对端有数据更新,且需在RTPS Reader端对分片数据进行重组。

Heartbeat:由RTPS Writer发给RTPS Reader,告知当前的可用数据,其报文格式如下:

在这里插入图片描述
HeartbeatFrag:由RTPS Writer发给RTPS Reader,告知对端当前可用的数据分段。

AckNack:由RTPS Reader发给RTPS Writer,告知已接收/未接收的数据,其报文格式如下:

在这里插入图片描述
NackFrag:由RTPS Reader发给一个或多个RTPS Writer,告知对端当前仍未收到的数据分段

Gap:由RTPS Writer发给RTPS Reader ,告知未发送的过滤掉的数据

InfoDestination:由RTPS Writer发给RTPS Reader,告知后续报文的GuidPrefix需依据该子消息更新

InfoSource:由RTPS Writer发给RTPS Reader,告知Reader协议Version,VendorID有更新

InfoReply:由RTPS Reader发给RTPS Writer,告知回复子消息的目标地址需依据该子消息更新

InfoTimestamp:告知同一RTPS报文的后续Submessage的时间戳

Pad:用于在需要内存对齐时进行padding

Behavior Module

该模块描述了RTPS实体的动态行为。它描述了RTPS Writer端点和RTPS Reader端点之间报文交换的有效序列和时间约束。

根据本地端点是否维持远端匹配端点的数据收发状态,RTPS规范定义了两种参考实现:

  1. 无状态参考实现(Stateless Reference Implementation):无状态参考实现不保留远程实体的状态,因此可以很好地扩展到大型系统。无状态参考实现非常适合通过多播进行Best-Effort通信;
  2. 有状态参考实现(Stateful Reference Implementation):有状态参考实现维护远程实体的完整状态。这种方法可以尽可能地减少带宽使用,但需要更多内存。与无状态参考实现相比,它可以保证Reliable通信,并且能够在Writer端应用基于QoS或基于内容的过滤。

RTPS Writer参考实现基于RTPS Writer类的特定实例化,分为Stateless Writer和Stateful Writer。

Stateless Writer不知道匹配的Reader的数量,也不为每个匹配的RTPS Reader端点维护任何状态,只维护RTPS ReaderLocator列表,该列表应用于向匹配的读取器发送信息。

Stateful Writer配置了所有匹配的RTPS Reader端点的信息,并维护每个匹配的RTPS Reader端点的状态,以确定是否所有匹配的RTPS Reader端点都收到了特定的数据。对于Best-Effort通信,Writer在收到上层APP下发的数据后即可发出;对于Reliable通信,Writer还需依据接收到的ACKNACK子消息判断是否重发数据。

RTPS Reader参考实现基于RTPS Reader类的特定实例化,分为Stateless Reader和Stateful Reader。

Stateless Reader不知道匹配的Writer的数量,也不为每个匹配的RTPS Writer维护任何状态。

Stateful Reader保存每个匹配的RTPS Writer的状态。对于Best-Effort通信,Reader收到数据后放入本地缓存即可;对于Reliable通信,Reader需依据已接收/未接收的数据状态选择性发送ACKNACK子消息进行确认/重发请求。

StatefulWriter + StatefulReader + Reliable的RTPS交互示例如下图所示,StatefulWriter需要创建ReaderProxy,记录匹配的StatefulReader的端点信息,当上层有更新的数据时,把更新的数据发给StatefulReader,StatefulReader需要创建WriterProxy,依据Data/Heartbeat子消息在WriterProxy中记录数据的接收状态,然后回复AckNack子消息,StatefulWriter根据接收到的AckNack子消息,在ReaderProxy中更新数据的接收状态,若StatefulReader存在未接收的数据,则重发该数据。

在这里插入图片描述

Discovery Module

RTPS Behavior模块假设RTPS端点已正确配置,并与匹配的远程端点完成匹配。但是没有对这个配置是如何发生的做任何假设,只是定义了如何在这些端点之间交换数据。因此Discovery模块定义了RTPS的发现协议,目的是允许每个RTPS参与者发现其他相关参与者及其端点。一旦发现了远程端点,就可以相应地配置本地端点以建立通信。用户可以通过DDS内置主题访问此发现信息。

RTPS规范将发现协议拆分为两个独立的协议:

  1. 参与者发现协议(PDP)
  2. 端点发现协议(EDP)

参与者发现协议(PDP)指定参与者(Participant)如何在网络中发现彼此。一旦两个参与者(Participant)发现了对方,他们就会使用端点发现协议(EDP)交换关于所包含的端点(Endpoint的)信息。除了这种先发现Participant、再发现Endpoint的先后关系之外,这两种方案都可以被认为是独立的。

实现RTPS可以选择支持多个PDP和EDP,为了实现互操作性,所有RTPS实现必须至少提供以下发现协议:

  1. 简单参与者发现协议(SPDP):用于RTPS Participant相互发现;
  2. 简单端点发现协议(SEDP):用于RTPS Writer/Reader相互发现。两者都是基本的发现协议。

▎结语

通过对RTPS协议的解析,我们了解到RTPS作为DDS的互操作性有线协议,定义了底层的交互方式及报文格式。协议主要分为四个部分:(1)Structure Module(描述了RTPS类与属性以及与DDS关联);(2) Message Module(描述了RTPS报文结构和子消息类型)(3) Behavior Module(描述了RTPS stateless和stateful状态的 writer和reader分别实现Reliable和Best-Effort通信的行为)(4) Discovery Module(分别定义了SPDP和SEDP两个简单发现协议)。更多有关DDS子协议的内容,会在后续文章中为大家进行介绍,敬请期待。

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

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

相关文章

JavaScript高级 —— 学习(一)

目录 一、作用域 (一)局部作用域 1.函数作用域 2.块作用域 (二)全局作用域 二、垃圾回收机制 GC (一)生命周期 1.内存分配 2.内存使用 3.内存回收 4.特殊情况——内存泄漏: 注意&…

了解与生成火焰图

目录 一、如何看懂火焰图 1、基本特征 2、基本分类 二、如何生成火焰图 1、捕获调用栈 2、折叠栈 3、转换为 svg 格式 4、展示 svg 一、如何看懂火焰图 1、基本特征 (1)纵轴:即每一列代表一个调用栈,每一个格子代表一个函…

【跨境商家福音】一款性价比高、好用的跨境选品工具

亚马逊、速卖通、Shopee 、Lazada、美客多、eBay、SHEIN、Temu、Tiktok、shopify等跨境电商平台,其用户消费喜好多样,涵盖服装、美妆、电子产品等多个品类。而店雷达作为一款基于大数据和人工智能技术的电商分析工具,为商家提供了强大的选品和…

2024年github之node排行榜top50

如果有帮助到您还请动动手帮忙点赞,关注,评论转发,感谢啦!💕💕💕😘😘😘 本文由Butterfly一键发布工具发布 2024年github之node排行榜top50 语言star项目名称…

宁盾身份域管与Coremail邮件系统完成兼容互认证,持续深化信创布局

在信创国产化改造的背景下,企业邮箱的替换是许多党政、央国企、金融、制造企业面临的重要任务。为了满足企业对国产邮箱、OA等其他应用、终端实现统一身份认证,宁盾国产化身份域管与 Coremail XT 安全增强电子邮件系统 V5.0、V6.0 完成了产品兼容互认证&…

破解密码:掌握2024年的营销归因

Cracking the Code: Mastering Marketing Attribution in 2024 营销归因是识别哪些营销渠道和触及点有助于销售或转化的过程。随着消费者继续通过多个渠道与品牌互动,掌握营销归因对企业来说变得越来越重要。在这篇文章中,我们将探讨破解代码和有效衡量…

【MySQL】数据类型2

一、字符类型 char 和 varchar char(N),N:容量多大,相当于C语言中char [N]的数组开多大。 varchar(N),N:最大限制,相当于C的string一样,它会根据我们的字符多…

游戏运营分析:如何在新游戏上线初期实现精细化运营?

一、背景介绍 在当今的手游市场中,每一款新游戏的发布都如同踏上一段充满未知与挑战的探险之旅。游戏刚上线时,运营情况往往如同飘摇的小船,随时可能受到风浪的侵袭。此时,如何准确地找到问题所在,为游戏的健康运营和持…

【Python项目】AI动物识别工具

目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域,拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中,鉴于地球的广阔地域和多样的气候条件,利用图像技术捕…

【Qt 学习笔记】输入框实现helloworld | QLineEdit的使用

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 输入框实现helloworld | QLineEdit的使用 文章编号:Qt 学习…

pytest接口自动化框架实际应用

一、自动化实现的目标 1、测试用例数据驱动。 2、测试数据和用例分离。 3、每个测试用例拥有专属的测试数据有明确的测试初始状 4、测试用例的执行不依赖其他测试用例执行所产生的数据 5、建立体系化测试数据,进行数据依赖管理,覆盖全部测试分层策略要求…

PCB的电气/物理特性检查项目需思考的问题

在PCB设计、制造和装配过程中,为确保产品性能和质量,电子工程师必须进行电气特性和物理特性检查,然而对很多新人来说如何高效进行检查是个难题,所以下面将分别探讨这些检查时需要考虑的问题。 1、PCB电气特性检查项目①导线参数分…

CLIP 图文检索,相似度计算

CLIP 是OpenAI提出的神经网络,它可以从自然语言监督中有效地学习视觉概念。 CLIP 可以应用于任何视觉分类基准,只需提供要识别的视觉类别的名称,类似于 GPT-2 和 GPT-3 的“零样本”功能。 相关paper 用法可以参考github 这里举几个使用CLI…

CTK插件框架学习-信号槽(05)

CTK插件框架学习-事件监听(04)https://mp.csdn.net/mp_blog/creation/editor/137171155 一、主要流程 信号发送者告诉服务要发送的信号信号发送者发送信号信号接收者告诉服务当触发某个订阅的主题时通知槽函数信号接收者处理槽函数信号槽参数类型必须为(const ctk…

如何使用Kimi API开发应用

如何使用Kimi API开发应用 使用Kimi时,需要安装一个OpenAI的客户端,注意不是langchain-openai,是openai。需要申请一个Kimi的A PI-KEY。 示例代码如下: from openai import OpenAIclient OpenAI(api_key"my-api-key&quo…

拓扑排序(习题笔记 思路整理)之一

​​​​​​1.P4017 最大食物链计数 确实比较板子,但是考验思维,我愿称之为思维拓扑排序 作为拓扑的第一题,确实没想到要进行思维处理 这里考虑用一种dp的思维方式(? 多引入两个变量,一个记录出度&…

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕:小米Pad6 分辨率:1800X2880 模式:Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

linux进程退出之exit与_exit

linux进程退出之exit与_exit _exitexit流程清理函数atexit()函数:on_exit()函数: _exit /* Terminate program execution with the low-order 8 bits of STATUS. */ /** status参数定义了进程的终止状态,父进程可以通过wait(&am…

腾讯云邮件推送功能有哪些?如何有效使用?

腾讯云邮件推送如何设置?怎么用邮件推送做高效营销? 腾讯云作为业界领先的云服务提供商,其邮件推送功能在便捷性、稳定性和安全性上都有着出色的表现。那么,腾讯云邮件推送功能究竟有哪些呢?让AokSend来探个究竟。 腾…

银川岗位外包选邦芒人力 一站式解决企业全方位用工需求

岗位外包是一种现代的人力资源管理模式,其核心在于企业将特定的岗位或岗位群的工作内容外包给专业的服务机构,如邦芒人力,来负责完成。企业因此能够专注于自身核心业务的发展,提升行业竞争力。 具体而言,岗位外包使得…