新浪博客

OpenDDS之Qos策略(1)

2014-09-16 19:21阅读:
OpenDDSQos策略
简介
OpenDDSDDS规范(OMG Document formal/07-01-01)定义的22QoS策略全部支持。
应用程序通过参与者的QoS约束,来指定需要的行为,然后由DDS的服务决定如何实现这些行为。这些策略应用于所有DDS实体(主题、数据写者、数据读者、发布者、订阅者、域参与者),但不是所有的策略都适用于所有的实体类型。
发布者和订阅者通过RxO模式相匹配。订阅者请求一组策略,发布者提供一组QoS策略给潜在的订阅者。然后DDS试图将要求的策略和提供的策略相匹配,如果这些策略相匹配则将它们关联起来。
在前面的《基于OpenDDS的应用程序开发
pan >》博文中,我们采用了默认的QoS策略。接下来的几篇博文将详细介绍每个QoS策略的相关细节。
Qos策略
每个策略都定义了自己的结构。每个实体都支持策略的一个子集,并且定义了一个由被支持的策略结构体所组成的QoS结构体。一个给定实体的可用策略集不会受到QoS结构体中包含的策略结构体的限制。例如,发布者的QoS结构体的IDL定义格式如下:
module DDS {
struct PublisherQos {
PresentationQosPolicy presentation;
PartitionQosPolicy partition;
GroupDataQosPolicy group_data;
EntityFactoryQosPolicy entity_factory;
};
};
设置一个策略就像获得一个已经有默认值的结构体一样简单,并在必要的时候修改个别策略。然后将QoS 结构体应用到实体中(通常是在实体被建立的时候)。我们将在后续章节中详细说明如何获取各个实体的缺省QoS策略。
应用程序可以通过调用set_qos()操作来改变任意实体的QoS策略。如果该QoS策略是可以改变的,Qos策略变得不再兼容,则现有的连接将会移除,否则,如果该Qos策略变得兼容了,将会有新的连接添加。该改变将会通过相应的实体调用QoS更新操作通知DCPSInfoRepoDCPSInfoRepo将会依据Qos策略规范来重新检测兼容性和关联性,如果兼容性检测失败,set_qos()调用将会返回错误,关联性检测将以移除现有的连接或增加新的连接为结果。
如果试图去改变一个不能改变的QoS策略,set_qos()操作将会返回DDS::RETCODE_IMMUTABLE_POLICY。可以改变的QoS策略有如下几个:USER_DATATOPIC_DATA,LIFESPANOWNERSHIP_STRENGTHTIME_BASED_FILTERENTITY_FACTORYWRITER_DATA_LIFECYCLEREADER_DATA_LIFECYCLE,它们不需要重新检测兼容性和关联性。QoS策略DEADLINELATENCY_BUDGET需要重新检测相容性,关联性不需要。QoS策略PARTITION 恰好相反,只需重新检测关联性,对于兼容性则不需重新检测。
默认Qos策略值
应用程序获取实体的默认QoS策略,通过实例化该实体的一个对应的Qos结构体,然后调用实体工厂的get_default_entity_qos()操作将它获取回来(例如,对于发布者和订阅者,可以通过使用域参与者来获取默认QoS)。
下面的示例代码说明了对于发布者、订阅者、主题、域参与者、数据写者、数据读者如何获取默认QoS
// Get default Publisher QoS from a DomainParticipant:
DDS::PublisherQos pub_qos;
DDS::ReturnCode_t ret;
ret = domain_participant->get_default_publisher_qos(pub_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << 'Could not get default publisher QoS' << std::endl;
}
// Get default Subscriber QoS from a DomainParticipant:
DDS::SubscriberQos sub_qos;
ret = domain_participant->get_default_subscriber_qos(sub_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << 'Could not get default subscriber QoS' << std::endl;
}
// Get default Topic QoS from a DomainParticipant:
DDS::TopicQos topic_qos;
ret = domain_participant->get_default_topic_qos(topic_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << 'Could not get default topic QoS' << std::endl;
}
// Get default DomainParticipant QoS from a DomainParticipantFactory:
DDS::DomainParticipantQos dp_qos;
ret = domain_participant_factory->get_default_participant_qos(dp_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << 'Could not get default participant QoS' << std::endl;
}
// Get default DataWriter QoS from a Publisher:
DDS::DataWriterQos dw_qos;
ret = pub->get_default_datawriter_qos(dw_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << 'Could not get default data writer QoS' << std::endl;
}
// Get default DataReader QoS from a Subscriber:
DDS::DataReaderQos dr_qos;
ret = pub->get_default_datareader_qos(dr_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << 'Could not get default data reader QoS' << std::endl;
}
下面的表格总结了在OpenDDS中用到的每一种实体类型的默认QoS策略。
01 默认域参与者QoS策略
策略
成员
默认值
USER_DATA
value
(not set)
ENTITY_FACTORY
autoenable_created_entities
true

02默认主题QoS策略
策略
成员
默认值
TOPIC_DATA
value
(not set)
DURABILITY
kind
VOLATILE_DURABILITY_QOS
DURABILITY_SERVICE
service_cleanup_delay.sec
service_cleanup_delay.nanosec
history_kind
history_depth
max_samples
max_instances
max_samples_per_instance
DURATION_ZERO_SEC
DURATION_ZERO_NSEC
KEEP_LAST_HISTORY_QOS
1
LENGTH_UNLIMITED
LENGTH_UNLIMITED
LENGTH_UNLIMITED
DEADLINE
period.sec
period.nanosec
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
LATENCY_BUDGET
duration.sec
duration.nanosec
DURATION_ZERO_SEC
DURATION_ZERO_NSEC
LIVELINESS
kind
lease_duration.sec
lease_duration.nanosec
AUTOMATIC_LIVELINESS_QOS
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
RELIABILITY
kind
max_blocking_time.sec
max_blocking_time.nanosec
BEST_EFFORT_RELIABILITY_QOS
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
DESTINATION_ORDER
kind
BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS
HISTORY
kind
depth
KEEP_LAST_HISTORY_QOS
1
RESOURCE_LIMITS
max_samples
max_instances
max_samples_per_instance
LENGTH_UNLIMITED
LENGTH_UNLIMITED
LENGTH_UNLIMITED
TRANSPORT_PRIORITY
value
0
LIFESPAN
duration.sec
duration.nanosec
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
OWNERSHIP
kind
SHARED_OWNERSHIP_QOS

03默认发布者QoS策略
策略
成员
默认值
PRESENTATION
access_scope
coherent_access
ordered_access
INSTANCE_PRESENTATION_QOS
0
0
PARTITION
name
(empty sequence)
GROUP_DATA
value
(not set)
ENTITY_FACTORY
autoenable_created_entities
true

04默认订阅者QoS策略
策略
成员
默认值
PRESENTATION
access_scope
coherent_access
ordered_access
INSTANCE_PRESENTATION_QOS
0
0
PARTITION
name
(empty sequence)
GROUP_DATA
value
(not set)
ENTITY_FACTORY
autoenable_created_entities
true

05默认数据写者QoS策略
策略
成员
默认值
DESTINATION_ORDER
kind
BY_RECEPTION_TIMESTAMP_
DESTINATIONORDER_QOS
HISTORY
kind
depth
KEEP_LAST_HISTORY_QOS
1
RESOURCE_LIMITS
max_samples
max_instances
max_samples_per_instance
LENGTH_UNLIMITED
LENGTH_UNLIMITED
LENGTH_UNLIMITED
TRANSPORT_PRIORITY
value
0
LIFESPAN
duration.sec
duration.nanosec
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
USER_DATA
value
(not set)
OWNERSHIP
kind
SHARED_OWNERSHIP_QOS
OWNERSHIP_STRENGTH
value
0
WRITER_DATA_LIFECYCLE
autodispose_unregistered_instances
1
DURABILITY
kind
VOLATILE_DURABILITY_QOS
DURABILITY_SERVICE
service_cleanup_delay.sec
service_cleanup_delay.nanosec
history_kind
history_depth
max_samples
max_instances
max_samples_per_instance
DURATION_ZERO_SEC
DURATION_ZERO_NSEC
KEEP_LAST_HISTORY_QOS
1
LENGTH_UNLIMITED
LENGTH_UNLIMITED
LENGTH_UNLIMITED
DEADLINE
period.sec
period.nanosec
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
LATENCY_BUDGET
duration.sec
duration.nanosec
DURATION_ZERO_SEC
DURATION_ZERO_NSEC
LIVELINESS
kind
lease_duration.sec
lease_duration.nanosec
AUTOMATIC_LIVELINESS_QOS
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
RELIABILITY
kind
max_blocking_time.sec
max_blocking_time.nanosec
RELIABLE_RELIABILITY_QOS
0
100000000 (100 ms)

06默认数据读者QoS策略
策略
成员
默认值
DURABILITY
kind
VOLATILE_DURABILITY_QOS
DEADLINE
period.sec
period.nanosec
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
LATENCY_BUDGET
duration.sec
duration.nanosec
DURATION_ZERO_SEC
DURATION_ZERO_NSEC
LIVELINESS
kind
lease_duration.sec
lease_duration.nanosec
AUTOMATIC_LIVELINESS_QOS
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
RELIABILITY
kind
max_blocking_time.sec
max_blocking_time.nanosec
BEST_EFFORT_RELIABILITY_QOS
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
DESTINATION_ORDER
kind
BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS
HISTORY
kind
depth
KEEP_LAST_HISTORY_QOS
1
RESOURCE_LIMITS
max_samples
max_instances
max_samples_per_instance
LENGTH_UNLIMITED
LENGTH_UNLIMITED
LENGTH_UNLIMITED
USER_DATA
value
(not set)
OWNERSHIP
kind
SHARED_OWNERSHIP_QOS
TIME_BASED_FILTER
minimum_separation.sec
minimum_separation.nanosec
DURATION_ZERO_SEC
DURATION_ZERO_NSEC
READER_DATA_LIFECYCLE
autopurge_nowriter_samples_delay.sec
autopurge_nowriter_samples_delay.nanosec
autopurge_disposed_samples_delay.sec
autopurge_disposed_samples_delay.nanosec
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC
DURATION_INFINITY_SEC
DURATION_INFINITY_NSEC

我的更多文章

下载客户端阅读体验更佳

APP专享