高级函数将丰富你的应用。
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);
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