【Fast RTPS】高级函数

高级函数将丰富你的应用。

Topics和Keys

RTPS标准考虑使用Key键在一个主题内定义多数据源。
在主题中有三种应用Keys的方法:

  • 当使用FastRTPSGen时,在IDL文件中定义一个@Key域。
  • 手动应用和使用getKey()方法。
  • 当使用动态类型时,增加属性Key到成员和其母本。

使用带有Keys主题的发布和订阅必须被配置,否则,无效:

// Publisher-Subscriber Layer configuration.
publisher_attr.topic.topicKind = WITH_KEY;

RTPS层要求你在你的回调函数中手动调用getKey()方法。

可以根据当前配置,调整历史记录以容纳来自多个键的数据。这包括定义数据接收器的最大数目和每个接收器的最大大小:

// Set the subscriber to remember and store up to 3 different keys.
subscriber_attr.topic.resourceLimitsQos.max_instances = 3;
// Hold a maximum of 20 samples per key.
subscriber_attr.topic.resourceLimitsQos.max_samples_per_instance = 20;

请注意,您的历史记录必须足够大,以容纳每个键的最大样本数。如果您的历史记录太小,eProsima Fast RTPS将通知您。

Transports

eProsima Fast RTPS应用一个可插拔通信的架构。当前版本的应用四种通信方式:UDPv4,UDPv6,TCPv4 and TCPv6。默认,当Participant被创建,UDPv4通信被配置。你也可以使用属于rtps.userTransports增加定制通信。

//Create a descriptor for the new transport.
auto custom_transport = std::make_shared<UDPv4TransportDescriptor>();
    custom_transport->sendBufferSize = 9216;
    custom_transport->receiveBufferSize = 9216;

//Disable the built-in Transport Layer.
participant_attr.rtps.useBuiltinTransports = false;

//Link the Transport Layer to the Participant.
participant_attr.rtps.userTransports.push_back(custom_transport);

所有通信配置在Transport descriptors部分被描述。

TCP Transport

不像UDP,TCP传输是面向连接,为此,Fast-RTPS必须在发送RTPS消息之前建立TCP连接。因此,TCP传输可以有两种行为,充当服务器(TCP服务器)或客户端(TCP客户端)。服务器打开一个TCP端口,侦听传入连接,客户端尝试连接到服务器。服务器和客户端概念独立于RTPS概念:Publisher, Subscriber, Writer, and Reader;它们中的任何一个都可以作为TCP服务器或TCP客户端运行,因为这些实体仅用于建立TCP连接,而RTPS协议在其上工作。

要使用TCP传输,您需要定义更多配置:

你需要创建一个新的TCP通信描述子,例如TCPv4。此传输描述符有一个名为listening_ports的字段,该字段向fast-rtps指示我们的参与者将在其中侦听输入连接的物理TCP端口。如果遗漏,则参与者将无法接收传入连接,但可以连接到已配置侦听端口的其他参与者。这传输必须被增加到参与者属性的userTransports列表中。在WAN环境或者因特网中这个字段wan_addr允许使用公共IP的传入连接。

//Create a descriptor for the new transport.
auto tcp_transport = std::make_shared<TCPv4TransportDescriptor>();
tcp_transport->add_listener_port(5100);
tcp_transport->set_WAN_address("80.80.99.45");

//Disable the built-in Transport Layer.
participant_attr.rtps.useBuiltinTransports = false;

//Link the Transport Layer to the Participant.
participant_attr.rtps.userTransports.push_back(tcp_transport);

为了通过TCP配置参与者连接到其他节点,你必须配置和增加定位器到指向远程侦听端口的initialPeersList

auto tcp2_transport = std::make_shared<TCPv4TransportDescriptor>();

//Disable the built-in Transport Layer.
participant_attr.rtps.useBuiltinTransports = false;

//Set initial peers.
Locator_t initial_peer_locator;
initial_peer_locator.kind = LOCATOR_KIND_TCPv4;
IPLocator::setIPv4(initial_peer_locator, "80.80.99.45");
initial_peer_locator.port = 5100;
participant_attr.rtps.builtin.initialPeersList.push_back(initial_peer_locator);

//Link the Transport Layer to the Participant.
participant_attr.rtps.userTransports.push_back(tcp2_transport);

Helloworld例程的TCP版本

WAN或Internet通信通过TCP/IPv4

当配置完整时,Fast-RTPS可以通过Internet或WAN网络连接。为了实现这种场景,所涉及的网络设备(如路由器和防火墙)应该添加允许通信的规则。
例子,要允许通过NAT进行传入连接,必须将Fast-RTPS配置为侦听传入TCP连接的TCP服务器。要允许通过WAN的传入连接,关联的TCP描述符必须通过字段WAN_ADDR指示其公共IP。

//Create a descriptor for the new transport.
auto tcp_transport = std::make_shared<TCPv4TransportDescriptor>();
tcp_transport->add_listener_port(5100);
tcp_transport->set_WAN_address("80.80.99.45");

//Disable the built-in Transport Layer.
participant_attr.rtps.useBuiltinTransports = false;

//Link the Transport Layer to the Participant.
participant_attr.rtps.userTransports.push_back(tcp_transport);

在这种情况下,必须配置路由器(公共IP为80.80.99.45),才能允许传入流量到达TCP服务器。通常,使用listening_port 5100将NAT通到我们的机器就足够了。

在客户端,它需要用它的listening_port作为initial_peer指定TCP服务端的公共IP。

auto tcp2_transport = std::make_shared<TCPv4TransportDescriptor>();

//Disable the built-in Transport Layer.
participant_attr.rtps.useBuiltinTransports = false;

//Set initial peers.
Locator_t initial_peer_locator;
initial_peer_locator.kind = LOCATOR_KIND_TCPv4;
IPLocator::setIPv4(initial_peer_locator, "80.80.99.45");
initial_peer_locator.port = 5100;
participant_attr.rtps.builtin.initialPeersList.push_back(initial_peer_locator);

//Link the Transport Layer to the Participant.
participant_attr.rtps.userTransports.push_back(tcp2_transport);

在TCP服务端和TCP客户端中,上述配置的结合类似于以下图像所表示的方案。
在这里插入图片描述

IP Locator

TLS(Transport Layer Security) over TCP

Listening locators

eProsima Fast RTPS将侦听定位器分为四类:

  • Metatraffic Multicast Locators
  • Metatraffic Unicast Locators
  • User Multicast Locators
  • User Unicast Locators

Initial peers

Whitelist Interfaces

Tips

Flow Controllers

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值