加载中…
个人资料
lyingbo
lyingbo
  • 博客等级:
  • 博客积分:0
  • 博客访问:3,573
  • 关注人气:63
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OpenDDS之Qos策略(1)

(2014-09-16 19:21:22)
标签:

opendds开发

qos策略

策略的使用

策略的介绍

策略的说明

分类: DDS开发

OpenDDSQos策略

简介

OpenDDSDDS规范(OMG Document formal/07-01-01)定义的22QoS策略全部支持。

应用程序通过参与者的QoS约束,来指定需要的行为,然后由DDS的服务决定如何实现这些行为。这些策略应用于所有DDS实体(主题、数据写者、数据读者、发布者、订阅者、域参与者),但不是所有的策略都适用于所有的实体类型。

发布者和订阅者通过RxO模式相匹配。订阅者请求一组策略,发布者提供一组QoS策略给潜在的订阅者。然后DDS试图将要求的策略和提供的策略相匹配,如果这些策略相匹配则将它们关联起来。

在前面的《基于OpenDDS的应用程序开发》博文中,我们采用了默认的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

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有