下面是您提供的C++代码示例的详细注释和解释。此示例展示了如何使用eProsima Fast DDS配置持久性服务,具体来说是使用内置插件PERSISTENCE:SQLITE3
。
/*
* 为了使这个示例自包含,所有实体都是以编程方式创建的,包括数据类型和类型支持。
* 这部分是使用Fast DDS动态类型API完成的,但如果有IDL文件,可以用Fast DDS-Gen生成的类型支持替代。
* 在这里创建的动态类型相当于以下IDL:
*
* struct persistence_topic_type
* {
* unsigned long index; // 数据索引
* string message; // 消息内容
* };
*/
// 配置DomainParticipant的持久性服务插件
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back("dds.persistence.plugin", "builtin.SQLITE3"); // 设置持久性插件为SQLite3
pqos.properties().properties().emplace_back("dds.persistence.sqlite3.filename", "persistence.db"); // 指定数据库文件名
DomainParticipant* participant = DomainParticipantFactory::get_instance()->create_participant(0, pqos); // 创建参与者
/********************************************************************************************************
* 创建类型及其类型支持
*********************************************************************************************************
* 如果有IDL文件和Fast DDS-Gen可用,此部分可以被替换。
* 类型名称为“persistence_topic_type”
* 此外,创建一个数据对象并填充它,只是为了演示如何做到这一点。
********************************************************************************************************/
// 创建一个构建器,用于名称为“persistence_topic_type”的结构体
const std::string topic_type_name = "persistence_topic_type";
TypeDescriptor::_ref_type struct_type_descriptor {traits<TypeDescriptor>::make_shared()}; // 创建类型描述符共享引用
struct_type_descriptor->kind(TK_STRUCTURE); // 设置为结构体类型
struct_type_descriptor->name(topic_type_name); // 设置结构体名称
// 创建动态类型构建器实例以构建结构体类型
DynamicTypeBuilder::_ref_type struct_builder {DynamicTypeBuilderFactory::get_instance()->create_type(struct_type_descriptor)};
// 类型包含两个成员:index 和 message。添加成员到结构体中。
MemberDescriptor::_ref_type index_member_descriptor {traits<MemberDescriptor>::make_shared()};
index_member_descriptor->name("index"); // 成员名称为"index"
index_member_descriptor->type(DynamicTypeBuilderFactory::get_instance()->get_primitive_type(TK_UINT32)); // 成员类型为无符号32位整数
struct_builder->add_member(index_member_descriptor); // 将成员添加到结构体
MemberDescriptor::_ref_type message_member_descriptor {traits<MemberDescriptor>::make_shared()};
message_member_descriptor->name("message"); // 成员名称为"message"
message_member_descriptor->type(DynamicTypeBuilderFactory::get_instance()->create_string_type(static_cast<uint32_t>(LENGTH_UNLIMITED))->build()); // 成员类型为字符串(无限长度)
struct_builder->add_member(message_member_descriptor); // 将成员添加到结构体
// 构建动态类型实例
DynamicType::_ref_type struct_type {struct_builder->build()};
// 创建并注册类型支持
TypeSupport type_support(new DynamicPubSubType(struct_type));
type_support.register_type(participant); // 注册新创建的数据类型与参与者关联
// 创建数据样本并填充数据。这将在调用 `writer->write()` 时使用。
DynamicData::_ref_type dyn_helloworld {DynamicDataFactory::get_instance()->create_data(struct_type)};
dyn_helloworld->set_uint32_value(0, 0); // 设置索引值为0
dyn_helloworld->set_string_value(1, "HelloWorld"); // 设置消息内容为"HelloWorld"
/********************************************************************************************************
* 结束创建类型及其支持部分
********************************************************************************************************/
// 创建主题(Topic)
Topic* topic = participant->create_topic("persistence_topic_name", topic_type_name, TOPIC_QOS_DEFAULT); // 使用默认QoS创建主题
// 创建发布者和订阅者,并采用默认QoS设置
Publisher* publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr);
Subscriber* subscriber = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, nullptr);
// 配置DataWriter的耐久性和持久化GUID,以便它可以使用持久性服务
DataWriterQos dwqos = DATAWRITER_QOS_DEFAULT;
dwqos.durability().kind = TRANSIENT_DURABILITY_QOS; // 设置耐久性种类为瞬态耐久性
dwqos.properties().properties().emplace_back("dds.persistence.guid",
"77.72.69.74.65.72.5f.70.65.72.73.5f|67.75.69.64"); // 设置持久化GUID
DataWriter* writer = publisher->create_datawriter(topic, dwqos);
// 配置DataReader的耐久性和持久化GUID,以便它可以使用持久性服务
DataReaderQos drqos = DATAREADER_QOS_DEFAULT;
drqos.durability().kind = TRANSIENT_DURABILITY_QOS; // 同样设置读取器的耐久性
drqos.properties().properties().emplace_back("dds.persistence.guid",
"72.65.61.64.65.72.5f.70.65.72.73.5f|67.75.69.64"); // 设置读取器持久化GUID
DataReader* reader = subscriber->create_datareader(topic, drqos); /* 根据QoS配置从主题中创建读取器 */
总结:
- 目的:该代码示例展示了如何通过eProsima Fast DDS库来配置持久化服务,特别是利用SQLite3数据库存储数据。
- 步骤概述:
- 配置参与者属性以启用SQLite3作为存储后端;
- 定义一个新的数据结构(在IDEs中等价于IDL);
- 创建相关的数据写入器(
DataWriter
)和读取器(DataReader
),同时设置其耐久性和唯一标识符(GUID)。
- 注意事项:确保正确地选择合适的数据传输模式、QoS策略以及对持续性的管理,以便实现高效且可靠的数据通信。
内容由零声教学AI助手提供,问题来源于学员提问