【Fast RTPS】发布-订阅层

eProsima Fast RTPS提供一个高级层发布-订阅层,这对于使用RTPS协议的抽象是简单的。通过使用这个层,您可以编写直接应用程序代码,同时让库负责较低级别的配置。

如何使用Publisher-Subscriber层

我将继续使用前一节编译的例子解释这一层如何工作?
第一步,创建一个Participant实例,其作为应用需要的发布-订阅的容器。对此,我们使用Domain,一个静态类管理RTPS实体。我们还需要为参与者传递一个配置结构体,现在保留其默认配置:

ParticipantAttributes participant_attr; //Configuration structure
Participant *participant = Domain::createParticipant(participant_attr);

默认配置提供了一组基本工作选项,其中包含用于通信的预定义端口。通过这个教程,你将学习如何调整eProsima Fast RTPS。

为了使用我们的主题,我们将使用fastrtpsgen产生的代码在Participant中登记这个主题。

HelloWorldPubSubType m_type; //Auto-generated type from FastRTPSGen
Domain::registerType(participant, &m_type);

一旦建立,在我们的participant中建立Publisher实例:

PublisherAttributes publisher_attr; //Configuration structure
PubListener publisher_listener; //Class that implements callbacks from the publisher
Publisher *publisher = Domain::createPublisher(participant, publisher_attr, &publisher_listener);

一旦publisher起作用,传递数据的简单程序:

HelloWorld sample; //Auto-generated container class for topic data from FastRTPSGen
sample.msg("Hello there!"); // Add contents to the message
publisher->write(&sample); //Publish

当事件发生时,这个publisher有一组可选回调函数被触发。例如:订阅开始监听我们的主题时。

为了应用这些回调,我们创建PubListener类,其从PublisherListener基本类继承而来。在创建Publisher时,给出这个类的实例。

class PubListener : public PublisherListener
{
    public:

        PubListener() {}
        ~PubListener() {}

        void onPublicationmatched(Publisher* pub, MatchingInfo& info)
        {
            //Callback implementation. This is called each time the Publisher finds a Subscriber on the network that listens to the same topic.
        }
};

Subscriber的创建和应用和Publisher一致。

SubscriberAttributes subscriber_attr; //Configuration structure
SubListener subscriber_listener; //Class that implements callbacks from the Subscriber
Subscriber *subscriber = Domain::createSubscriber(participant, subscriber_attr, &subscriber_listener);

当新消息被接收时,传递的消息在回调函数中被处理。

class SubListener: public SubscriberListener
{
    public:

        SubListener() {}

        ~SubListener() {}

        void onNewDataMessage(Subscriber * sub)
        {
            if(sub->takeNextData((void*)&sample, &sample_info))
            {
                if(sample_info.sampleKind == ALIVE)
                {
                    std::cout << "New message: " << sample.msg() << std::endl;
                }
            }
        }

        HelloWorld sample; //Storage for incoming messages

        SampleInfo_t sample_info; //Auxiliary structure with meta-data on the message
};

配置

eProsima Fast RTPS可以通过C++和XML文件被配置
下面仅仅讲述,C++配置方式:

Participant配置

Participant参与者可以通过ParticipantAttributes结构体被配置。createParticipant函数将接收配置结构体。

ParticipantAttributes participant_attr;

participant_attr.rtps.setName("my_participant");
participant_attr.rtps.builtin.domainId = 80;

Participant *participant = Domain::createParticipant(participant_attr);

常用配置选项:

  • Participant name:Participant的名字形成RTPS协议的元数据的一部分
participant_attr.rtps.setName("my_participant");
  • DomainId:如果它们参与者属于同一个Domain ID,则它们能相互通信。
participant_attr.rtps.builtin.domainId = 80;
  • Mutation Tries:读的物理端口可能已经被绑定。在这种情况下,参与者使用Mutation_tries属性去决定在失败之前尝试多少不同的通道。这些突变通道将修改这个定位信息。默认为100.
participant_attr.rtps.builtin.mutation_tries = 55;

Publisher and Subscriber配置

Publisher可以通过PublisherAttributes结构体进行配置,createPublisher接收这个结构体配置。Subscriber 可以通过SubscriberAttributes结构体进行配置,createSubscriber 接收这个结构体配置。

PublisherAttributes publisher_attr;
Publisher *publisher = Domain::createPublisher(participant, publisher_attr);

SubscriberAttributes subscriber_attr;
Subscriber *subscriber = Domain::createSubscriber(participant, subscriber_attr);

Topic information主题信息

Reliability可信赖度

History历史缓存

Durability稳定性

Deadline最终期限

当新样本的频率低于某个阈值时,Deadline QoS会发出警报。对于期望定期更新数据的情况非常有用,要求定期更新每个实例以获取具有密钥的主题。
在发布方面,截止日期QoS定义了应用程序预期提供新样本的最长期限。在订阅方,它定义了应该接收新样本的最大期限。对于要匹配的发布者和订阅者,提供的截止期限必须小于或等于请求的截止期限,否则实体将被视为不兼容。

Lifespan生命周期

指定发布者写入的数据的最长有效期。当生命周期到期时,数据将从历史记录中删除。

Liveliness有生命的

活泼性是一种服务质量,可以用来确保网络上的特定实体是“活的”。 有不同的设置允许区分定期更新数据的应用程序和偶尔更改数据的应用程序。 它还允许自定义应用程序,以确定活泼性机制应该检测到的故障类型。
自动活力类型适用于只需要检测远程应用程序是否仍在运行的应用程序。 因此,只要参与者所在的本地进程以及将其连接到远程参与者的链接存在,则远程参与者中的实体将被视为活动的。

Resource limits资源限制

Disable positive acks禁用紧急acks

这是一种附加的QoS,允许在不需要严格可靠的通信且带宽有限时减少网络流量。 它包括改变缺省行为,通过缺省行为,积极的ACK从读者发送到作者。 相反,当读取器缺少样本时,只会发送负ACK,但写入器会将数据保留足够长的时间,然后将其视为已确认。 如果Writer和Reader使用此QoS,但前者不使用此QoS,则Writer和Reader不兼容(即它们将不匹配)。

Unicast locators单播定位器

Multicast locators多播定位器

额外的概念

使用消息元数据

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值