导图社区 opendds知识点简单梳理
opendds知识点梳理,发布订阅模型,简单的概念介绍和关联关系,希望可以对大家有所帮助。
编辑于2024-03-01 15:22:14中心主题
主题
子主题
主题
主题
opendds
示意
什么是opendds
dds(数据分发服务)的一种开源实现
遵循
dds规范v1.2
公布/订阅互操作性通信协议v2.1的dds-rtps规范
oci公司设计和维护
利用ACE,提供一个跨平台环境
利用Tao,提供IDL编译器等功能作为OpenDDS的DCPS信息仓库
组成
子主题
开始
IDL
DDS使用的每种数据类型都是使用IDL定义的。
结构
OpenDDS使用#pragma指令来识别DDS传输
和处理的数据类型
module Messenger { #pragma DCPS_DATA_TYPE "Messenger::Message" #pragma DCPS_DATA_KEY "Messenger::Message subject_id" struct Message { string from; string subject; long subject_id; string text; long count; }; };
处理IDL
tao_idl Messenger.idl
生成序列化和密钥支持代码
数据读取器和数据写入器识别的代码
初始化参与者
子主题
注册数据类型创建主题
然后往里面填装代码
其实就是
sub.cpp
pub.cpp
dil
tao_idl
用opendds_idl
生成的库,mwc.pl控制生成publish与subscribe
怎么使用
文件怎么分门别类
自己编译的文件
依赖脚本生成的文件
问题
编译顺序
现在只知道idl
不知道怎么使用idl编译后生成的文件
怎么创建一个完整的工程
怎么入手
创建工程的顺序
头文件与库的引用
表现形式是什么样的
RPC
什么是RPC
Remote Procedure Call
远程过程调用,CORBA的底层实现
IDL
什么是IDL
Interface description language
指接口描述语言,是CORBA规范的一部分,是跨平台开发的基础
CORBA
什么是CORBA
Common Object Request Broker Architecture
公共对象请求代理体系结构,通用对象请求代理体系结构,是由OMG组织制订的一种标准的面向对象应用程序体系规范
Tao
什么是Tao
The ACE ORB
基于ACE基础上的CORBA实现框架
ace
什么是ACE
Adaptive Communication Environment
自适应通信环境
一套基于c++语言的开源网络开发库
dds(数据分发服务)
什么是dds
OMG对象管理组织在HLA及CORBA等标准的基础上制定的新一代分布式实时通信中间件技术规范,DDS采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,能保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。DDS信息分发中间件是一种轻便的、能够提供实时信息传送的中间件技术
架构
历史
DDS(DataDistributionService)数据分发服务技术最早应用于美国海军,用于解决舰船复杂网络环境中大量软件升级的兼容性问题,目前已经成为美国国防部的强制标准。2003年,DDS被OMG组织接受,并发布了专门为实时系统设计的数据分发/订阅标准。DDS目前已经广泛应用于国防、民航、工业控制等领域,成为分布式实时系统中数据发布/订阅的标准解决方案。DDS技术是基于以数据为核心的设计思想提出的,定义了描述网络环境下数据内容、交互行为和服务质量要求的标准。DDS以数据为核心的设计思想非常贴合如传感器网络、指挥信息网等应用场景,其提供的数据传输模型能够很好地适应应用系统的开发需要
特点
灵活的发布/订阅模型
完整dds规范qos服务质量策略
已扩展的qos服务质量策略
互操作
强实时
跨平台
支持多种底层物理通信协议
仿真
测试
时装
全生命周期
应用
军工
组成(订阅发布模型)
dds模型组成
DDS内所有的成员都是Entity,DDS中的任两个Entity(实体角色)通信都必须在同一个Domain内进行交互,即他们初始化时DomainID是同一个,并且不同Domain的DomainID必须唯一。Domain内的DomainParticipant是服务的入口点,任何DDS应用都需首先获取DomainParticipant,然后通过Domain Participant获取其他服务,如Publisher、Subscriber、Topic等
QOS
DS规范定义了丰富的服务质量策略(Quality of Services Policies),QoS是一种网络传输策略,应用程序指定所需要的网络传输质量行为,QoS服务实现这种行为要求,尽可能地满足客户对通信质量的需求,DDS定义QoS策略使其对复杂网络环境的适应性和鲁棒性大大增强,优化网络传输质量。QoS可以理解为数据提供者和接收者之间的合约
Domain
代表一个通信平面,由域号Domain ID唯一标识,只有在同一个域内的通信实体才可以通信,不同的域内的实体见无任何逻辑关系;如果考虑车内通信,可以只划分1个Domain,也可以按照交互规则或其他规则,定义多个Domain
Domain Participant
作为数据分发服务的入口点,包含若干发布者、订阅者和注册主题,负责创建、删除和管理这些实体
DDS中的基本结构是Domain,Domain将各个应用程序绑定在一起进行通信
Topic
是数据的抽象概念,由TopicName标识,关联相应数据的数据类型(DataType),如果把车内所涉及的所有Topic集合在一起,这样就形成一个虚拟的全局数据空间“Global Data Space”,进一步弱化了节点的概念,所以域参与者已经不是节点的概念了
DataWriter
数据写入者,类似缓存,把需要发布的主题数据从应用层写入到DataWriter中。具体负责发布数据,数据发布者通过调用DataWriter的write函数发布数据,但数据不会立刻被送出,实际的消息产生是通过Puhlisher和QoS综合控制的
Publisher
发布者,发布主题数据,至少与1个DataWriter关联,通过调用DataWriter的相关函数将数据发出去,并负责创建、删除和管理DataWriter
相互关联
DataReader
数据读取者,同样可以理解为一种缓存,从订阅者得到主题数据,随之传给应用层。负责订阅数据,订阅方式可采用异步方式(Listener)、同步方式(WaitSet)和非阻塞三种
Subscriber
订阅者,订阅主题数据,至少与1个DataReader关联,并负责创建、删除和管理DataReader。当数据到达时,应用程序可能忙于执行其他操作或应用程序只是等待该消息时,这样就会存在两种情况,同步访问和异步通知
相互关联
消息队列
报文队列
什么是消息队列
消息传输过程中保存消息的容器
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。
本质就是链表,具有特定格式、优先级的链表
对象
两台计算机
特点
“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
根据需求,容器内保存的消息内容可简单,可复杂
队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
一直保存,直到接收者收到
分类
系统V消息队列(信息量有限)
系统V消息队列目前被大量使用。
POSIX消息队列(实时性扩展)
考虑到程序的可移植性,新开发的应用程序应尽量使用POSIX消息队列。
发布订阅
消息系统中间件的一部分,是消息队列范式的兄弟
什么是发布订阅
是一种消息范式
发送者不会将消息直接发送给特定的接收者,二十将发布的消息分为不同的类别,无需了解那些订阅者
不直接发送数据给特定的订阅者
同样的订阅者可以表达对一个或多个类别的邢确只接收感兴趣的消息,无需了那那些发布者存在
可以订阅多个发布者的不同类型的消息
组成
发布者
消息发送者
接收者
订阅者
作用
优点
提供了更大的网络可扩展性
更动态的网络拓扑
松耦合
发布者与订阅者松耦合,甚至不需要知道它们的存在。由于主题才是关注的焦点,发布者和订阅者可以对系统拓扑结构保持一无所知。各自继续正常操作而无需顾及对方。在传统的紧耦合的客户端-服务器模式中,当服务器进程不运行时,客户端无法发送消息给服务器,服务器也无法在客户端不运行时接收消息。许多发布/订阅系统不但将发布者和订阅者从位置上解耦,还从时间上解耦他们。中间件分析师对这种发布/订阅使用的常用策略,是拆卸一个发布者来让订阅者处理完积压的工作(带宽限制的一种形式)
实时性难以保证,所以一些具有发布订阅功能的中间件,需要引入QoS
可扩展
通过并行操作,消息缓存,基于树或基于网络的路由等技术,发布/订阅提供了比传统的客户端–服务器更好的可扩展性。然而,在某些类型的紧耦合、高容量的企业环境中,随着系统规模上升到由上千台服务器组成的数据中心所共享的发布/订阅基础架构,现有的供应商系统经常失去这项好处;在这些高负载环境下,发布/订阅产品的扩展性是一个研究课题。 另一方面,在企业环境之外,发布/订阅范式已经证明了它的可扩展性远超过一个单一的数据中心,通过网络聚合协议如RSS和Atom提供互联网范围内分发的消息。在交互时,为了能够即便是用低档Web服务器也能将消息播出到(可能)数以百万计的独立用户节点,这些聚合协议接受更高的延迟和无保障交付
缺点
降低了发布者和发布数据结构的灵活性
发布/订阅系统最严重的问题是其主要优点的副作用:发布者解耦订阅者
消息交付问题:发布/订阅系统必须仔细设计,才能提供特定的应用程序可能需要的更强大的系统性能,例如有保障的交付
过程
接收
订阅者通常接收所有发布的消息的一个子集
接受和处理(过滤)
基于主题
在基于主题的系统中,消息被发布到主题或命名通道上。订阅者将收到其订阅的主题上的所有消息,并且所有订阅同一主题的订阅者将接收到同样的消息。发布者负责定义订阅者所订阅的消息类别
基于内容
在基于内容的系统中,订阅者定义其感兴趣的消息的条件,只有当消息的属性或内容满足订阅者定义的条件时,消息才会被投递到该订阅者。订阅者需要负责对消息进行分类
混合模式
发布者发布消息到主题上,而订阅者将基于内容的订阅注册到一个或多个主题上
QoS
https://zhuanlan.zhihu.com/p/151347866
什么是Qos
流量质量服务
从传统意义上来讲,无非就是传输的带宽、传送的时延、数据的丢包率等,而提高服务质量无非也就是保证传输的带宽,降低传送的时延,降低数据的丢包率以及时延抖动等。广义上讲,服务质量涉及网络应用的方方面面,只要是对网络应用有利的措施,其实都是在提高服务质量。因此,从这个意义上来说,防火墙、策略路由、快速转发等也都是提高网络业务服务质量的措施之一。
Qos组成
流量分类
采用一定的规则识别符合某类特征的报文,它是对网络业务进行区分服务的前提和基础
流量监管
对进入或流出设备的特定流量进行监管。当流量超出设定值时,可以采取限制或惩罚措施,以保护网络资源不受损害。可以作用在接口入方向和出方向
流量整形
一种主动调整流的输出速率的流量控制措施,用来使流量适配下游设备可供给的网络资源,避免不必要的报文丢弃,通常作用在接口出方向
流量限速
拥塞管理
就是当拥塞发生时如何制定一个资源的调度策略,以决定报文转发的处理次序,通常作用在接口出方向
拥塞避免
监督网络资源的使用情况,当发现拥塞有加剧的趋势时采取主动丢弃报文的策略,通过调整队列长度来解除网络的过载,通常作用在接口出方向
QoS模型
尽力而为模型(Best-Effort)
是一个单一的服务模型,也是最简单的服务模型。对Best-Effort服务模型,网络尽最大的可能性来发送报文。但对延时、可靠性等性能不提供任何保证
Best-Effort服务模型是网络的缺省服务模型,通过FIFO(first in first out 先入先出)队列来实现。它适用于绝大多数网络应用,如FTP、E-Mail等
综合服务模型(Int-Serv)
nt-Serv服务模型Int-Serv是一个综合服务模型,它可以满足多种QoS需求。该模型使用资源预留协议(RSVP),RSVP运行在从源端到目的端的每个设备上,可以监视每个流,以防止其消耗资源过多。这种体系能够明确区分并保证每一个业务流的服务质量,为网络提供最细粒度化的服务质量区分。但是,Inter-Serv模型对设备的要求很高,当网络中的数据流数量很大时,设备的存储和处理能力会遇到很大的压力。Inter-Serv模型可扩展性很差,难以在Internet核心网络实施
区分服务模型(Diff-Serv)
Diff-Serv服务模型是一个多服务模型,它可以满足不同的QoS需求。与Int-Serv不同,它不需要通知网络为每个业务预留资源。区分服务实现简单,扩展性较好
opendds安装
所需工具
visual c++
尽量用vs2015
perl脚本
ace + tao
opendds
主题
遇到的问题
下载源找了老半天
以后就去git上去找
现在可通过官网历史源头下载
最新版本能变过
但是无法运行示例
找个靠谱的教程,确定版本,严格按照教程操作
完全按照实例opendds编译不通过
也有可能没有完全编译通过
也有可能是因为vs安装的不完整
规划
早游戏本上再安装一次
3.1.4版本
IDl
实例
module Demo { #pragma DCPS_DATA_TYPE "Demo::Pos" #pragma DCPS_DATA_KEY "Demo::Pos.pos_id" struct Pos { long pos_id; long pos_x; long pos_y; }; };
module DemoIdlModule { @topic struct DemoTopic1 { @key long id; long counter; string text; }; };
什么是
组成
键成员
使用DCPS_DATA_KEY定义一个结构体数据类型
特点
键可以是数值型、枚举型、字符串型,或者是这些类型的typedef
一个结构体可以有0个或多个键
唯一的键,可以区分同一主题中的不同实例
相同的键会被替换
其他成员
使用DCPS_DATA_TYPE定义了一个DCPS数据类型的键
特点
可以是标量类型(short、long、float等等)、枚举类型、字符串、队列、数组、结构体、以及它们的组合
定义
#pragma指令定义DDS传输和处理的数据类型
怎么好用
方法一
编写
< filename >idl
用$ACE_ROOT/bin/tao_idl编译< filename >idl生成文件6个文件
生成数据在网络上传输时打包解包的代码
< filename >C.cpp < filename >C.h < filename >C.inl < filename >S.cpp < filename >S.h < filename >S.inl
用opendds_idl 编译< filename >idl,生成三个文件
目的: 1、生成OpenDDS需要打包和解包信息的序列化和键支持代码, 2、以及用于数据读者和写者类型支持代码
< filename >TypeSupport.idl
该IDl包括了PosTypeSupport, PosDataWriter 和PosDataReader的接口定义
< filename >TypeSupportImpl.h < filename >TypeSupportImpl.cpp
内容: cpp文件实现了IDL数据类型的定义 cpp文件实现了新生成的IDL数据据类型的发布、接收数据样本的接口
用tao_idl编译< filename >TypeSupport.idl生成文件6个文件
< filename >TypeSupport.idlC.cpp < filename >TypeSupport.idlC.h < filename >TypeSupport.idlC.inl < filename >TypeSupport.idlS.cpp < filename >TypeSupport.idlS.h < filename >TypeSupport.idlS.inl
实际操作过程中
方法二
使用ACE的MPC(MakeProjectCreator)工具
编写
< filename >idl
编写
< filename >mpc
执行编译脚本
perl mwc.pl -type vc9
实际方法
编写
< filename >idl
用$ACE_ROOT/bin/tao_idl编译< filename >idl生成文件6个文件
生成数据在网络上传输时打包解包的代码
< filename >C.cpp < filename >C.h < filename >C.inl
客户端代码
< filename >S.cpp < filename >S.h < filename >S.inl
服务器
用opendds_idl 编译< filename >idl,生成三个文件
目的: 1、生成OpenDDS需要打包和解包信息的序列化和键支持代码, 2、以及用于数据读者和写者类型支持代码
< filename >TypeSupport.idl
该IDl包括了PosTypeSupport, PosDataWriter 和PosDataReader的接口定义
< filename >TypeSupportImpl.h < filename >TypeSupportImpl.cpp
内容: cpp文件实现了IDL数据类型的定义 cpp文件实现了新生成的IDL数据据类型的发布、接收数据样本的接口
编写
< filename >mpc
执行编译脚本
perl mwc.pl -type vc9
这一步很重要生成工程框架
用tao_idl编译< filename >TypeSupport.idl生成文件6个文件
< filename >TypeSupport.idlC.cpp < filename >TypeSupport.idlC.h < filename >TypeSupport.idlC.inl < filename >TypeSupport.idlS.cpp < filename >TypeSupport.idlS.h < filename >TypeSupport.idlS.inl
子主题
mpc
project(*idl): dcps { // This project ensures the common components get built first. TypeSupport_Files { Demo.idl } custom_only = 1 }
组成
TypeSupport_Files部分
TypeSupport_Files部分告诉MPC,使用opendds_idl编译器从Demo.idl中生成类型支持文件
浮动主题
浮动主题
ps
查看编译器版本信息
cl-Bv
主题
主题
中心主题
安装
dds
应用
编译
不生成
publisher
不知道啥原因
一般来说应该时直接生成代码
2022年3月24日
过程
环境搭建
安装vs2017
只能装activeperl
准备
下载ace_tao
解压
设置环境变量
ACE_ROOT
TAO_ROOT
path
下载opendds
解压
DDS_ROOT
path
编译ace_tao
下载ace_tao
解压
添加config.h文件
#include "ace/config-win32.h"
%ACE_ROOT%\ace
编译代码
./ACE_vs20**.sln
重定向
编译
./Tao/TAO_ACE_vs20**.sln
重定向
编译
编译opendds
下载opendds
使用vs2017开发人员提示符执行configure
生成vs2017工程
vs2017打开工程
重定向
编译
示例代码
编写idl文件
tao_idl *.idl
opendds_idl *.idl
编写mpc文件
*.idl工程
subscribe工程
publish工程
使用wmc.pl编译
生成工程框架
编译*。idl工程
生成
添加pub
添加sb
添加publislistener
添加sub.ini文件
添加sub.ini文件
深入了解
idl文件结构
2022年3月31日
编译库
寻找可供生成库的工程样例
构建
编写idl
生成
生成dll的mpc文件
2022年3月30日
编译库
构建
构建可生成dll的目录
编译
问题
2022年3月31日
重新安装
安装vs2015
编译ace_tao.6.5.10
编译opendds_3.12
编译库
解决初始化错误问题
1是忘记把*.ini文件放入运行目录,导致运行崩溃就
2是有些变量需要全局化处理