DDS—RTPS一致性测试案例分析
1 往期回顾
通过《DDS数据分发服务—提升汽车领域数据传输效率》和《DDS—DCPS测试策略介绍及实际案例分析》这两篇文章的介绍,相信广大读者对Data Distribution Service(DDS)协议和Data Centric Publish Subscribe(DCPS)测试有了基本了解:DDS协议致力于实现功能开发和通信解耦,使开发人员更专注处理获取信息,而不必维护频繁更新的通信节点;DCPS测试则是为了保证不同供应商协议栈的API接口行为符合DDS协议规定,简化应用层代码的移植难度。而今天的主题则是The Real-time Publish-Subscribe Protocol DDS Interoperability Wire Protocol Specification(RTPS)的一致性测试,将通过一个测试用例来带领大家了解RTPS的报文识别、通信流程和测试过程。
2 RTPS一致性测试
RTPS一致性测试主要测试不同供应商开发的DDS协议栈能否按RTPS协议规定的方式进行通信,保证其具有互操作性。那么说到测试,首先就要介绍一下测试环境,如图1所示:
图1 开发环境示意
这个环境中,CANoe作为测试节点和以太网网关节点,负责控制测试流程、报告生成以及错误注入等功能。在Ubuntu中的DDS UT作为Tester,控制器/Ubuntu作为Device Under Test(DUT),两者根据CANoe的指令相互协作,完成测试流程 。
2.1测试用例简介
- 测试目标
验证DUT作为可靠的Reader时,当通信过程中发生数据丢失,其请求重新发送数据的操作是否正确。
- 测试步骤
- DUT创建可靠的RTPS Reader;
- Tester创建可靠的RTPS Writer,Topic与DUT相同;
- 启动Tester和DUT,待其建立连接后,Tester向DUT发送5个DATA消息,其中(seq_num = 3)的DATA消息丢失;
- 期待DUT发送ACKNACK请求重传seq_num = 3的DATA消息;
- 检查并记录DUT收到的消息。
- 通过条件
- Tester收到DUT发送的ACKNACK请求重传seq_num = 3的DATA子消息;
- DUT收到所有(seq_num = 1 - 5)DATA子消息;
测试环境为图1所示,其中Tester的IP = 192.168.200.110,和CANoe部署在同一台电脑上,DUT的IP = 192.168.100.60,部署在另一台电脑上,两者通过VN5650交互通信报文,而CANoe负责给Tester和DUT下发指令、转发报文、生成测试报告以及错误注入。
2.2测试执行
测试环境按图1部署好后,运行CANoe脚本开始测试,整体测试结果如图2所示:
图2 测试结果展示
图2a是CANoe的以太网Trace窗口截图。图2b是CANoe的测试用例截图,采用xml测试节点,选中指定测试用例执行即可。
图2c和图2d分别是Tester和DUT的执行结果截图,图中展示了测试开始时,两端的DUT分别接收了CANoe发送的测试指令,包括执行发送数据的间隔、数据个数、数据长度和服务质量(Quality of Service (QoS))等。Tester在测试中扮演Writer,发送5条DATA,数据长度为10byte,间隔1000ms并指定QoS的RELIABILITY = RELIABLE、DURABILITY = PERSISTENT; DUT为Reader,QoS与Writer相同,测试过程中分别在终端打印了发送和接收的数据,同时DDS UT还会将发送和接收的数据分别发送给CANoe,这些数据用来判断测试结果,最后测试执行完成后分别释放了Writer和Reader。
2.3 报文分析
这里采用Wireshark为大家展示测试过程中的RTPS报文,该测试用例的整个报文交互如图3所示:
图3 测试全过程的报文交互流程
图中的INFO_DST、HEARTBEAT、ACKNACK等子消息是非常好理解的,指的就是RTPS协议所规定的子消息,但是对于DATA消息大家可能会比较疑惑,为什么会有这么多DATA子消息?DATA(p)、DATA(r) 、DATA(w) 、DATA(m)、DATA、DATA(r[UD])、DATA(w[UD]) 、DATA(p[UD])都是什么作用?Wireshark是如何识别并标记这些子消息的?
网上介绍这方面的资料很少,因此小编在这个方面还是遇到一些坎坷,所以先简单介绍下如何解读Wireshark的RTPS报文以及Writer和Reader的交互流程,希望可以给读者一些启示。以下是小编对协议的个人理解,难免有误,欢迎大家在评论区交流,共同进步。
对于以上问题首先要回到RTPS协议本身,在RTPS[1]协议的9.3.1.3 Predefined EntityIds章节规定了一些entity,表1节选了部分Entity。
Entity | Corresponding value for entityId_t (NAME = value) |
SPDPbuiltinParticipantWriter | ENTITYID_SPDP_BUILTIN_PARTICIPANT_ANNOUNCER = {{00,01,00},c2} |
SPDPbuiltinParticipantReader | ENTITYID_SPDP_BUILTIN_PARTICIPANT_DETECTOR = {{00,01,00},c7} |
SEDPbuiltinPublicationsWriter | ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER = {{00,00,03},c2} |
SEDPbuiltinPublicationsReader | ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR = {{00,00,03},c7} |
SEDPbuiltinSubscriptionsWriter | ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER = {{00,00,04},c2} |
SEDPbuiltinSubscriptionsReader | ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR = {{00,00,04},c7} |
BuiltinParticipantMessageWriter | ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER ={{00,02,00},c2} |
BuiltinParticipantMessageReader | ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER = {{00,02,00},c7} |
表1 EntityId_t values fully predefined by the RTPS Protocol
其实这些Predefined Entity(由上至下)发送的DATA就分别对应Wireshark报文中的DATA(p) 、DATA(w) 、DATA(r)和DATA(m), DATA(*[UD])指的是这些Entity释放时的通知消息,而DATA指的是由User-defined Entity发送的消息,下面分别介绍下这些DATA的作用。
DATA(p)主要实现协议规定的Simple Participant Discovery Protocol(SPDP)发现流程,负责广播自身的单播、多播IP地址和端口号等信息,Entity发现后就进入Simple Endpoint Discovery Protocol(SEDP)流程。
DATA(w)由Writer的SEDPbuiltinPublications Entity发出,实现SEDP发现流程,向Reader公布自身的QoS、Topic等关键信息,同理DATA(r)由Reader的SEDPbuiltinSubscriptions Entity发出,向Writer公布自身的QoS、Topic等关键信息,如果两者Topic相同并且QoS兼容,则可以互相发现并通信。
DATA(m)由BuiltinParticipantMessage Entity发出,声明自身的活性并公布LIVELINESS QoS的LivelinessQosPolicyKind(用于声明存活性的管理归属),如图4所示:
图4 DATA(m)细节
图中的LivelinessQosPolicyKind = 0x0001,表示DDS 会自动管理存活状态,无需在应用程序中显式地声明(指主动调用assert_liveliness())其存活状态。
DATA指的是由User-defined Entity发送的消息,Writer向Reader发送Topic的应用数据。
DATA(*[UD])指的是这些Entity释放时的通知消息,判断的依据是其inlineQos的flags标志位是否将Unregistered和Disposed置1,如图5所示:
图5 DATA(r[UD])细节
当我们知道了这些DATA的含义,也就知道了典型的RTPS实体是如何相互发现并进行信息交互,主要流程如下:
-
- 成功创建Writer或Reader后进入SPDP阶段,分别通过广播的DATA(p)公布自身的Ip和端口号等信息;
- 互相发现后进入SEDP阶段,通过DATA(w)和DATA(r)交换彼此的QoS和Topic等信息;
- 匹配后,Wrtier通过DATA向Reader发送Topic的应用数据。如果是可靠通信,则Reader必须发送ACKNACK进行确认,当报文丢失则通过ACKNACK通知丢失报文的序号,Writer会重传丢失的报文,同时在约定的时间内通过DATA(m)互相声明存活性;
- 当一方程序退出时,发送DATA(*[UD])通知对端自身下线了,然后结束通信流程。
再回到这个测试用例,当知道了DATA报文的“隐藏”含义,我们也能通过报文分析整个测试流程。由图3可知:当Writer和Reader相互发现并匹配后,Writer向Reader发送总计5条DATA消息(仔细观察可以发现图中共有6个DATA),其中重传了seq_num = 3的DATA子消息,当发送完第五个子消息后,Writer和Reader分别下线并结束测试。
2.4 测试结果
测试完成后,CANoe会自动生成测试报告,通过报告能更加直观地查看测试过程。我们的脚本实现了全部子消息的报文解析,为了方便测试人员清晰的看出测试要点和测试步骤,这条测试用例选择性的解析了DATA和ACKNACK,如图6所示:
图6 CANoe测试报告
CANoe作为网关对通信报文进行转发和错误注入,测试过程中转发普通的RTPS报文,同时只拦截了第一个seq_num = 3的DATA子消息(时间戳5.538000),模拟了通信过程中报文丢失的情况。当DUT发现seq_num = 3的DATA子消息丢失后,立刻发送ACKNACK(时间戳5.642000)消息进行重传,Tester收到后立刻重传了“丢失的”DATA消息(时间戳5.644609)。当DUT收到DATA消息后,向CANoe发送了接收到的消息序列(时间戳5.644609),脚本会验证接收到的是否和发送的(时间戳5.537761,发送消息时Tester也会把消息序列发送给脚本)一致,如果一致则该测试用例pass,否则fail。
3 结语
由于篇幅有限,RTPS相关测试就为大家介绍这些,实际测试覆盖报文格式、一致性、QoS等方面,总计200多条测试用例,能全面测试DDS协议栈的互操作性,提前排除通信隐患,为汽车通信安全作出保障。
[1] The Real-time Publish-Subscribe Protocol DDS Interoperability Wire Protocol (DDSI-RTPSTM) Specification Version 2.5
相关文章:
DDS—RTPS一致性测试案例分析
1 往期回顾 通过《DDS数据分发服务—提升汽车领域数据传输效率》和《DDS—DCPS测试策略介绍及实际案例分析》这两篇文章的介绍,相信广大读者对Data Distribution Service(DDS)协议和Data Centric Publish Subscribe(DCPS)测试有了基本了解:DDS协议致力于…...
【深度学习入门】深度学习介绍
1.1 深度学习介绍 学习目标 目标 知道深度学习与机器学习的区别了解神经网络的结构组成知道深度学习效果特点 应用 无 区别 特征提取方面 机器学习的特征工程步骤是要靠手动完成的,而且需要大量领域专业知识深度学习通常由多个层组成,它们通常将更简…...
数值分析—非线性方程的数值解
研究背景 形如 x − t a n x 0 x-tanx0 x−tanx0、 x l n x e − x 2 s i n x 0 xlnxe^{-x^2}sinx0 xlnxe−x2sinx0等称为非线性方程,自变量之间并非简单的线性关系,这种问题我们无法通过其结构求解,需要其他的逼近方式,本章…...
LDR6500应用:C转DP线材双向投屏开启全新体验
在当今这个科技日新月异、蓬勃发展的时代,高清视频传输以及显示技术已经深深融入到我们日常生活与工作的方方面面,其重要性不言而喻。不管是在商务场合的会议演示,还是教育领域的娱乐享受,以及充满激情的游戏竞技领域,…...
路径规划之启发式算法之十六:和声搜索算法(Harmony Search, HS)
和声搜索算法(Harmony Search, HS)是一种新兴的启发式全局搜索算法,是一种模拟音乐家即兴演奏过程的群体智能优化算法。这种算法由Zong Woo Geem等人在2001年提出,灵感来源于音乐家在寻找和声时的创造性思维过程。HS算法通过模拟音乐家演奏音乐时的选择过程来寻找问题的最优…...
Redis - 实战之 全局 ID 生成器 RedisIdWorker
概述 定义:一种分布式系统下用来生成全局唯一 ID 的工具 特点 唯一性,满足优惠券需要唯一的 ID 标识用于核销高可用,随时能够生成正确的 ID高性能,生成 ID 的速度很快递增性,生成的 ID 是逐渐变大的,有利于…...
matlab 连接远程服务器
通过matlab 控制远程服务器 查看 matlab 中 python 接口脚本 对于 matlab 2010b 兼容的 最高 Python版本是 3.10 安装 3.10 版本的Python,并安装 paramiko 库 pip install paramikomatlab 中设置 Python的环境 例如 pyversion(D:/Anaconda3/python.e…...
在服务器自主选择GPU使用
比如说,程序使用第 2 张显卡(从 0 开始计数)。它的作用是告诉系统和深度学习框架(如 PyTorch 或 TensorFlow)只可见某些 GPU。 export CUDA_VISIBLE_DEVICES1 然后再查看当前使用的显卡: echo $CUDA_VIS…...
【设计模式】享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享尽可能多的对象来有效支持大量细粒度的对象。这个模式主要用于减少内存使用和提高性能,特别是在需要创建大量相似对象的场景中。享元模式的核心思想是将对象的状态分为…...
题目 1688: 数据结构-字符串插入
第一种方式字符串 #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(){string s1,s2;int n;cin>>s1>>s2>>n;s1.insert(n-1,s2);cout<<s1<<endl;return 0; } 第二种方式字符数组 …...
28.攻防世界PHP2
进入场景 扫描目录 [04:12:32] 403 - 303B - /.ht_wsr.txt [04:12:32] 403 - 306B - /.htaccess.bak1 [04:12:32] 403 - 308B - /.htaccess.sample [04:12:…...
QML QT6 WebEngineView 、Echarts使用和数据交互
QML 中的 WebEngineView 是用于显示网页内容的组件,它基于 Qt WebEngine,支持现代网页渲染和与 JavaScript 的交互。它通常用来在 QML 应用中嵌入浏览器或加载在线资源。WebEngineView 可以展示 HTML、CSS、JavaScript 等网页内容,并提供多种属性和方法来控制其行为。 如下…...
SpringBoot 整合 Mail 轻松实现邮件自动推送
简单使用 1、pom 包配置 pom 包里面添加 spring-boot-starter-mail 包引用 <dependencies><dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency> </de…...
MyBatis 核心知识与实践
一、MyBatis 概述 1. 框架简介 MyBatis 是一款支持自定义 SQL、存储过程以及高级映射的持久层框架。它避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的操作,使开发人员能够更专注于 SQL 语句的编写和业务逻辑的处理。 2. 核心组件 SqlSessionFactoryB…...
机器学习期末速成
文章目录 一、机器学习分类二、逻辑回归三、决策树四、集成学习算法五、支持向量机六、聚类七、特征工程和指标 文章参考自B站机器学习期末速成课 本文仅作者个人复习使用 一、机器学习分类 聚类和分类的区别: 分类:一开始就知道有哪些类别 聚类&#…...
Linux中的线程
目录 线程的概念 进程与线程的关系 线程创建 线程终止 线程等待 线程分离 原生线程库 线程局部存储 自己实现线程封装 线程的优缺点 多线程共享与独占资源 线程互斥 互斥锁 自己实现锁的封装 加锁实现互斥的原理 死锁 线程同步 线程的概念 回顾进程相关概念 …...
AI大模型学习笔记|多目标算法梳理、举例
多目标算法学习内容推荐: 1.通俗易懂讲算法-多目标优化-NSGA-II(附代码讲解)_哔哩哔哩_bilibili 2.多目标优化 (python pyomo pareto 最优)_哔哩哔哩_bilibili 学习笔记: 通过网盘分享的文件:多目标算法学习笔记 链接: https://pan.baidu.com…...
蓝桥杯刷题——day3
蓝桥杯刷题——day3 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造…...
企业级日志分析系统ELK之ELK概述
ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件,如果应用出现问题,开发和运维人员想排 查原因,就要先找到相应的主机上的日志文件再进行查找和分析,所以非常不方便,而且还涉及…...
【开源项目】经典开源项目数字孪生体育馆—开源工程及源码
飞渡科技数字孪生体育馆管理平台,融合物联网IOT、BIM数据模型、三维GIS等技术,实现体育馆的全方位监控和实时全局掌握,同时,通过集成设备设施管理、人员管理等子系统,减少信息孤岛,让场馆“可视、可控、可管…...
C++多线程实战:掌握图像处理高级技巧
文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 在当今的计算世界中,…...
解决MAC装win系统投屏失败问题(AMD显卡)
一、问题描述 电脑接上HDMI线后,电脑上能显示有外部显示器接入,但是外接显示器无投屏画面 二、已测试的方法 1 更改电脑分辨,结果无效 2 删除BootCamp,结果无效 3更新电脑系统,结果无效 4 在设备管理器中&#…...
网易游戏分享游戏场景中MongoDB运行和分析实践
在游戏行业中,数据库的稳定和性能直接影响了游戏质量和用户满意度。在竞争激烈的游戏市场中,一个优秀的数据库产品无疑能为游戏的开发和后期的运营奠定良好的基础。伴随着MongoDB在不同类型游戏场景中的应用越来越广泛,许多知名的游戏公司都在…...
Android14 AOSP 允许system分区和vendor分区应用进行AIDL通信
在Android14上,出于种种原因,system分区的应用无法和vendor分区的应用直接通过AIDL的方法进行通信,但是项目的某个功能又需要如此。 好在Binder底层其实是支持的,只是在上层进行了屏蔽。 修改 frameworks/native/libs/binder/Bp…...
R学习——因子
目录 1 定义因子(factor函数) 2因子的作用 一个数据集中的 只需要考虑可以用哪个数据来进行分类就可以了,可以用来分类就可以作为因子。 Cy1这个因子对应的水平level是4 6 8: 1 定义因子(factor函数) 要…...
pytest入门三:setup、teardown
https://zhuanlan.zhihu.com/p/623447031 function对应类外的函数,每个函数调用一次 import pytest def setup_module():print(开始 module)def teardown_module():print(结束 module)def setup_function():print(开始 function)def teardown_function():print(结…...
前端面试准备问题2
1.防抖和节流分别是什么,应用场景 防抖:在事件被触发后,只有在指定的延迟时间内没有再次触发,才执行事件处理函数。 在我的理解中,简单的说就是在一个指定的时间内,仅触发一次,如果有多次重复触…...
web前端sse封装
这是一个基于microsoft/fetch-event-source包封装的sse函数,包含开始、停止功能; 可传更多参数、使用非常简单。 使用前: 安装 microsoft/fetch-event-source 代码: // sse import { fetchEventSource } from microsoft/fetch-event-source import { …...
智能家居WTR096-16S录放音芯片方案,实现语音播报提示及录音留言功能
前言: 在当今社会的高速运转之下,夜幕低垂之时,许多辛勤工作的父母尚未归家。对于肩负家庭责任的他们而言,确保孩童按时用餐与居家安全成为心头大事。此时,家居留言录音提示功能应运而生,恰似家中的一位无形…...
【创建模式-蓝本模式(Prototype Pattern)】
目录 Overview应用场景代码演示JDK Prototype pattern 更优实践泛型克隆接口 https://doc.hutool.cn/pages/Cloneable/#%E6%B3%9B%E5%9E%8B%E5%85%8B%E9%9A%86%E7%B1%BB The prototype pattern is a creational design pattern in software development. It is used when the t…...
用wordpress做网站教程/百度关键词优化首选667seo
这个事情一下困扰了好几天,今天终于解决了。做个记录事情的原因为在linux下环境下需要用流输出一个文件,其实这是是件很简单的事情。但麻烦的是输出的文件中文件内容的确被编码成了GBK,可是文件名却一直是utf-8。百思不得其解。也初步调过linux的字符集&…...
wordpress数据库还原/b2b免费网站推广平台
压缩和解压缩文件Alt F5 压缩选定文件 Alt F9 解压压缩文件Alt Shift F9 测试压缩文件 FPT连接Ctrl F ftp站点管理器Ctrl N 新建ftp连接 Ctr…...
wordpress ftp没有权限设置/整合营销经典案例
主要是用 WnetEnumResource 和NetShareEnum API 来查看局域网的共享文件夹。有一个工具ShareEnum 是用来查看局域网的共享文件夹 在这里 下载 csdn论坛里有人举了一个例子,可参考一下,到这里 看看。...
河池市住房和城乡建设局网站/南平网站seo
作为一名SEO人员我们每天的工作除了做推广以为,最主要的内容就是监控关键词的排名,很多初入SEO行业的小伙伴特别紧张,如果并不是大面积的关键词排名下降,还请大家放轻松,你可以通过下面5个方法来恢复你的关键词排名&am…...
php网站开发示例/重庆seo网站收录优化
link函数(给一个文件起多个文件名)在UNIX系统中,一个文件可以同时拥有多个文件名。也就是我们想要复制一个文件时,并不必真正复制文件内容,只要另外建立一个文件名,然后将这个文件名链接到所要复制的文件就…...
温州seo网站推广/全网营销老婆第一人
操盘机器人里面聊微信转载于:https://www.cnblogs.com/bdccloudy/p/7665246.html...