在工作中遇到了fastdds向服务器发送消息后却没有及时收到回执,后面经过测试发现原因出现在DataWriter和DataReader的匹配速度过慢。比如为什么有的需要睡几十毫秒后消息才可以正常的发送和接收到,问题就是出在了匹配速度上。
为解决匹配速度带来的问题,我们可以修改qos,增大初次广播次数,以此来提高匹配的效果。
如下:
auto qos = DomainParticipantFactory::get_instance()->get_default_participant_qos();
std::string name = participantName + std::to_string(Tools::getEpochMs());
qos.name(name);
qos.wire_protocol().builtin.discovery_config.discoveryProtocol = eprosima::fastrtps::rtps::DiscoveryProtocol::SIMPLE;
qos.wire_protocol().builtin.avoid_builtin_multicast = true;
// 初始公告·「初始阶段」
qos.wire_protocol().builtin.discovery_config.initial_announcements.count = 50; // 初始公告次数
qos.wire_protocol().builtin.discovery_config.initial_announcements.period = eprosima::fastrtps::Duration_t(0, 100*1000*1000); // 100 ms
qos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocol = true; // 开启
qos.wire_protocol().builtin.discovery_config.m_simpleEDP.use_PublicationWriterANDSubscriptionReader = true;
qos.wire_protocol().builtin.discovery_config.m_simpleEDP.use_PublicationReaderANDSubscriptionWriter = true;
//「初始阶段结束后依赖leaseDuration进行通报」
qos.wire_protocol().builtin.discovery_config.leaseDuration = eprosima::fastrtps::c_TimeInfinite;
qos.wire_protocol().builtin.discovery_config.leaseDuration_announcementperiod.seconds = 0; // 通报周期要小于 Lease Duration
qos.wire_protocol().builtin.discovery_config.leaseDuration_announcementperiod.nanosec = 500 * 1000 * 1000;//500毫秒
在创建participant时我们将初次公告次数增加到50,初次公告时间为100毫秒。这样就可以大大提高匹配的成功率。后续初次公告结束后就会依赖与leaseDuration进行通报。