Fast DDS之UDP通信


本文主要记录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_BUILTINsetup_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对象的创建

应用程序指定

  1. 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>
  1. 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->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值