下面通过简单讲解Fast-DDS的HelloWorld例程,介绍Fast-DDS发布者和订阅者之间的通信过程
一、工程结构
HelloWorld例程包含如下文件:
CMakeLists.txt
HelloWorld.cxx
HelloWorld.h
HelloWorld.idl
HelloWorld_main.cpp
HelloWorldPublisher.cpp
HelloWorldPublisher.h
HelloWorldPubSubTypes.cxx
HelloWorldPubSubTypes.h
HelloWorldSubscriber.cpp
HelloWorldSubscriber.h
Makefile
README.txt
本篇重点讲解HelloWorldPublisher.cpp、HelloWorldSubscriber.cpp、HelloWorld_main.cpp里边的关键代码
二、发布者
HelloWorldPublisher.cpp中有两个重要函数:
bool init()和bool publish(bool waitForListener)
1. 创建域参与者
关键代码:
mp_participant = Domain::createParticipant(PParam);
这行代码在init函数中
2. 注册数据类型
关键代码:
Domain::registerType(mp_participant, &m_type);
这行代码在init函数中
3. 创建发布者
关键代码:
mp_publisher = Domain::createPublisher(mp_participant, Wparam, (PublisherListener*)&m_listener);
这行代码在init函数中
4. 发布数据
关键代码:
mp_publisher->write((void*)&m_Hello);
这行代码在publish函数中
三、订阅者
HelloWorldSubscriber.cpp中有两个重要函数:
bool init()和void onNewDataMessage(eprosima::fastrtps::Subscriber* sub)
其中onNewDataMessage是HelloWorldSubscriber的内部类SubListener中的函数
1. 创建域参与者
关键代码:
mp_participant = Domain::createParticipant(PParam);
这行代码在init函数中
2. 注册数据类型
关键代码:
Domain::registerType(mp_participant, &m_type);
这行代码在init函数中
3. 创建订阅者
关键代码:
mp_subscriber = Domain::createSubscriber(mp_participant, Rparam, (SubscriberListener*)&m_listener);
这行代码在init函数中
4. 读取数据
关键代码:
sub->takeNextData((void*)&m_Hello, &m_info);
这行代码在onNewDataMessage函数中
四、主函数
主函数执行时,根据参数确定程序以发布者还是订阅者运行
如果是发布者,先调用init进行初始化,然后启动线程,线程的回调函数中调用了publish进行数据的发送
如果是订阅者,先调用init进行初始化,然后等待,数据发送过来的时候,会自动调用onNewDataMessage进行数据的接收