本文主要记录Fast DDS中UDP通信的内容,包括UDP通信各中类对象的定义,关系,以及交互流程,并分析Fast DDS中UDP通信实现的优缺点,以及代码实现等。
创建和注册
UDP通信可以使用默认创建,也可以在应用层指定。
<<TODO 创建和注册时序图>>
默认创建
如果不做任何操作,RTPSParticipantAttributes::useBuiltinTransports
值默认为true,BuiltinTransports
默认值为DEFAULT
,在RTPSParticipantImpl的构造函数中创建:
if (m_att.useBuiltinTransports)
{
set_builtin_transports_from_env_var(m_att);
}
继续调用:
void RTPSParticipantAttributes::setup_transports(
fastdds::rtps::BuiltinTransports transports,
const fastdds::rtps::BuiltinTransportsOptions& options)
{
...
switch (transports)
{
case fastdds::rtps::BuiltinTransports::DEFAULT:
setup_transports_default(*this, intraprocess_only, options);
break;
...
}
useBuiltinTransports = false;
}
cmake中如果定义了宏SHM_TRANSPORT_BUILTIN
,setup_transports_default
中会创建两个transport:udpv4和shm,并将这两个transport添加到RTPSParticipantAttributes::userTransports
中保存
static void setup_transports_default(
RTPSParticipantAttributes& att,
bool intraprocess_only,
const fastdds::rtps::BuiltinTransportsOptions& options)
{
auto descriptor = create_udpv4_transport(att, intraprocess_only, options);
#ifdef SHM_TRANSPORT_BUILTIN
if (!intraprocess_only)
{
auto shm_transport = create_shm_transport(att, options);
// Use same default max_message_size on both UDP and SHM
shm_transport->max_message_size(descriptor->max_message_size());
att.userTransports.push_back(shm_transport);
}
#endif // ifdef SHM_TRANSPORT_BUILTIN
att.userTransports.push_back(descriptor);
}
这一步完成TransportDescriptorInterface
对象的创建
应用程序指定
- xml配置指定
<?xml version="1.0" encoding="UTF-8" ?>
<dds>
<profiles xmlns="http://www.eprosima.com">
<transport_descriptors>
<transport_descriptor>
<transport_id>udp_transport</transport_id>
<type>UDPv4</type>
<sendBufferSize>9216</sendBufferSize>
<receiveBufferSize>9216</receiveBufferSize>
<non_blocking_send>true</non_blocking_send>
<default_reception_threads>
<scheduling_policy>2</scheduling_policy>
<priority>2</priority>
<affinity>2</affinity>
<stack_size>2</stack_size>
</default_reception_threads>
<reception_threads>
<reception_thread port="12345">
<scheduling_policy>3</scheduling_policy>
<priority>3</priority>
<affinity>3</affinity>
<stack_size>3</stack_size>
</reception_thread>
</reception_threads>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="UDPParticipant">
<rtps>
<userTransports>
<transport_id>udp_transport</transport_id>
</userTransports>
<useBuiltinTransports>false</useBuiltinTransports>
</rtps>
</participant>
</profiles>
<dds>
- C++代码指定
DomainParticipantQos qos;
auto udp_transport = std::make_shared<UDPv4TransportDescriptor>();
udp_transport->sendBufferSize = 9216;
udp_transport->receiveBufferSize = 9216;
udp_transport->non_blocking_send = true;
udp_transport->default_reception_threads(eprosima::fastdds::rtps::ThreadSettings{
2, 2, 2, 2});
udp_transport->