# DeadLineQoS

# 功能介绍

对于数据写者(DataWriter)来说,DeadLineQoS 是用户在数据写者端期望调用 write()接口使用的最长时间期限来发布新的 DDS 实例数据。 应用程序调用的 write()的速度可能比设置的 QoS 速度快。

对于数据读者(DataReader)来说,此 QoS 是用户在数据读者端期望接收最新的实例数据使用的最长时间期限。应用程序接收数据可能比设置的 QoS 速度快。

# 兼容性

开启服务后,会对写者和读者的 DeadLine 值进行比对检查,如果 DataWriter 的 DeadLine <= DataReader 的 DeadLine 则兼容,也就是说 DataReader 接收 DDS 样本的频率不能高于 DataWriter 发送这些样本的频率,如果截止日期不兼容,则不会进行沟通。

DeadLine 策略的设置必须与 TimeBasedFilterQoS 的设置保持一致。要使这两个政策保持一致,QoS 设置必须是:

deadline.period >= time_based_filter.minimum_separation

# 使用方法

DeadLineQoS 成员列表如下表。

表 1 DeadLineQoS 成员列表
类型 字段名 描述
Duration_t period 对于数据写者(DataWriter)来说:发送最新的数据实例与上一个旧实例之间相差的最长时间。 对于数据读者(DataReader)来说:接收最新的实例数据与上一个旧实例之间的最长时间。

# DataWrietr 端

1) 回调函数

该回调函数 myDataListener 继承 DDSDataWriterListener 类,并通过重写父类中的虚函数 on_offered_deadline_missed 来决定当写者没有在截止时间内写入新数据的话会做什么。该函数中有两个参数,一个是写者的指针,另一个是用于保存监听状态的地址。如下图所示。

图 1 DataWriter 的 DeadLine 回调

2) QoS 赋值

对 period 的 sec 赋秒数,对 period 的 nanosec 赋纳秒数;赋值给 QoS 后,将 QoS 作为参数传入 create_datawriter()。

创建上述回调函数指针,将该指针作为参数传入 create_datawriter()。如下图所示。

图 2 DataWriter 的 DeadLine 的 QoS 赋值

# DataReader 端

1) 回调函数

该回调函数 myDataListener 继承 DDSDataReaderListener 类,并通过重写父类的虚函数 on_requested_deadline_missed 来决定读者若没有在截止时间内收到数据的话会做什么。该函数中有两个参数,一个是读者的指针,另一个是用来保存监听状态的地址。如下图所示。

图 3 DataReader 的 DeadLine 的回调函数

2) QoS 赋值

对 period 的 sec 赋秒数,对 period 的 nanosec 赋纳秒数;赋值给 QoS 后,将 QoS 作为参数传入 create_datawriter()。

创建上述回调函数指针,将该指针作为参数传入 create_datawriter()。如下图所示。

图 4 DataReader 的 DeadLine 的 QoS 赋值

# 效果展示

1) 适用场景

您可以在系统运行的时候使用 DeadLineQoS 来检测系统何时超出设计规范,并在接收端采取适当的措施,以防在未收到数据的时候出现整个系统故障。对于数据没有预定时间的主题,截止日期设置为无限值。

2) 使用例子

假设您有一个时间关键的数据,应该至少每秒钟更新一次。在 DataWriter 和 DataReader 上都可以设置 DEADLINE 为 1 秒。如果在此时间内没有更新,DataReader 将获得 on_offered_deadline_missed()的 Listener 函数的回调,DataReader 将获得 on_requested_deadline_missed(),以便双方都能正确处理错误情况。

注意,在实际操作中,在发送数据和接收数据之间的时间会有延迟和抖动。因此,即使 DataWriter 精确地以 1 秒的间隔发送数据,DataReader 也可能不会精确地以 1 秒的间隔接收数据。更有可能的是,它将 DataReader 将在 1 秒内加上一小段可变时间内接收数据。因此,在选择 DeadLine 期限和 DataWriter 的实际更新期限时,您应考虑到这一现实情况,否则您的应用程序可能会收到错误的失败提示。

我们将 DataWriter 和 DataReader 的 DeadLine 都设置为 1 秒,正常发送三包,结果应该是接收和发送方都不会调用回调函数打印(抛开启动的误差时间),并有三包数据打印,结果如下图所示。

图 5 正常发送

我们将 DataWriter 和 DataReader 的 DeadLine 都设置为 1 秒,在发送方设置睡眠 2 秒,结果应该是接收和发送方有三包打印并伴随着三包回调函数的打印,结果如下图所示。

图 6 设置 2 秒睡眠