RTPSEndpointQos 解释
RTPSEndpointQos
是一个用于配置 RTPS(Real-Time Publish-Subscribe)端点的 QoS(Quality of Service)策略。该策略涉及诸如定位器列表、标识符以及历史内存管理策略等方面。
QoS 策略数据成员列表
以下是 RTPSEndpointQos
中的主要数据成员及其说明:
unicast_locator_list:
- 类型:
LocatorList
- 默认值:空列表
- 描述:定义与 DDS 实体相关联的单播定位器列表。DataReaders 和 DataWriters 默认继承 DomainParticipant 中设置的单播定位器列表,但可以通过此 QoS 进行更改。
- 类型:
multicast_locator_list:
- 类型:
LocatorList
- 默认值:空列表
- 描述:存储与 DDS 实体相关联的多播定位器列表。默认情况下,DataReaders 和 DataWriters 不使用任何多播定位器,但可以通过此 QoS 进行更改。
- 类型:
remote_locator_list:
- 类型:
LocatorList
- 默认值:空列表
- 描述:状态表示与 DDS 实体相关联的远程定位器列表。
- 类型:
external_unicast_locators:
- 类型:
ExternalLocators
- 默认值:空
- 描述:定义为与该 DDS 实体进行通信而宣布的外部定位器。
- 类型:
ignore_non_matching_locators:
- 类型:
bool
- 默认值:false
- 描述:定义是否忽略来自其他 DDS 实体的公告中不匹配本 DDS 实体宣布的任何定位器。
- 类型:
user_defined_id:
- 类型:
int16_t
- 默认值:-1
- 描述:建立用于静态端点发现的唯一标识符。
- 类型:
entity_id:
- 类型:
int16_t
- 默认值:-1
- 描述:用户可以为端点指定标识符。
- 类型:
history_memory_policy:
- 类型:
MemoryManagementPolicy
- 描述: 表示在处理 CacheChanges 时内存管理方式。默认设置为
PREALLOCATED_WITH_REALLOC_MEMORY_MODE
.
- 类型:
MemoryManagementPolicy 选项
有四种可能的内存管理策略可供选择:
PREALLOCATED_MEMORY_MODE:
- 设置每种数据类型的大小为最大值,具有最大的内存占用但最小的分配次数。
PREALLOCATED_WITH_REALLOC_MEMORY_MODE:
- 设置每种数据类型的大小为默认值,当到达更大的消息时需要重新分配。这会降低内存占用但增加分配次数。
DYNAMIC_RESERVE_MEMORY_MODE:
- 在消息到达时动态分配大小,占用最少内存但导致最高分配次数。
DYNAMIC_REUSABLE_MEMORY_MODE:
- 类似于 DYNAMIC_RESERVE_MEMORY_MODE,但已分配内存在未来消息中被重用。
示例代码
以下是一个 C++ 示例,展示如何使用 DataWriterQos
配置不同类型的 locators:
// 创建 DataWriter 的 QoS 对象
DataWriterQos writer_qos;
// 添加新的单播 locator,端口号为 7800
eprosima::fastdds::rtps::Locator_t new_unicast_locator;
new_unicast_locator.port = 7800;
writer_qos.endpoint().unicast_locator_list.push_back(new_unicast_locator);
// 添加新的多播 locator,IP 为 239.255.0.4,端口号为 7900
eprosima::fastdds::rtps::Locator_t new_multicast_locator;
eprosima::fastdds::rtps::IPLocator::setIPv4(new_multicast_locator, "239.255.0.4");
new_multicast_locator.port = 7900;
writer_qos.endpoint().multicast_locator_list.push_back(new_multicast_locator);
// 添加一个外部 locator,IP 为 100.100.100.10,端口号12345,掩码24,外部性1和成本0
eprosima::fastdds::rtps::LocatorWithMask external_locator;
external_locator.kind = LOCATOR_KIND_UDPv4;
external_locator.port = 12345;
external_locator.mask(24);
writer_qos.endpoint().external_unicast_locators[1][0].push_back(external_locator);
// 忽略不匹配的 locators
writer_qos.endpoint().ignore_non_matching_locators = true;
// 设置用户定义 ID 为3
writer_qos.endpoint().user_defined_id = 3;
// 设置实体 ID 为4
writer_qos.endpoint().entity_id = 4;
// 将历史内存策略从预先分配切换到动态保留模式
writer_qos.endpoint().history_memory_policy = eprosima::fastdds::rtps::DYNAMIC_RESERVE_MEMORY_MODE;
// 使用修改后的 QoS 创建相应实体
writer_ = publisher_->create_datawriter(topic_, writer_qos);
这个示例演示了如何配置多个不同类型的位置,以满足特定应用程序对通信方式和性能需求。
内容由零声教学AI助手提供,问题来源于学员提问