Fastdds_ContentFilteredTopicExample_代码剖析1

       DDS(Data Distribution Service)是一个开放标准,定义了一种用于分布式系统中数据交换的中间件,由Object Management Group(OMG)定义。作为一个标准,它本身不涉及具体实现的性能和特性。这些由不同的实现提供商来决定。DDS的主要作用是在分布式系统中提供一种高效、灵活和可扩展的数据通信机制。具体来说,DDS的作用包括:

  • 数据发布-订阅

    • DDS基于发布-订阅模式,允许数据生产者(发布者)和数据消费者(订阅者)通过主题(Topic)进行解耦的通信。发布者发布数据,订阅者接收数据,而无需彼此直接通信。
  • 实时数据传输

    • DDS设计用于支持实时应用,能够处理低延迟、高吞吐量的数据传输需求。它适用于各种需要实时数据通信的领域,如航空航天、自动驾驶、工业自动化和军事系统。
  • QoS(Quality of Service)支持

    • DDS提供了丰富的QoS策略,允许用户根据应用需求配置数据传输的各个方面,如可靠性、持久性、历史记录、资源限制等。这些策略确保了系统能够满足特定的性能和可靠性要求。
  • 可扩展性和灵活性

    • DDS支持大规模分布式系统的扩展,能够处理成千上万个发布者和订阅者。其设计使得系统可以根据需要动态扩展或收缩。
  • 跨平台和互操作性

    • DDS作为一个标准,具有良好的跨平台支持和互操作性。不同的DDS实现可以在不同的操作系统和硬件平台上运行,并且能够互相通信

        FastDDS是DDS的一个具体实现,由eProsima开发。eProsima声称其实现具有高性能、低延迟和高吞吐量,适合实时应用。Fast DDS还提供了额外的工具和特性,如快速RTPS(Real-Time Publish-Subscribe)协议支持、监控工具和配置工具等。

        在本章中,将会对FastDDS提供的案例ContentFilteredTopicExample进行一个学习分享且对整体的代码进行一个大概的解释,并在后面几章深入各个模块分析。

        在DDS中,CustomFilter是一种机制,旨在为订阅者提供可以选择性地接收数据的服务。内容过滤主题(Content Filtered Topic)允许订阅者通过指定过滤条件,仅接收符合这些条件的数据样本。这样,订阅者不需要处理不相关的数据,减少了网络带宽处理资源的消耗。

        由于代码众多,我们仅给出关键代码,在main函数中,核心代码位于217-239行,代码如下:

    switch (type)
    {
        case 1:
        {
            // Initialize and run publisher application
            ContentFilteredTopicExamplePublisher mypub;
            if (mypub.init())
            {
                mypub.run(static_cast<uint32_t>(count), static_cast<uint32_t>(sleep));
            }
            break;
        }
        case 2:
        {
            // Initialize and run subscriber application
            ContentFilteredTopicExampleSubscriber mysub;
            if (mysub.init(custom_filter))
            {
                mysub.run();
            }
            break;
        }
    }

我们可以看见它是根据tpye来划分发布者和订阅者的,且只有订阅者可以使用数据过滤这个功能。在init中,是发布者的一个具体实现,代码如下:

        

bool ContentFilteredTopicExamplePublisher::init()
{
    // Initialize internal variables
    matched_ = 0;

    // Initialize data sample
    hello_.index(0);
    hello_.message("HelloWorld");

    // Set DomainParticipant name
    DomainParticipantQos pqos;
    pqos.name("Participant_pub");
    // Create DomainParticipant in domain 0
    participant_ = DomainParticipantFactory::get_instance()->create_participant(0, pqos);
    if (nullptr == participant_)
    {
        return false;
    }

    // Register the type
    type_.register_type(participant_);

    // Create the Publisher
    publisher_ = participant_->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr);
    if (nullptr == publisher_)
    {
        return false;
    }

    // Create the Topic
    topic_ = participant_->create_topic("HelloWorldTopic", type_->getName(), TOPIC_QOS_DEFAULT);
    if (nullptr == topic_)
    {
        return false;
    }

    // Create the DataWriter
    writer_ = publisher_->create_datawriter(topic_, DATAWRITER_QOS_DEFAULT, this);
    if (nullptr == writer_)
    {
        return false;
    }
    return true;
}

        我们可以看到,该代码是先初始化一个内部变量matched_,用于跟踪匹配的订阅者数量。之后初始化了消息对象。再然后设置了一个qos,并为DomainParticipantQos设置了名字用于识别和调试。值得注意的是,QoS(Quality of Service)策略,设置 DomainParticipant 的名字也是其中的一部分。这是因为 QoS 不仅仅是关于传输特性(如可靠性、延迟等),还包括了一些配置属性,这些属性有助于标识和管理参与者。设置名字是其中的一部分,因为名字在调试和监控时非常有用。再之后由工厂创建了域参与者,并且将数据类型type_注册到 DomainParticipant。这一步确保DDS系统知道如何处理这种数据类型。在之后由参与者创建了一个发布者和主体,再由发布者创建了数据写者,之后返回运行。在后续的章节中我们陆续深入以上的模块。

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值