eProsima Extensions
eProsima 提供的 QoS(Quality of Service)策略扩展使得用户能够修改 RTPS 层的可配置设置。以下是一些关键的 QoS 策略扩展:
- DataSharingQosPolicy
- DisablePositiveACKsQosPolicy
- RTPSReliableReaderQos
- RTPSReliableWriterQos
- FlowControllersQos
- ParticipantResourceLimitsQos
- PropertyPolicyQos
- PublishModeQosPolicy
- ReaderResourceLimitsQos
- WriterResourceLimitsQos
- RTPSEndpointQos
- ThreadSettings
- TransportConfigQos
- WireProtocolConfigQos
DataSharingQosPolicy
该额外的 QoS 策略允许配置数据共享交付通信方式,具体可以参考“数据共享交付”部分,以获取其功能描述。
QoS 策略数据成员列表
数据成员 | 类型 | 访问器 | 默认值 |
---|---|---|---|
数据共享种类 | DataSharingKind | kind() | AUTO |
共享内存目录 | string | shm_directory() | 空字符串 |
最大域号 | uint32_t | max_domains() | 0(无限制) |
数据共享域 ID 列表 | vector |
domain_ids() | 空 |
数据共享监听线程设置 | ThreadSettings | data_sharing_listener_thread() |
数据共享种类: 指定数据共享交付的行为。具体值及其效果见 DataSharingKind
。
共享内存目录: 用于映射文件的目录。如果未配置,则使用系统默认目录。
最大域号: 确定本地或远程端点中数据共享域 ID 的最大数量。与支持数据共享交付的远程端点之间会交换域 ID。如果该值小于任何远程端点 ID 列表的大小,则匹配可能会失败。值为零表示无限制。
数据共享域 ID: 当前 DataWriter 或 DataReader 配置的数据共享域 ID 列表。如果未提供,则系统将为当前机器创建一个唯一 ID。
数据共享监听线程设置: 专用于监听入站流量的数据共享线程的 ThreadSettings
。
注意:此 QoS 策略适用于
DataWriter
和DataReader
实体。它不能在启用状态下更改实体。
DataSharingKind
有三种可能的值(见 DataSharingKind
):
- OFF: 禁用数据共享交付。不执行任何使用数据共享交付功能的通信。
- ON: 手动启用数据共享交付。如果当前主题与数据共享交付不兼容,将出现错误。与至少分享一个数据共享域 ID 的远程实体进行通信时,将使用数据分享传递功能。
- AUTO: 如果当前主题与数据分享兼容,将激活;如果不兼容,则禁用。
数据分享配置辅助函数
为了设置数据分享传递配置,必须使用以下辅助成员函数之一,每个类型都有相应的方法:
函数 | 结果的数据分享种类 |
---|---|
automatic() | AUTO |
on() | ON |
off() | OFF |
可以通过 add_domain_id()
函数稍后添加这些助手函数中定义的数据分享域 IDs。当您添加新域 ID 时,会计入对 QosPolicy 的修改,因此必须在实体启用之前进行此操作。
示例代码
// 此示例使用 DataWriter,但也适用于 DataReader 实体
DataWriterQos writer_qos;
// 数据分享默认为 AUTO,这意味着如果主题兼容,将使用该特性。
// 如果未指定 Shared Memory 目录,则将使用默认路径。
writer_qos.data_sharing().on("/path/to/shared_memory/directory"); // 启用并指定目录
// 或者禁用它
writer_qos.data_sharing().off();
// 设置为自动,并定义两个用户自定义 IDs (也可用于 ON)
std::vector<uint16_t> ids;
ids.push_back(0x1234);
ids.push_back(0xABCD);
writer_qos.data_sharing().automatic(ids);
// 或逐个添加它们
writer_qos.data_sharing().add_domain_id(uint16_t(0x1234));
writer_qos.data_sharing().add_domain_id(uint16_t(0xABCD));
// 设置最大领域数为5,设置为0表示'无限'
writer_qos.data_sharing().set_max_domains(5);
// [可选] 监听线程的 ThreadSettings
writer_qos.data_sharing().data_sharing_listener_thread(eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});
// 使用修改后的 QoS 创建相应实体
writer_ = publisher_->create_datawriter(topic_, writer_qos);
以上就是关于 eProsima 的扩展、QoS 策略以及如何实现和配置这些策略的一些详细信息。这些机制可以帮助开发人员优化实时应用程序中的消息传递性能和可靠性。
内容由零声教学AI助手提供,问题来源于学员提问