DDS笔记: hello world解析

fast dds 2.2.x中hello world代码总结:

1) 核心逻辑流程

获取DomainParticipantFactory -> 创建participant -> 注册sub-pub type -> 创建topic(顺序可延后) -> 创建publisher / subscriber -> 创建writer / reader -> write / read / WaitSet.wait

2)除获取factory外,创建其他对象之前都要准备好对应qos、listener、mask等参数。

3)subscriber有2种模式:

(1)listener callback

创建subscriber时传入listener参数,通过listener回调事件和数据(on_subscription_matched, on_data_available)。

(2)wait set

创建subscriber后,通过WaitSet来关联多个Condition,监听相应各个Condition的变化。

关联reader的status condition,监听topic的订阅和数据更新

关联stop condition,监听程序停止动作。

  1. publisher app主要流程
    1)创建factory
    2)创建participant
    3)创建publisher
    4)创建topic
    5)创建writer
    6)发布数据
c++ 复制代码
	// 1
	auto factory = DomainParticipantFactory::get_instance();
	// 2 listener null, mask none
	auto participant = factory->create_participant_with_default_profile(null_listener, mask);
	assert(participant);
	// 注册关联pub-sub-type
	pub_sub_type.register_type(participant);

	// 3 listener null, mask none
	auto publisher = pariticipant->create_publisher(pub_qos, null_listener, mask);
	assert(publisher);

	// 4
	auto topic = participant->create_topic(topic_name, topic_type, topic_qos);
	assert(topic);
	
	// 5 listener, mask all
	auto writer = publisher->create_datawriter(topic, writer_qos, listener, mask);
	assert(writer);

	// 6
	Helloworld hello{...};
	writer->write(&hello);
  1. ListenerSubscriberApp主要流程
    1)创建participant factory
    2)创建participant
    3)创建subscriber
    4)创建topic
    5)创建data reader
    6)data callback
cpp 复制代码
	// 1
	auto factory = DomainParticipantFactory::get_instance();

	// 2 listener null, mask none
	auto participant = factory->create_participant_with_default_profile(null_listener, mask);
	assert(participant);
	pub_sub_type.register_type(participant);

	// 3 listener null, mask none
	auto subscriber = participant->create_subscriber(sub_qos, null_listener, mask);
	assert(subscriber);

	// 4
	auto topic = participant->create_topic(topic_name, topic_type, topic_qos);
	assert(topic);

	// 5 listener, mask all
	auto reader = subscriber->create_datareader(topic, reader_qos, listener, mask);
	assert(reader);

	// 6 data callback
	class DataReaderListener {
		void on_data_available(DataReader *reader); // <<<---
		void on_subscription_matched(DataReader *reader, status); // <<<---
		void on_requested_deadline_missed(DataReader *reader, status);
		void on_liveness_changed(DataReader *reader, status);
		void on_sample_rejected(DataReader *reader, status);
		void on_sample_lost(DataReader *reader, status);
		void on_requested_incompatible_qos(DataReader *reader, status);
	};
	
	void on_subscription_matched(DataReader *reader, SubscriptionMatchedStatus& status) {
		// check matched count
	}

	void on_data_available(Datareader *reader) {
		// read and process data
		Helloworld hello;
		SampleInfo info;
		reader->take_next_sample(&hello, &info);
	}
  1. WaitsetSubscriberApp main process
    1)创建factory
    2)创建participant
    3)创建subscriber
    4)创建topic
    5)创建data reader
    6)WaitSet attach Condition
    7)WaitSet wait Condition
cpp 复制代码
	// 1
	auto factory = DomainParticipantFactory::get_instance();
	
	// 2 listener null, mask none
	auto participant = factory->create_participant_with_default_profile(null_listener, mask);
	assert(participant);	
	pub_sub_type.register_type(participant);

	// 3 listener null, mask none
	auto subscriber = participant->create_subscriber(sub_qos, null_listener, mask)
	assert(subscriber);
	
	// 4
	auto topic = participant->create_topic(topic_name, topic_type, topic_qos);
	assert(topic);

	// 5 null listener, mask all
	auto reader = subscriber->create_datareader(topic, sub_qos, null_listener, mask);
	assert(reader);

	// 6
//	.hpp: 	WaitSet wait_setp;
//			GuardCondtion terminate_condition;

	// ---->>> ***************
	// 这里是关键,把wait和reader的status condition关联起来,监听reader的变化
	// 同时处理terminate_condition,监听stop事件
	wait_set.attach_condition(reader->get_statuscondition());
	wait_set.attach_condition(terminate_condition);

	// 7
	ConditionSeq triggered_conditions;
	wait_set.wait(triggered_conditions, timeout);
	for(Condition* cond : triggered_conditions) {
		auto *status_cond = dynamic_cast<StatusCondition>(cond);
		assert(status_cond);

		Entity *entity = status_cond.get_entity();
		StatusMask changed_status = entity->get_status_changes();

		if (changed_status.is_active(StatusMask::subscriptioin_matched()) {
			// check matched count
		}

		if (changed_status.is_active(StatusMask::data_available())) {
			// read and process data
			SampleInfo info;
			Helloworld hello;
			reader->take_next_sample(&hello, &info);
		}
	}
相关推荐
郝学胜-神的一滴6 分钟前
中级OpenGL教程 022:探秘三维世界的血脉传承——物体父子关系与矩阵递归奥义
c++·线性代数·unity·矩阵·游戏引擎·unreal engine·opengl
乐橙开放平台19 分钟前
明厨亮灶笔记:乐橙轻应用 H5 + 小程序插件,一套 BFF 出两张播放凭证
人工智能·笔记·物联网·小程序·音视频·notepad++
ch0sen1pm38 分钟前
刚学完 CAS 原子操作,我花了一晚上写了三个无锁队列
c++
qeen8739 分钟前
【C++】vector的模拟实现详解(二)
c++·学习·算法·迭代器·stl
j7~1 小时前
【C++】C++ 继承全解析:从基本语法到菱形继承的底层原理
开发语言·c++·继承·组合·虚继承·#暑假·七月创作之星博客挑战赛
数行拙笔1 小时前
C++客户端---String类型
开发语言·c++·bootstrap
左左右右左右摇晃1 小时前
手写Tomcat原理整理
java·开发语言·笔记·tomcat
草莓熊Lotso1 小时前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
.Hypocritical.2 小时前
Maven笔记——2
java·笔记·maven
乐橙开放平台2 小时前
养殖 SaaS 笔记:乐橙 IoT 物模型管环境,视频 OpenAPI 管回看
数据库·笔记·物联网·mysql·音视频