RTPS协议之Messages Module

news2024/11/19 5:50:55

目录

  • Messages Module
    • Type定义
    • RTPS消息结构
      • RTPS消息头
      • 子消息结构
    • RTPS消息接收者
    • SubmessageElements
    • RTPS Header
    • RTPS Submessages

Messages Module

RTPS Writer和RTPS Reader之间的交换数据的消息。

Type定义

TypePurpose
ProtocolId_t
SubmessageFlagsub msg flag
SubmessageKind枚举值用于标识是什么类型的sub msg,有这些:DATA, GAP, HEARTBEAT, ACKNACK, PAD, INFO_TS, INFO_REPLY, INFO_DST, INFO_SRC, DATA_FRAG, NACK_FRAG, HEARTBEAT_FRAG
Time_t时间戳,至少到ns,TIME_ZERO,TIME_INVALID TIME_INFINITE
Count_t保存递增的计数,用于识别重复消息
ParameterId_t用于在参数列表中唯一标识参数的类型。主要在Discovery中广泛使用,主要用于定义QoS参数。一些被保留用于协议定义的参数,另一些可以用于供应商定义的参数。
FragmentNumber_t用于保存帧序号?
GroupDigest_t用于保存唯一标识属于同一参与者的一组实体的摘要值的类型。

RTPS消息结构

RTPS message structure

RTPS协议发送的每一条消息都有一个固定的长度。这个长度不是由RTPS协议明确发送的,而是作为传输底层的一部分,RTPS消息是通过这种方式发送的。在面向数据包的传输(例如UDP/IP)的情况下,消息的长度已经由传输头部提供。面向流的传输(例如TCP)则需要在消息前面插入长度,以便识别RTPS消息的边界

RTPS消息头

RTPS Header
消息头标识这条消息属于RTPS协议,标识了协议版本和供应商,具体包含以下内容:

字段类型含义抓包中对应的字段
protocolProtocolId_t表示这个rtps消息Magic: RTPS
versionProtocolVersion_t标识rtps协议的版本号Protocol version: 2.2
vendorIdVendorId_tRTPS协议实现的供应商标识vendorID: 01.15(eProsima - Fast-RTPS)
guidPrefixGuidPrefix_tGUIDs中使用的默认的prefix?TODO要确认
  • guidPrefix定义了一个默认前缀,可以用来重构消息中包含的子消息的全局唯一标识符(GUIDs)。guidPrefix允许子消息只包含GUID的EntityId部分,因此可以避免在每个GUID上重复相同的前缀,从而节省空间。

子消息结构

每个RTPS消息都是由一个或多个子消息组成。
Structure of the RTPS Message Header
所有的子消息都是由 一个SubmessageHeader+0个或多个消息元素 组成。子消息头部用于标识子消息的种类和该子消息内的可选元素。

子消息头结构:

字段类型含义
submessageIdSubmessageKind标识了Submessage.的消息类型,消息类型在下面列出
flagsSubmessageFlag[8]标识用于编码子消息的字节顺序,子消息中的可选元素的存在,并可能修改子消息的解释。有8个可能的标志。第一个标志(索引0)标识用于编码子消息的字节顺序。其余的标志会根据子消息的种类有不同的解释,并分别为每个子消息进行描述。
submessageLengthushort表示子消息的长度。由于RTPS消息由子消息的连结组成,所以子消息的长度可用于跳转到下一个子消息。

RTPS消息接收者

一个消息中的子消息的解释和含义可能取决于该消息中之前的子消息。因此,消息的接收者必须维护同一消息中先前反序列化的子消息的状态。这种状态被建模为每次处理新消息时复位的RTPS接收器的状态,并为每个子消息的解释提供上下文。
 RTPS Receiver

对每一条新的message,Receiver的状态被重置和初始化

name初始值
sourceVersionPROTOCOLVERSION
sourceVendorIdVENDORID_UNKNOWN
sourceGuidPrefixGUIDPREFIX_UNKNOWN
destGuidPrefix
UnicastReplyLocatorList
multicastReplyLocatorList
haveTimestampFalse
timestampTIME_INVALID
messageLength

Message Receiver必须遵守以下规则:

  1. 如果Submessage的消息头不能被读取,则其他消息体无效
  2. submessageLength为下一个Submessage的起始位置,或指示子消息扩展到消息的结束。如果这个字段是无效的,那么这条消息无效。
  3. 具有未知SubmessageId的子消息必须被忽略,并且必须要解析继续下一个子消息。也就是说,不在SubmessageKind范围内的消息id必须要被忽略。未知vendorId的供应商的SubmessageIds也必须被忽略,并且必须解析继续到下一个子消息。
  4. Submessage的接收者应忽略位置的flag
  5. 一个有效的submessageLength字段必须要被用于发小下一条Submessage, 即使Submessage有明确的id
  6. 一个已知但无效的子消息会使消息的其余部分失效。
    子消息何时被视为无效:
  • 它可以改变接收者的状态;这个状态影响了消息中后续子消息的解释方式。8.3.7节讨论了每个子消息如何改变状态。在此协议版本中,只有标题和子消息InfoSource,InfoReply,InfoDestination和InfoTimestamp改变了接收者的状态。
  • 它可以影响目标Endpoint的行为,这适用于基本的RTPS消息:Data,DataFrag,HeartBeat,AckNack,Gap, HeartbeatFrag, NackFrag.

SubmessageElements

每个RTPS消息包含可变数量的RTPS子消息。每个RTPS子消息反过来又是由一组预定义的原子构建块构成,这些构建块被称为子消息元素。RTPS 2.4定义了以下子消息元素:GuidPrefix, EntityId, SequenceNumber, SequenceNumberSet, FragmentNumber, FragmentNumberSet, VendorId, ProtocolVersion, LocatorList, Timestamp, Count, SerializedData, ParameterList和GroupDigest。
RTPS SubmessageElements

  1. GuidPrefix和EntityId
  2. VendorId
  3. ProtocolVersion
  4. SequenceNumber
  5. SequenceNumberSet
  6. FragmentNumber
  7. FragmentNumberSet
  8. Timestamp
  9. ParameterList
  10. Count
  11. LocatorList
  12. SerializedData
  13. SerializedDataFragment
  14. GroupDigest

RTPS Header

每一条 RTPS Message必须以一个 Header开头.

RTPS Submessages

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

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

相关文章

【YashanDB知识库】OCI驱动类问题定位方法

【标题】OCI驱动类问题定位方法 【需求分类】故障分析 【关键字】OCI 【需求描述】由于我们的OCI接口目前尚不完善,经常会遇见OCI接口能力不足导致应用功能无法运行的问题,需要定位手段确定底层是哪个接口报错 【需求原因分析】方便一线数据库管理员…

揭秘智慧校园:可视化技术引领教育新篇章

随着科技的飞速发展,我们的生活方式正在经历一场前所未有的变革。而在这场变革中,学校作为培养未来人才的重要基地,也在不断地探索与创新。 一、什么是校园可视化? 校园可视化,就是通过先进的信息技术,将学…

Nocobase快速上手 - 常见block的使用

在上一篇文章 Nocobase快速上手 -第一个collection 中,我们新建了一个collection ,并且通过在页面中配置block实现了数据的展示,本文继续探索block的使用。 Block类型 Block(区块)的整体架构如下图: 我们可以看到,block分为三个大类&#…

【C++】二维前缀和

1.题目 2.算法思路 和一维前缀和的方法类似&#xff0c;我们需要预处理一个求和矩阵&#xff0c;然后再求和。 下面是模板&#xff1a; 上面两张图片总结出来了两个公式&#xff0c;这是解决此类问题的关键。 3.代码 #include <iostream> using namespace std; #incl…

Java Apache Jexl规则引擎初体验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板引擎的选择&#xff1f;二、什么是JEXL规则引擎&#xff1f;优点缺点 三、其他规则引擎四、示例1.引入依赖2.方法示例3、代码解释4、效果![import java…

ssm校园疫情防控管理系统-计算机毕业设计源码30796

目 录 摘要 1 绪论 1.1目的及意义 1.2开发现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 校园疫情防控管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…

Linux终端连接工具

终端连接工具有很多中&#xff0c;这里我只收集了一些常用的或免费的工具 我一般会配套使用&#xff1a; FinalShell -->命令行工具&#xff08;Mac和win&#xff09; WinSCP -->文件上传工具&#xff08;win&#xff09; filezilla -->文件上传工具&#xff08;Mac …

【408真题】2009-25

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

Jetpack架构组件_5.BindingAdapter

1.BindingAdapter介绍 Binding adapters 可以作为一个设置某个值的框架来使用&#xff0c;databinding 库可以允许指定具体的方法来进行相关值的设置&#xff0c;在该方法中可以做一些处理逻辑&#xff0c;Binding adapters 会最终给你想要的结果。Android Databinding框架中已…

企业如何打造通证经济生态闭环详解(下)

一、原始账户&#xff1a;用户注册即生成【原始账户】【托管账户】。 原始账户用于存储用户所获取的通证积分&#xff0c;原始账户的公钥与私钥由用户所有&#xff0c;安全、私密、去中心化。 通过原始账户&#xff0c;用户可进行转账、收款的点对点传输&#xff0c;并可查看…

Activity详解,用最通俗的语言告诉你什么是Activity(一)

大家好&#xff0c;我是小布丁。 今天还是分享Android基础知识&#xff0c;有Android基础的朋友都知道&#xff0c;Activity作为Android四大组件之一&#xff0c;掌管可视化界面。也是大多数人刚接触Android学的第一课。下面我来带大家学习/复习这部分知识&#xff0c;请大家不…

Docker教程——Docker安装

安装 在安装Docker之前&#xff0c;我们需要执行如下代码安装Docker的一些依赖包&#xff0c; sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo依赖包安装好后&#xff0c;执行如下代码安装Dock…

Three.js是基于原生WebGL封装的三维引擎

Three.js: 基于原生WebGL封装的三维引擎 引言 随着互联网技术的发展&#xff0c;Web前端技术不断进步&#xff0c;用户对于网页交互体验的要求也越来越高。艾斯视觉前端开发&#xff1a;三维技术作为提升用户体验的重要手段之一&#xff0c;正在逐渐成为前端开发中的热门技术…

aws 在ecs外部实例上运行gpu负载

参考资料 https://docs.amazonaws.cn/zh_cn/AmazonECS/latest/developerguide/ecs-gpu.htmlhttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#gpu-instanceshttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/install-nvidia-drive…

pytorch学习day1

一.pytorch主要模块介绍 1.1 模块介绍 模块描述torch包含激活函数和主要的张量操作torch.Tensor定义了张量的数据类型&#xff0c;方法可返回新张量&#xff0c;方法后缀带下划线可修改张量本身torch.cuda定义了 CUDA 运算相关的函数&#xff0c;如检查 CUDA 是否可用&#x…

FL Studio21.2.5中文版电子音乐制作的强大工具

在当今的数字音乐时代&#xff0c;电子音乐已经成为了全球音乐市场中不可或缺的一部分。越来越多的音乐爱好者开始尝试自己动手创作电子音乐&#xff0c;而FL Studio 21中文版正是为他们量身打造的一款强大工具。作为一个音频制作爱好者&#xff0c;我深知一个好的数字音频工作…

使用OrangePi KunPeng Pro部署AI模型

目录 一、OrangePi Kunpeng Pro简介二、环境搭建三、模型运行环境搭建(1)下载Ollama用于启动并运行大型语言模型(2)配置ollama系统服务(3)启动ollama服务(4)启动ollama(5)查看ollama运行状态四、模型部署(1)部署1.8b的qwen(2)部署2b的gemma(3)部署3.8的phi3(4)部署4b的qwen(5)部…

【问题解决】pycharm中添加python interpreter报错 conda excutable is no found

选择安装目录下的conda.bat文件&#xff0c;然后点击“Load Environments”按钮&#xff0c;然后在列表中选择conda环境即可。

工控一体机5寸显示器电容触摸屏(YA05WK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架构&#xff0c;主频1.2GHz的CPU。采用12V供电&#xff0c;标配5寸…

MyBatis出现:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本质上来说&#xff0c;是Mybatis使用上的错误&#xff0c;不熟悉&#xff0c;理…