15.3.2.2. 创建实体并加载静态发现 XML 文件
在创建实体时,本地的写入器/读取器属性必须与通过远程实体加载的静态发现 XML 文件中定义的属性匹配。
发布者 (PUBLISHER)
C++代码示例
// Participant configuration
DomainParticipantQos participant_qos;
participant_qos.name("HelloWorldPublisher");
participant_qos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocol = false;
participant_qos.wire_protocol().builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocol = true;
participant_qos.wire_protocol().builtin.discovery_config.static_edp_xml_config("HelloWorldSubscriber.xml");
// DataWriter configuration
DataWriterQos writer_qos;
writer_qos.endpoint().user_defined_id = 1;
writer_qos.endpoint().entity_id = 2;
// Create the DomainParticipant
DomainParticipant* participant =
DomainParticipantFactory::get_instance()->create_participant(0, participant_qos);
if (nullptr == participant)
{
// Error handling
return;
}
// Create the Publisher
Publisher* publisher =
participant->create_publisher(PUBLISHER_QOS_DEFAULT);
if (nullptr == publisher)
{
// Error handling
return;
}
// Create the Topic with the appropriate name and data type
std::string topic_name = "HelloWorldTopic";
std::string data_type = "HelloWorld";
Topic* topic =
participant->create_topic(topic_name, data_type, TOPIC_QOS_DEFAULT);
if (nullptr == topic)
{
// Error handling
return;
}
// Create the DataWriter
DataWriter* writer =
publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT);
if (nullptr == writer)
{
// Error handling
return;
}
XML配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com">
<participant profile_name="participant_profile_static_pub">
<rtps>
<name>HelloWorldPublisher</name>
<builtin>
<discovery_config>
<EDP>STATIC</EDP>
<static_edp_xml_config>file://HelloWorldSubscriber.xml</static_edp_xml_config>
</discovery_config>
</builtin>
</rtps>
</participant>
<data_writer profile_name="uc_publisher_xml_conf_static_discovery">
<userDefinedID>1</userDefinedID>
<entityID>2</entityID>
</data_writer>
</profiles>
订阅者 (SUBSCRIBER)
C++代码示例
// Participant configuration
DomainParticipantQos participant_qos;
participant_qos.name("HelloWorldSubscriber");
participant_qos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocol = false;
participant_qos.wire_protocol().builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocol = true;
participant_qos.wire_protocol().builtin.discovery_config.static_edp_xml_config("HelloWorldPublisher.xml");
// DataWriter configuration
DataWriterQos writer_qos;
writer_qos.endpoint().user_defined_id = 3;
writer_qos.endpoint().entity_id = 4;
// Create the DomainParticipant
DomainParticipant* participant =
DomainParticipantFactory::get_instance()->create_participant(0, participant_qos);
if (nullptr == participant)
{
// Error handling
return;
}
// Create the Subscriber
Subscriber* subscriber =
participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT);
if (nullptr == subscriber)
{
// Error handling
return;
}
// Create the Topic with the appropriate name and data type
std::string topic_name = "HelloWorldTopic";
std::string data_type = "HelloWorld";
Topic* topic =
participant->create_topic(topic_name, data_type, TOPIC_QOS_DEFAULT);
if (nullptr == topic)
{
// Error handling
return;
}
// Create the DataReader
DataReader* reader =
subscriber->create_datareader(topic, DATAREADER_QOS_DEFAULT);
if (nullptr == reader)
{
// Error handling
return;
}
XML配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com">
<participant profile_name="participant_profile_static_sub">
<rtps>
<name>HelloWorldSubscriber</name>
<builtin>
<discovery_config>
<static_edp_xml_config>file://HelloWorldPublisher.xml</static_edp_xml_config>
</discovery_config>
</builtin>
</rtps>
</participant>
<data_reader profile_name="uc_subscriber_xml_conf_static_discovery">
<userDefinedID>3</userDefinedID>
<entityID>4</entityID>
</data_reader>
</profiles>
总结
在这段代码中,创建了一个发布者和一个订阅者,每个参与者都根据静态发现机制(使用指定的 XML 配置文件)进行配置。发布者和订阅者通过匹配的 ID 和名称建立连接,允许数据在它们之间进行交换。
内容由零声教学AI助手提供,问题来源于学员提问