RTPS协议的简单介绍
在RTPS的顶层,Domain域定义了不同的通信层。几个域可以同时独立地共存。域包含任意数量的参与者Participants,即发送和接收数据的元素。参与者使用端Endpoints:
-
读Reader:接收数据端
-
写Writer:发送数据端
一个参与者可以拥有任意数量的读写端。
通信以主题Topic为中心,其定义了将要交换的数据。主题不属于任何参与者Participants。相反,所有感兴趣的参与者都会跟踪主题数据的变换,确保实时更新数据。通信单元的变化意味着主题的更新。端会在历史纪录中记录这些改变,历史纪录是一种数据结构,用于为最近改变的缓存。当你通过一个写端Writer Endpoint发送一个改变时,将会发生下面步骤: -
这个改变被增加到写的历史缓存中
-
这个写writer会告诉它知道的所有读reader
-
任何感兴趣的读readers(subscribed)请求这个改变
-
接收数据之后,读reader用这个新的改变更新其历史缓存
通过选择服务质量QoS,你可以通过多种方式影响历史缓存的管理方式,但是通信循环仍然保持一样。关于此更多的信息
Ubuntu上编译你的第一个应用
为了编译一个小应用,你必须首先定义这个主题Topic。为了定义这个Topic主题的数据类型,Fast-RTPS提供了两种不同的方式,通过动态主题类型动态定义以及通过IDL接口定义语言静态定义。
在这个例子中,我们将用IDL静态定义数据类型,关于IDL更多信息
写一个包含你所需的IDL文件。简单字符串时有效的。
// HelloWorld.idl
struct HelloWorld
{
string msg;
};
转换这个IDL文件为Fast RTPS能理解格式。为此,我们提供了一个代码生成工具,叫fastrtpsgen,其做两种不同的事情:
- 为你定制的topic产生C++定义
- 可选的,用你的主题topic数据生成一个可工作的例子
您可能需要查看fastrtpsgen用户手册,该手册随库的分发一起提供。
Linux下:
fastrtpsgen -example CMake HelloWorld.idl
-example
选项创建一个例程应用。
mkdir build && cd build
cmake ..
make
应用程序构建可用于生成与您的主题相关联的任意数量的发布者和订阅者。
./HelloWorldPublisherSubscriber publisher
./HelloWorldPublisherSubscriber subscriber
每次在发布服务器上按键,都会生成一个新的数据包,通过网络发送,被当前在线的订阅者接收。如果不止一个订阅者在线,在所有侦听节点上均等地接收消息。
您可以在发送之前修改自定义IDL生成的数据类型的任何值。
HelloWorld sample; //Auto-generated container class for topic data from FastRTPSGen
sample.msg("Hello there!"); // Add contents to the message
publisher->write(&sample); //Publish
通过example/文件夹了解更多,学习更多关于Fast RTPS的高级特性。