RTPS协议简介
Domain(域):定义了一个独立的通信平面,多个域是同时独立存在的。域包含了多个Participant和发送接收数据的元素。
Participant(参与者):包含多个Reader端点和Writer端点
Reader:接收数据端点
Writer:发送数据端点
Topic(主题):通信是围绕着Topic进行的,所以,Topic定义了要通信的数据内容,Topic不属于任何Participant,所有关注该Topic的Participant都监测其数据变化,并保持最新。
Change(变化):通信单元,表示Topic的一次更新。
History(Change数据缓冲队列):端点会将Change注册到相应的History里
以Publisher通过Writer端点发送Change为例,过程如下:
1. 将Change添加到WriterHistory
2. Writer通知所有它知道的Reader
3. 所有感兴趣的Reader都请求该Change
4. Reader接收Change并添加到ReaderHistory
创建第一个应用
第一步:编写IDL文件
IDL(Interface Definition Language,接口定义语言):用于定义Topic数据
// HelloWorld.idl
struct HelloWorld
{
string msg;
};
第二步:fastrtpsgen生成C++头文件
# on linux
fastrtpsgen -example x64Linux2.6gcc HelloWorld.idl
# on windows
fastrtpsgen.bat -example x64Win64VS2015 HelloWorld.idl
-example选项用于生成示例程序。
第三步:启动
# on linux
./HelloWorldPublisherSubscriber publisher
./HelloWorldPublisherSubscriber subscriber
#on windows
HelloWorldPublisherSubscriber.exe publisher
HelloWorldPublisherSubscriber.exe subscriber
注:在windows系统下可能需要配置防火墙的规则。
示例程序说明:
在publisher应用下,每按一个<Enter>回车键,就会产生一个新的数据,这个数据会通过网络发送出去,并由subscriber接收。有多个subscriber时,这个新数据会被平等接收。
publisher程序:
HelloWorld myHelloWorld;
myHelloWorld.msg("HelloWorld");
mp_publisher->write((void*)&myHelloWorld);