目录
- Subscriber
- SubscriberQos
- SubscriberListener
- 创建Subscriber
- DataReader
- SampleInfo
- 读取数据
Subscriber扮演容器的角色,里面可以有很多DataReaders,它们使用Subscriber的同一份SubscriberQos配置。Subscriber可以承载不同Topic和数据类型的DataReader对象。
Subscriber
SubscriberQos
默认Qos配置可以通过DomainParticipant实例的get_default_subscriber_qos()函数获取。
SubscriberListener
Subscriber的状态改变会触发SubscriberListener的回调函数调用。用户可以通过继承实现自定义回调。新增callback:on_data_on_readers()
创建Subscriber
通过DomainParticipant的create_subscriber()函数创建,SubscriberQos参数是必需的,SubscriberListener和StatusMask参数可选。
// 创建DomainParticipant实例participant
Subscriber* subscriber_with_default_qos = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT);
if (nullptr == subscriber_with_default_qos) {// Errorreturn;
}
基于Profile创建Subscriber:用于标识subscriber的字符串名字参数是必需的,listener和StatusMask是可选的
Subscriber* subscriber_with_profile = participant->create_subscriber_with_profile("subscriber_profile");
if (nullptr == subscriber_with_profile) {// Errorreturn;
}
删除Subscriber:需要先删除Subscriber中的所有实体(DataReaders),再调用 delete_subscriber()
删除Subscriber
// Delete the entities the subscriber created
if (subscriber->delete_contained_entities() != ReturnCode_t::RETCODE_OK) {// Subscriber failed to delete the entities it createdreturn;
}
// Delete the Subscriber
if (participant->delete_subscriber(subscriber) != ReturnCode_t::RETCODE_OK) {// Errorreturn;
}
DataReader
DataReader只归属于创建它的Subscriber,每个DataReader在它创建支持绑定到单一的Topic上,所以Topic必须是在DataReader创建之前就已经创建。可以通过DataReader::read_next_sample()或DataReader::take_next_sample()函数获取pub端写入的数据。
DataReaderQos
DataReaderListener用于监听DataReader状态的改变。有以下callback成员函数:
- on_data_available
- on_subscription_matched
创建一个DataReader:绑定到要传输数据的Topic和DataReaderQos是必需的参数,DataReaderListener和StatusMask是可选的
DataReader* data_reader_with_default_qos = subscriber->create_datareader(topic, DATAREADER_QOS_DEFAULT);
if (nullptr == data_reader_with_default_qos) {// Errorreturn;
}
基于Profile创建DataReader
使用自定义的PayloadPool创建DataReader(为什么要使用自定义的PayloadPool?)
// A DataReaderQos must be provided to the creation method
DataReaderQos qos;// Create PayloadPool
std::shared_ptr<CustomPayloadPool> payload_pool = std::make_shared<CustomPayloadPool>();
DataReader* data_reader = subscriber->create_datareader(topic, qos, nullptr, StatusMask::all(), payload_pool);
if (nullptr == data_reader) {// Errorreturn;
}
删除DataReader
同理,删除DataReader之前需要删除所有属于DataReader的实体(QueryConditions)
// Delete the entities the DataReader created
if (data_reader->delete_contained_entities() != ReturnCode_t::RETCODE_OK) {// DataReader failed to delete the entities it created.return;
}// Delete the DataReader
if (subscriber->delete_datareader(data_reader) != ReturnCode_t::RETCODE_OK) {// Errorreturn;
}