DDS(Data Distribution Service)————Publisher(4) DataWriterQos的DeadlineQosPolicy与LivelinessQosPolicy详解
5.3.2.3 DeadlineQosPolicy
DeadlineQosPolicy
是DDS(Data Distribution Service)中的一种质量服务(QoS)策略,用于管理数据传输的时间约束。它定义了在特定时间间隔内,数据发布者(DataWriter)应向数据订阅者(DataReader)提供新数据的约束条件。该策略确保系统在时间敏感应用中保持数据的新鲜度和一致性。
其作用原理,就是接收方有一个定时器,当在这个时间内没有收到新的Data时,就会触发DataReader的Linstener,通过回调函数进行业务处理。
DeadlineQosPolicy
的属性是由数据类型eprosima::fastrtps::Duration_t
组成的
C + + 使用 {\color{green}C++使用} C++使用
DeadlineQosPolicy deadline;
/* create function 1 */
eprosima::fastrtps::Duration_t deadLineTime = eprosima::fastrtps::Duration_t(5,0);
deadline.period = deadLineTime;
/* create function 1 */
deadline.period.seconds = 5U;
deadline.period.nanosec = 0U;
dataWriterQos.deadline(deadline);
X M L 使用 {\color{green}XML使用} XML使用
<data_writer profile_name="writer_xml_conf_deadline_profile">
<qos>
<deadline>
<period>
<sec>1</sec>
<nanosec>0</nanosec>
</period>
</deadline>
</qos>
</data_writer>
<data_reader profile_name="reader_xml_conf_deadline_profile">
<qos>
<deadline>
<period>
<sec>1</sec>
<nanosec>0</nanosec>
</period>
</deadline>
</qos>
</data_reader>
5.3.2.4 LivelinessQosPolicy
LivelinessQosPolicy
是DDS(Data Distribution Service)中的一种QoS策略,用于确保参与者(participant)、发布者(publisher)和订阅者(subscriber)之间的连接保持活跃,监控它们的存活状态。通过这个策略,DDS可以检测出发布者和订阅者是否在指定时间内保持活跃,从而采取适当的动作。
L i v e l i n e s s Q o s P o l i c y 的作用 {\color{blue}LivelinessQosPolicy 的作用} LivelinessQosPolicy的作用
LivelinessQosPolicy
的主要作用是保证系统中各个实体在预定时间内保持活跃,并通知订阅者在发布者不再活跃时采取相应的措施。具体作用包括:
- 发布者存活监控:确保数据发布者(DataWriter)在规定的时间内进行声明,表明它依然活跃。
- 订阅者通知:当发布者在规定时间内未声明存活时,订阅者(DataReader)会收到通知。
- 资源管理:有助于资源的有效管理和及时回收。
L i v e l i n e s s Q o s P o l i c y 的属性 {\color{blue}LivelinessQosPolicy 的属性} LivelinessQosPolicy的属性
LivelinessQosPolicy
包含两个主要属性:
- kind:
- 表示发布者如何声明它们的活跃状态。有以下几种类型:
AUTOMATIC_LIVELINESS_QOS
: 系统自动管理存活状态。MANUAL_BY_PARTICIPANT_LIVELINESS_QOS
: 通过参与者声明存活。MANUAL_BY_TOPIC_LIVELINESS_QOS
: 通过具体的主题声明存活。
- 表示发布者如何声明它们的活跃状态。有以下几种类型:
- lease_duration:
- 表示声明活跃的时间间隔。发布者需要在这个时间间隔内声明存活,否则系统会认为它不再活跃。 其实也就是最后一次确认的间隔,若大于这个间隔则认为是失活 {\color{red}其实也就是最后一次确认的间隔,若大于这个间隔则认为是失活} 其实也就是最后一次确认的间隔,若大于这个间隔则认为是失活
- 类型为
Duration_t
。
- announcement_period
- 由DataWriter发送的连续活动消息之间的时间间隔 当 k i n d 的类型为 A U T O M A T I C L I V E L I N E S S Q O S 或者 M A N U A L B Y P A R T I C I P A N T L I V E L I N E S S Q O S 时, a n n o u n c e m e n t p e r i o d 要小于 l e a s e d u r a t i o n n {\color{red}当kind的类型为AUTOMATIC_LIVELINESS_QOS或者MANUAL_BY_PARTICIPANT_LIVELINESS_QOS时,announcement_period 要小于 lease_durationn} 当kind的类型为AUTOMATICLIVELINESSQOS或者MANUALBYPARTICIPANTLIVELINESSQOS时,announcementperiod要小于leasedurationn
5.3.2.4.1 LivelinessQosPolicyKind
在DDS(Data Distribution Service)中,LivelinessQosPolicyKind
定义了发布者(DataWriter)声明其存活状态的方式。通过设置不同的 LivelinessQosPolicyKind
,可以控制发布者如何以及何时向订阅者(DataReader)声明其存活状态。
- AUTOMATIC_LIVELINESS_QOS
定义
- 系统自动管理发布者的存活声明。
- 发布者无需显式地声明其存活状态,DDS 会自动处理。
机制
- DDS 内部机制会周期性地发送信号,以保证订阅者知道发布者是活跃的。
- 这种方式适用于对实时性要求不高的场景,因为系统自动处理带来了额外的延迟和不确定性。
使用场景
- 适用于简单的系统或非实时要求的应用。
- 减少了开发者的工作量,因为系统自动管理存活状态。
- MANUAL_BY_PARTICIPANT_LIVELINESS_QOS
定义
- 参与者(DomainParticipant)显式声明其所有发布者的存活状态。
- 发布者通过其所属的参与者共同声明存活状态。
机制
- 通过调用
DomainParticipant
的assert_liveliness()
方法或者通过发送消息隐式的声明存活状态。 - 一次声明将更新所有隶属于该参与者的发布者的存活状态。
使用场景
- 适用于多个发布者共用一个参与者的场景。
- 有助于减少系统负载,因为一个声明可以更新多个发布者的状态。
3. MANUAL_BY_TOPIC_LIVELINESS_QOS
定义
- 每个发布者(DataWriter)独立声明其存活状态。
- 发布者通过显式调用自身的
assert_liveliness()
方法来声明存活状态。
机制
- 通过调用发布者的
assert_liveliness()
方法或者通过发送消息隐式的来声明存活状态。 - 每个发布者独立管理其存活声明,不依赖于参与者或其他发布者。
使用场景
- 适用于对存活状态有严格要求的实时系统。
- 有助于精细控制每个发布者的存活状态。
D a t a W r i t e r 与 D a t a R e a d e r 之间的兼容性保障: {\color{red}DataWriter与DataReader之间的兼容性保障:} DataWriter与DataReader之间的兼容性保障:
-
DataWriter
的kind
级别应该大于等于DataReader
的kind
级别 -
并且不同种类之间的顺序为:
|AUTOMATIC_LIVELINESS_QOS-api| < |MANUAL_BY_PARTICIPANT_LIVELINESS_QOS-api| < |MANUAL_BY_TOPIC_LIVELINESS_QOS-api|
-
以下列出了相关的可能性:
5.3.2.4.2 LivelinessQosPolicy使用示例
C + + {\color{green}C++} C++
Templater tempurate = {1,15};
LivelinessQosPolicy liveLinessQos;
/* setting LivelinessQosPolicy */
liveLinessQos.kind = MANUAL_BY_TOPIC_LIVELINESS_QOS;
liveLinessQos.lease_duration = {10,0};
liveLinessQos.announcement_period = {5,0};
dataWriterQos.liveliness(liveLinessQos);
/* keep alive by senting data value */
datawriter->write(&tempurate);
/* keep alive by api */
datawriter->assert_liveliness();
X M L {\color{green}XML} XML
<data_writer profile_name="writer_xml_conf_liveliness_profile">
<qos>
<liveliness>
<announcement_period>
<sec>0</sec>
<nanosec>1000000</nanosec>
</announcement_period>
<lease_duration>
<sec>1</sec>
</lease_duration>
<kind>AUTOMATIC</kind>
</liveliness>
</qos>
</data_writer>
<data_reader profile_name="reader_xml_conf_liveliness_profile">
<qos>
<liveliness>
<lease_duration>
<sec>1</sec>
</lease_duration>
<kind>AUTOMATIC</kind>
</liveliness>
</qos>
</data_reader>