RTPS协议概述

news2025/1/20 3:56:28

一.RTPS协议概述

RTPS协议主要由四个部分组成:

1.发现模块(Discovery)

​ 发现模块是定义了RTPS的参与者(Participant)获取其他RTPS的参与者(Participant),端点(Endpoint)的协议,使得每个参与者(Participant)能够了解到整个网络中其他参与者的存在并且相互匹配。

metatraffic通信使得RTPS的参与者(Participant)可以获取到所有Participant,Reader以及Writer的快照并且让本地Reader和远端Writer以及本地Writer和远端Reader之间通信。

​ RTPS规范将发现模块拆为两个部分:

​ 1.1 参与者发现协议(PDP):指定了参与者如何在网络中发现彼此。

​ 1.2 端点发现协议(EDP):一旦发现彼此,则两个参与者就使用端点发现协议(EDP)交换起包含的端点的信息。

​ 所有RTPS的实现必须提供简单参与者发现协议(Simple PDP)和简单端点发现协议(Simple EDP)。

2.结构(Structor)

​ 结构定义了RTPS的各类实体(Entity)与域(Domain)的关系以及各类实体间的关联:

img

Entity:所有RTPS实体的父类,每个Entity对象拥有Guid,并且对其他Entity对象可见。Guid属性如下:

struct RTPS_DllAPI GUID_t    // 唯一标识一个Entity
{
    //!Guid prefix    每个Participant和其下的Endpoint都拥有相同的Guid Prefix
    GuidPrefix_t guidPrefix;
    //!Entity id    每个实体的EntityID不同
    EntityId_t entityId;
}

Endpoint:特殊的Entity,是RTPS消息的起点或者终点。Endpoint涉及的属性如下:

属性类型含义和DDS的关系
unicastLocatorListLocator_t[*]发送RTPS消息的目标Endpoint的单播地址的列表在Discovery过程中配置
multicastLocatorLi stLocator_t[*]发送RTPS消息的多播地址的列表(可以为空)在Discovery过程中配置
ReliabilityKindReliabilityKind_t可靠性等级(BestEffort / Reliable)Qos中指定的
topicKindTopicKind_t标识当前Endpoint上传输的数据是否有key,key数据的主要类型是InstanceHandle_t,对应了Guid
endpointGroupEntityId_t标记了Endpoint属于哪个RTPSGroup和DDS中的Subscriber/Publisher关联

​ Participant:是所有Endpoint的容器,共享属性。Participant涉及到的属性如下:

属性类型含义和DDS的关系
defaultUnicastLocatorListLocator_t[*]默认的单播地址列表(地址+端口)在Discovery过程中配置
defaultMulticastLocat orListLocator_t[*]默认的组播地址列表(地址+端口)在Discovery过程中配置
ProtocolVersionProtocolVersion_tRTPS协议版本号
VendorIdVendorId_tRTPS中间商代码需要向OMG组织申请

Writer:RTPS消息的起点,发送HistoryChange中的CacheChange消息到匹配的Reader的HistoryChange。

Reader:RTPS消息的终点,接受匹配的Writer发送的CacheChange数据。

RTPSGroup:主要有两种Group(Publisher和Subscriber)

3.消息(Message)

​ 消息模块定义了Reader和Writer之间交换的消息格式,主要有消息头(Header)和一系列子消息(SubMessage组成),每个子消息都由一系列子消息元素组成:

img

Header:

一个消息(Message)中可能包含多个子消息(SubMessage),这些子消息之间可能存在依赖关系/解释关系。

子消息分为实体子消息(Entity SubMessage)和解释子消息(Interpreter SubMessage)。

4.行为(Behavior)

​ 行为定义了Reader和Writer交换RTPS消息的顺序以及消息引起的相关实体(主要是Reader和Writer)状态的变化,RTPS中主要有行为模块的视线(有状态 Stateful 和 无状态 Stateless)。

​ RTPS Writer不控制什么时候从Writer的HistoryCache中删除CacheChange,删除CacheChange的动作是由DDS的Writer来完成的,这个和Qos配置有关,例如如果配置了KEEP_LAST,那么DataWriter只会保留最后一次发送的CacheChange数据,删除之前的Change数据。

​ 必须实现RTPS MessageReceiver接口(因为涉及到解析子消息时上下文的处理和状态机的切换)

​ StatefulWriter和StatefulReader交互数据的流程如下图:
在这里插入图片描述

4.1 通用要求(General Requirement)

​ Writer:

​ RTPSWriter发送HistoryCache中的CacheChange数据时,必须按照SequenceNumber的顺序进行发送。

​ 如果Reader要求inline Qos,则Writer发送数据的时候必须带上Qos数据(in-line Qos)。

​ 对于StatefulWriter,必须定周期发送HeartBeat子消息(如果HistoryCache中还有数据)。如果HistoryCache中没有数据了,那么StatefulWriter就不需要发送HeartBeat子消息了。StatefulWriter必须持续发送HeartBeat消息给StatefulReader(如果Reader返回的时候NACK)直到Reader读取了所有数据。

​ Writer对于Reader的NACK消息进行响应处理(因为这代表Reader有miss的数据需要Writer进行重发)

​ Reader:

​ 因为Stateless的Reader是完全被动的,只接受数据,不发送响应数据。因此,对Reader的通用要求大部分都是针对StatefulReader的。

​ 如果reader收到的HeartBeat包没有设置final flag标志位,则Reader对于这包HeartBeat必须做出响应,回复ACK或者NACK SubMessage。

​ 如果reader有数据没有收到(收到HeartBeat比对seq以后),必须回复Nack包告知Writer有数据包丢失需要重传。这个回复可以延迟以避免网络数据风暴。

4.2 具体实现

Writer:

​ StatelessWriter和StatefulWriter的主要区别在于持有对端Reader的方式和信息有所不同,类结构的区别如下图:
在这里插入图片描述

RTPSWriter的主要属性有下面8种:

属性类型含义和DDS的关系
pushModebool当属性为true时,Writer主动将change数据推送给reader,反之,change数据随着心跳包一起发送,并且是作为对Reader请求的应答N/A
heartbeatPeriodDuration_t周期发送心跳包消息的间隔(心跳包包含可被reader读取的数据的lastchangenumber)N/A
nackResponseDelayDuration_t对于Reader发送的NACK消息,允许Writer进行回复的最大延时N/A
lastChangeSequenceNumberSequenceNumber用于分配给下一个Change数据的内部递增的序列号N/A
writer_cacheHistoryCache包含历史CacheChange的容器,每个Writer内部保存N/A
nackSuppressionDurationDuration_t针对已经发送的CacheChange,如果在nackSuppressionDuration时间内收到了Reader发送的NACK报文,则可以忽略。N/A
dataMaxSize可选属性N/A

RTPSWriter主要提供new构造函数以及new_change函数,new_change函数返回新构造的CacheChange对象。

函数名参数类型
newWriter
attribute_values创建Writer以及其父类Endpoint时需要的属性集合
New_changeCacheChange
kindChangeKind_t
dataData
inlineQosParameterList
handleInstanceHandle_t

new操作大致步骤:

1.给如下成员赋值:

​ GUID:Entity的GUID

​ unicastlocatorlist:数据通信的单播地址列表

​ multicastlocatorlist:数据通信的组播地址列表

​ reliabilityLevel:可靠性等级(Reliable, BestEffort)

​ topicKind: NoKey, WithKey

​ pushMode: 主动推送数据还是跟随HeartBeat一起发送数据

​ heartbeatPeriod:心跳包间隔

​ nackResponseDelay:对于Reader的Nack包的最长回复延时

​ nackSuppressionDuration:发送Change数据多少时间内收到Nack子消息是可以忽略的

​ lastChangeSequenceNumber:数据包的序列号(递增)

  1. 创建writer_cache:Writer的HistoryCache(用于存放要发送的CacheChange)

New_change的操作步骤大致如下:

​ 递增lastChangeSequenceNumber

​ 新建CacheChange对象

​ a_change := new CacheChange(kind, this.guid, this.lastChangeSequenceNumber,

						    data, inlineQos, handle);

​ 返回CacheChange对象

StatelessWriter:

1.StatelessWriter不知道匹配的Reader的数量,也不保存每个匹配的RTPSReader的状态。StatelessWriter只保留要发送数据的Reader的Loator信息以便发送数据。

属性类型含义和DDS的关系
reader_locatorsReaderLocator[*]StatelessWriter保存发送数据的匹配Reader的locator列表,其中包括单播地址和组播地址N/A

StatelessWriter适用于内存较小(HistoryCache可以分配的小一点)或者对传输性能高的场合(例如组播的通信方式就适合数据大的场景)

函数名参数类型
newStatelessWriter
Attribute_values创建Statelesswriter和父类Endpint需要的参数集合
reader_locator_addvoid
a_locatorLocator_t
reader_locator_removevoid
a_locatorLocator_t
Unsent_change_resetVoid

New函数主要是创建了一个内部空的ReaderLocator列表用于后续添加Reader的Locator

reader_locator_add 函数功能是添加一个远端Reader的Locator(单播或者组播)到内部的ReaderLocatorList中

ADD a_locator TO {this.reader_locators};

reader_locator_remove 函数的功能是从内部的ReaderLocatorList中移除一个Locator

REMOVE a_locator FROM {this.reader_locators};

Unsent_change_reset函数的功能是重置内部ReaderLocatorList中每个ReaderLocator中的highestSentChangeSN的值

FOREACH readerLocator in {this.reader_locators} DO

​ readerLocator. highestSentChangeSN := 0

ReaderLocator

ReaderLocator是StatelessWriter用于记录所有匹配的远端Reader位置信息的值类型

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

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

相关文章

前端与后端协同:实现Excel导入导出功能

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

docker搭建EFK(未完待续)

目录 elasticsearch1.创建网络2.拉取镜像3.创建容器如果出现启动失败,提示目录挂载失败,可以考虑如下措施 开放防火墙端口4.验证安装成功重置es密码关闭https连接创建kibana用户创建新账户给账户授权 kibana1.创建容器2.验证安装成功3.es为kibana创建用户…

C++(13): 智能指针shared_ptr

1. 概述 shared_ptr智能指针,本质是“离开作用域会自动调整(减小)引用计数,如果引用计数为0,则会调用析构函数”。这样一来,就进化成类似于int、float等的一种会被自动释放的类型。 2. 初始化智能指针 初始化一个智能指针的方式比…

LoRa自组网络设计 6

1 深入了解LoRaWan 1.1 LoRaWan概述 LoRaWAN采用星型无线拓扑 End Nodes 节点 Gateway 网关 Network Server 网络服务器 Application Server 应用服务器 LoRa联盟是2015年3月Semtech牵头成立的一个开放的、非盈利的组织,发起成员还有法国Actility,中国…

非关系型数据库-----------探索 Redis高可用 、持久化、性能管理

目录 一、Redis 高可用 1.1什么是高可用 1.2Redis的高可用技术 二、 Redis 持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三、Redis 持久化之----------RDB 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.2执行流程 3.3启动时加载…

(学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范,就是接口 监听器的作用是,监听某种变化(一般就是对…

kettle从入门到精通 第五十二课 ETL之kettle Avro output

1、上一节课我们学习了avro input,本节课我们一起学习下avro out步骤。 本节课通过json input 加载json文件,通过avro out 生成avro二进制文件,写日志步骤打印日志。将json input、avro output、写日志三个步骤拖到画布,然后连线…

【蓝桥杯选拔赛真题57】C++字符串反转 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C字符串反转 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C字符串反转 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定一个只包含大写字母"M…

速成axios

Axios 大家好,又到了我们学习新东西的时候了,今天我们来了解一下现在市场上最主流的发送ajax请求的插件咯 了解一个插件的第一步肯定是去它的官网逛逛咯 从它的主页就可以看出axios是基于promise异步,适用于浏览器和node.js ajax的前世今生 对于我们来说忘什么都不能忘本呐…

Windows启动项管理器Autoruns

文章目录 AutoRunsVirusTotalAutorunsc AutoRuns AutoRuns用于启动程序管理,可显示系统启动或登录时的各种自动启动行为,并扩展和加载各种系统进程,要比任务管理器中的自启动管理高级得多,其界面如下,列出了所有开机启…

Vue3(学自尚硅谷)

一、基础准备工作 (一)过程 环境要求:有node.js环境、npm。执行命令: npm create vuelatest 而后选择: ✔ 请输入项目名称: … me_vue3 ✔ 是否使用 TypeScript 语法? … 否 / 是 ✔ 是否启用…

Springboot传参要求

Web.java(这里定义了一个实体类交Web) public class Web{ private int Page; public int getPage() {return Page;}public void setPage(int page) {Page page;} } 1、通过编译器自带的getter、Setter传参 。只是要注意参数的名字是固定的,不能灵活改变。 传参的…

苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro

演示站:http://a.88531.cn:8016 MXPro 模板主题(又名:mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频,不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气,但是比较且可视化功…

51单片机实验02- P0口流水灯实验

目录 一、实验的背景和意义 二、实验目的 三、实验步骤 四、实验仪器 五、实验任务及要求 1,从led4开始右移 1)思路 ①起始灯 (led4) ②右移 2)效果 3)代码☀ 2,从其他小灯并向右依…

python_3

文章目录 题目运行结果模式A模式B模式C模式D 题目 mode input("请选择模式:") n int(input("请输入数字:"))if mode "A" or mode "a":# 模式A n:输入的层数 i:当前的层数# 每行数字循环次数 ifor i in range(1, n 1):for j in r…

【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)

目录 136.只出现一次的数字 118.杨辉三角 26.删除有序数组中的重复项 260.只出现一次的数字 ||| vector的详细介绍及用法这里就不过多赘述了,可以参考上一篇博客:vector的介绍及使用说明 136.只出现一次的数字 题目: 给你一个 非空 整数…

Python--Django--说明

Django 是基于python 的 Web 开发框架. &nsbp;   Web开发指的是开发基于B/S 架构, 通过前后端的配合, 将后台服务器上的数据在浏览器上展现给前台用户的应用. &nsbp;   在早期, 没有Web框架的时候, 使用 Python CGI 脚本显示数据库中的数据. Web框架致力于解决一些…

短视频素材高清无水印购买要多少钱?

大家好!在制作短视频时,找到短视频素材高清无水印是非常重要的。那么,短视频素材高清无水印在哪里找呢?今天,我要给大家推荐六个主流的视频素材分享网站,帮助你轻松获取高质量的短视频素材高清无水印&#…

【Linux】Linux C 编程

在 Windows 下编程首先就是安装对应的 IDE ,然后在 IDE 里面进行代码编写和编译,但是在 Linux 下,这两个部分是分开的,比如我们可以使用 vim 编辑器编写代码,然后用 gcc 编译器编译代码。Ubuntu 下有一些可以进行编程的…