DDS (Data Distribution Service) 数据分发服务-规范中文翻译_004
DDS (Data Distribution Service) 数据分发服务-规范中文翻译_004
2.以数据为中心的订阅发布(DCPS)
2.2 平台无关模型(Platform Independent Model ,PIM)
2.2.2 平台无关模型(PIM)描述
DCPS由五大模块组成。
图 2 4 DCPS模块分类
- 基础设施模块定义了抽象类和由其他模块细化的接口。它还为中间件提供了两种交互方式(基于通知和等待)的支持。
- 域模块包含DomainParticipant类,它充当中间件服务的入口点,并充当许多类的工厂。DomainParticipant类还充当组成服务的其他对象的容器。
- 主题定义模块包含Topic,ContentFilteredTopic,MultiTopic类和TopicListener接口,也就是主题定义模块包含应用程序所需用来定义Topic对象并将QoS策略附加到对象上的全部内容。
- 发布模块包含Publisher和DataWriter类以及PublisherListener和DataWriterListener接口,也就是包含发布端所需的全部内容。
- 订阅模块包含Subscriber,DataReader,ReadCondition和QueryCondition类,以及SubscriberListener和DataReaderListener接口,也就是包含订阅方所需的全部内容。
在PIM级别,我们选择将任何实体建模为类或接口。然而值得注意的是这并不意味着它们中的任何一个都将被转换为IDL接口。通常我们选择将应用程序必须扩展的实体建模为接口,以便与中间件服务进行交互。其余实体已建模为类。
2.2.2.1 基础设施模块
图 2 5 DCPS基础设施模块的类模型
DCPS基础设施模块由以下类组成:
- Entity
- DomainEntity
- QosPolicy
- Listener
- Status
- WaitSet
- Condition
- GuardCondition
- StatusCondition
2.2.2.1.1 Entity类
此类是支持QoS策略,监听器和状态条件的所有DCPS对象的抽象基类。
StatusKind是一个枚举类型,用于标识每个具体的Status类型。
以下子条款详细说明了Entity类的所有方法。
2.2.2.1.1.1 set_qos(抽象方法)
此方法用于设置实体的QoS策略,必须由每个派生的实体类(DomainParticipant,Topic,Publisher,DataWriter,Subscriber,DataReader)提供,以便可以设置对每个实体有意义的策略。
通过qos_list参数指定的策略集应用于现有QoS之上,替换先前设置的任何策略值。
如2.2.3支持的QoS所述,中某些策略是“不可变的”,它们只能在创建实体时设置,或者在实体启用之前设置。如果在实体启用后调用set_qos尝试更改 “不可变”策略的值,此操作将失败并返回IMMUTABLE_POLICY。
2.2.3支持的QoS小节还描述了QoS策略的某些值可能与其他策略的设置不兼容。如果通过set_qos方法指定一组QoS值,与现有QoS值组合将导致不一致的策略,则set_qos方法也将失败。在这种情况下,返回值为INCONSISTENT_POLICY。
如果应用程序为服务不支持的QoS策略提供非默认值,则set_qos方法将失败并返回UNSUPPORTED。
仅当set_qos方法成功才会更改现有策略集,此时返回OK。在所有其他情况下,没有任何策略会被修改。
每个派生的实体类(DomainParticipant,Topic,Publisher,DataWriter,Subscriber,DataReader)都具有相应的QoS特殊值(PARTICIPANT_QOS_DEFAULT,PUBLISHER_QOS_DEFAULT,SUBSCRIBER_QOS_DEFAULT,TOPIC_QOS_DEFAULT,DATAWRITER_QOS_DEFAULT,DATAREADER_QOS_DEFAULT)。此特殊值可用作set_qos方法的参数,意味着应更改实体的QoS以匹配实体工厂中的当前默认QoS集。set_qos无法修改不可变的QoS,因此成功返回值表明已修改实体的可变QoS以匹配实体工厂的当前默认值。
除标准返回错误代码外,还可能返回错误代码:INCONSISTENT_POLICY,IMMUTABLE_POLICY。
2.2.2.1.1.2 get_qos(抽象方法)
此方法允许访问实体的现有QoS策略集,必须由每个派生的实体类(DomainParticipant,Topic,Publisher,DataWriter,Subscriber,DataReader)提供,以便获取对特定实体有意义的策略。
2.2.2.1.1.3 set_listener(抽象方法)
此方法在实体上安装监听器。只有在特定掩码代表的通信状态更改时才会调用监听器。
允许使用’nil’作为监听器的值。“nil”监听器不执行任何操作。
每个实体只能附加一个监听器。如果已经设置了监听器,set_listener方法将使用新的替换它。因此,如果将值“nil”当做set_listener方法的监听器参数,则将删除任何现有监听器。
此方法必须由每个派生的实体类(DomainParticipant,Topic,Publisher,DataWriter,Subscriber,DataReader)提供,以便监听器具有适合特定实体的具体类型。
2.2.2.1.1.4 get_listener(抽象方法)
此方法允许访问附加到实体的现有监听器。
此方法必须由每个派生的实体类(DomainParticipant,Topic,Publisher,DataWriter,Subscriber,DataReader)提供,以便监听器具有适合特定实体的具体类型。
2.2.2.1.1.5 get_statuscondition
此方法允许访问与实体关联的状态条件(2.2.2.1.9,StatusCondition类),可以将返回的条件添加到等待集(2.2.2.1.6,WaitSet类),以便应用程序可以等待影响实体的特定状态的更改。
2.2.2.1.1.6 get_status_changes
此方法将检索实体中“已触发”的通信状态列表。即自上次应用程序读取状态以来其值更改的状态列表。 2.2.4.2状态变化给出了通信状态“触发”的准确定义。
首次创建实体或未启用实体时,所有通信状态都处于“未触发”状态,因此get_status_changes方法返回的列表将为空。
get_status_changes方法返回的状态列表是指在实体自身触发的状态,不包括适用于包含实体的状态。
2.2.2.1.1.7 enable
此方法启用实体。可以启用或禁用实体对象。这由实体相应的工厂上ENTITY_FACTORY Qos策略(2.2.3.20,ENTITY_FACTORY)的值控制。
默认情况下,ENTITY_FACTORY的设置是不必在新创建的实体上显式调用enable方法(请参阅2.2.3.20,ENTITY_FACTORY)。
enable方法是幂等的。在已启用的Entity上调用enable将返回OK并且无效。
如果尚未启用实体,则可以在其上调用以下类型的操作:
- 设置或获取实体的QoS策略(包括默认QoS策略)和监听器的方法
- get_statuscondition
- “工厂”方法
- get_status_changes和其他获取状态方法(尽管已禁用的实体状态永远不会更改)
- “查找”操作
其他方法可以明确声明可以在禁用的实体上调用它们,这种情况不会返回错误返回值NOT_ENABLED。
通过工厂调用正确的方法来删除尚未启用的实体是合法的。
无论ENTITY_FACTORY Qos策略的设置如何,通过已禁用的工厂创建的实体都会被禁用。
在未启用工厂的实体上调用enable将失败并返回PRECONDITION_NOT_MET。
如果ENTITY_FACTORY QoS策略将autoenable_created_entities设置为TRUE,则工厂上的enable方法将自动启用从工厂创建的所有实体。
在启用实体之前,不会调用与实体关联的监听器。与未启用的实体关联的条件是“非活动”,即trigger_value == FALSE(请参阅2.2.4.4,条件和等待集)。
2.2.2.1.1.8 get_instance_handle
此方法返回表示实体的InstanceHandle_t。