# DestinationOrderQoS

# 功能介绍

当多个 datawriter 为同一个主题发送数据时,datareader 的应用程序接收来自不同 datawriter 的数据的顺序是由 write_w_timestamp()时间戳参数决定,时间戳参数大在相对应时间戳小后面接收。

此策略控制每个订阅者如何解析运行在不同节点上的多个 datawriter(可能与不同的 publisher 相关联)写入的数据实例的最终值。因此当 datawriter 停止向同一主题发送更改时,所有应用程序将最终具有相同的状态。

每个 DDS 示例包括一个时间戳:源时间戳,源时间戳在写入数据时由 DataWriter 应用程序记录。

# 兼容性

当且仅当不等式“写者的 DestinationOrderQoSPolicyKind >= 读者的 DestinationOrderQoSPolicyKind”为“真”时,提供的值被认为与所请求的值兼容。为了使这一不等式有意义,DestinationOrderQoSPolicyKind 的值被认为是有序的,定义如下:BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS<

BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS。

所以要生效需要在 datawriter 端使用的 kind 值应该更高或者相等于 datareader 端。

DestinationOrderQoS 需要在 OwnerShipQoS 设置为共享 Shared 的情况下才能正常使用。

OwnerShipQoS: 此策略控制 DDS 服务是否允许多个 DataWriter 对象更新数据的同一实例。Kind 模式如下:

SHARED:接收者接收所有数据发送者发送的数据;

EXCLUSIVE:接收者只接收一个数据发送者发送的数据。由 OWNERSHIP_STRENGTH 策略决定哪个发送者有效

OWNERSHIP_STRENGTH:整数:value。在 OWNERSHIP 策略设置为独占式时,使用本策略来声明多个数据发送者的权重,以决策接收者以谁的数据为准。

# 使用方法

DestinationOrderQoSPolicy 成员列表如下表。

表 1 DestinationOrderQoSPolicy 成员列表
类型 字段名 描述
Destination- Order- QoSPolicy kind 可以是: BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS。 这里我们定义第一个字段的值比第二个字段更小,在使用的时候一般把 datawriter 里的值设置为第二个字段,使他保持>=datareader 里的值,满足这个条件便才能让该 QoS 生效。

# DataWriter 端

1) QoS 赋值

对 destination_order 的 kind 进行赋值,赋值给 QoS 后,将 QoS 作为参数传入 create_datawriter()。

图 1 DataWriter 的 QoS 赋值

# DataReader 端

1) QoS 赋值

对 destination_order 的 kind 进行赋值,赋值给 QoS 后,将 QoS 作为参数传入 create_datareader()。

图 2 DataReader 的 QoS 赋值

# 效果展示

1) 适用场景

您有两台以上的设备需要对同一个主题的 reader 进行发数据,同时对数据到达有先后要求,则可以使用该 QoS 去控制以达到预期。

2) 使用例子

我们设置两个程序,一个程序发送的时间戳纳秒数为 3000,一个程序发送的时间戳纳秒数为 9000。

我们先启动一个订阅程序和一个时间戳为 9000 的发布程序,结果如下图所示。

图 3 时间戳为 9000 的通信

这次我们启动一个订阅程序,先启动一个时间戳为 9000 的发布程序,接收方会先接收到一包 9000 的数据,后启动一个时间戳为 3000 的发布程序,之后订阅方都会先接收到 3000 的数据再接收 9000 的数据,运行结果如下图所示。

图 4 时间戳 9000 和 3000 的与发布通信/interface/overview.html)