当前位置: 首页 > web >正文

【FastDDS】XML profiles

eProsima Fast DDS 允许加载 XML 配置文件,每个文件可包含一个或多个 XML 配置文件(profile)。除了用于加载用户 XML 文件的 API 函数外,Fast DDS 在初始化时还会尝试查找并加载多个 XML 文件。Fast DDS 提供以下选项:

  • 加载当前执行路径下名为 DEFAULT_FASTDDS_PROFILES.xml 的 XML 文件。
  • 加载通过环境变量 FASTDDS_DEFAULT_PROFILES_FILE 定义位置的 XML 文件(参见 FASTDDS_DEFAULT_PROFILES_FILE)。
  • 直接从类定义中加载配置参数,而不在工作目录中查找 DEFAULT_FASTDDS_PROFILES.xml(参见 SKIP_DEFAULT_XML)。
  • 直接加载作为字符串数据缓冲区的 XML。

一个 XML 配置文件由唯一的名称定义,该名称用于在创建实体、传输配置或动态类型定义期间引用该 XML 配置文件。

这些选项可以相互补充,也就是说,可以加载多个 XML 文件,但这些文件不得包含名称相同的 XML 配置文件。本节将说明如何使用 XML 配置文件配置 DDS 实体,包括每个 XML 配置文件可用的所有配置值的描述,以及如何创建完整的 XML 文件。

10.1 创建 XML 配置文件

一个 XML 文件可以包含多个 XML 配置文件(profile)。这些 XML 配置文件定义在 <dds> 元素内,进而嵌套在 <profiles> XML 元素中。XML 配置文件的可能定义拓扑在“根定义与独立定义配置文件”中有具体说明。

值得一提的是,无论采用根定义还是独立定义,XML 配置文件的第一个元素都必须带有 xmlns 属性,其值为 xmlns="http://www.eprosima.com"。该链接定义了 XML 文档所遵循的 XSD 模式引用。

可用的配置文件类型包括:

  • 域参与者(DomainParticipant)配置文件
  • 数据写入器(DataWriter)配置文件
  • 数据读取器(DataReader)配置文件
  • 主题(Topic)配置文件
  • 传输描述符(Transport descriptors)
  • 进程内传输配置文件
  • 日志(Log)配置文件
  • 动态类型(Dynamic Types)配置文件

以下部分将展示每种配置文件的实现示例。

<?xml version="1.0" encoding="UTF-8" ?><dds xmlns="http://www.eprosima.com"><profiles><domainparticipant_factory profile_name="domainparticipant_factory_profile"><!-- ... --></domainparticipant_factory><participant profile_name="participant_profile"><!-- ... --></participant><data_writer profile_name="datawriter_profile"><!-- ... --></data_writer><data_reader profile_name="datareader_profile"><!-- ... --></data_reader><topic profile_name="topic_profile"><!-- ... --></topic><transport_descriptors><!-- ... --></transport_descriptors></profiles><library_settings><!-- ... --></library_settings><log><!-- ... --></log><types><!-- ... --></types></dds>

注意
示例部分展示了一个包含所有可能配置和配置文件类型的 XML 文件。该示例可作为快速参考,用于查找特定属性及其使用方法。Fast DDS XSD 模式也可作为快速参考。

10.1.1 加载和应用配置文件

如果用户通过 XML 文件定义实体配置文件,需要在创建任何实体之前使用 load_XML_profiles_file() 公共成员函数加载这些 XML 文件。也可以使用 load_XML_profiles_string() 公共成员函数直接加载作为字符串数据缓冲区的 XML 信息。此外,create_participant_with_profile()create_publisher_with_profile()create_subscriber_with_profile()create_datawriter_with_profile()create_datareader_with_profile() 成员函数需要一个配置文件名称作为参数。Fast DDS 会在所有已加载的 XML 配置文件中搜索给定的配置文件名称,如果找到,则将该配置文件应用于实体。

if (RETCODE_OK == DomainParticipantFactory::get_instance()->load_XML_profiles_file("my_profiles.xml"))
{DomainParticipant* participant =DomainParticipantFactory::get_instance()->create_participant_with_profile(0, "participant_xml_profile");Topic* topic =participant->create_topic("TopicName", "DataTypeName", TOPIC_QOS_DEFAULT);Publisher* publisher = participant->create_publisher_with_profile("publisher_xml_profile");DataWriter* datawriter = publisher->create_datawriter_with_profile(topic, "datawriter_xml_profile");Subscriber* subscriber = participant->create_subscriber_with_profile("subscriber_xml_profile");DataReader* datareader = subscriber->create_datareader_with_profile(topic, "datareader_xml_profile");
}// 加载作为字符串数据缓冲区的 XML
std::string xml_profile ="\<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\<dds>\<profiles xmlns=\"http://www.eprosima.com\" >\<data_writer profile_name=\"test_datawriter_profile\" is_default_profile=\"true\">\<qos>\<durability>\<kind>TRANSIENT_LOCAL</kind>\</durability>\</qos>\</data_writer>\</profiles>\</dds>\";
if (RETCODE_OK ==DomainParticipantFactory::get_instance()->load_XML_profiles_string(xml_profile.c_str(),xml_profile.length()))
{// 使用配置文件创建 DDS 实体
}

为简单起见,create_participant_with_default_profile() 方法会使用环境中设置的默认配置文件创建参与者。这需要 XML 配置文件已被加载。有关加载配置文件的更多信息,请参考 XML 配置文件。

警告
值得一提的是,如果同一 XML 配置文件被多次加载,第二次加载将导致错误,并产生相应的错误日志。

注意
要从 XML 文件加载动态类型,请参见动态类型配置文件中的“在 Fast DDS 应用程序中加载 XML 类型配置文件”小节。

10.1.2 从原始 XML 配置文件获取 QoS

标准流程是先加载 XML 配置文件,然后根据所选的配置文件名称创建实体。不过,也可以直接从 XML 配置文件中获取所需的 QoS,以便在使用前进行修改。为此,提供了以下公共方法:

DomainParticipantFactory

  • get_participant_qos_from_xml()
  • get_default_participant_qos_from_xml()
  • get_participant_extended_qos_from_xml()
  • get_default_participant_extended_qos_from_xml()

DomainParticipant

  • get_publisher_qos_from_xml()
  • get_default_publisher_qos_from_xml()
  • get_subscriber_qos_from_xml()
  • get_default_subscriber_qos_from_xml()
  • get_topic_qos_from_xml()
  • get_default_topic_qos_from_xml()
  • get_requester_qos_from_xml()
  • get_default_requester_qos_from_xml()
  • get_replier_qos_from_xml()
  • get_default_replier_qos_from_xml()

Publisher

  • get_datawriter_qos_from_xml()
  • get_default_datawriter_qos_from_xml()

Subscriber

  • get_datareader_qos_from_xml()
  • get_default_datareader_qos_from_xml()

每种 QoS 都有两个版本的方法:一个带有 profile_name 参数,一个没有。当提供 profile_name 时,方法会在已加载的 XML 配置文件中搜索给定的配置文件名称,如果未找到,则返回错误。当不提供 profile_name 时,方法会将提供的 QoS 对象填充为检索到的第一个相关类型的配置文件,如果未找到,则返回错误。此外,还有另一个版本的方法,可在提供的 XML 字符串中查找相关类型的默认配置文件。

以下示例展示了如何从原始 XML 配置文件中获取 QoS 并在创建新实体之前对其进行修改。

DomainParticipant* participant =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);Topic* topic =participant->create_topic("TopicName", "DataTypeName", TOPIC_QOS_DEFAULT);Publisher* publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT);// 加载作为字符串数据缓冲区的 XML
std::string xml_profile ="\<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\<dds>\<profiles xmlns=\"http://www.eprosima.com\" >\<data_writer profile_name=\"test_datawriter_profile\" is_default_profile=\"true\">\<qos>\<durability>\<kind>TRANSIENT_LOCAL</kind>\</durability>\</qos>\</data_writer>\</profiles>\</dds>\";// 从 XML 中提取 QoS
DataWriterQos qos;
if (RETCODE_OK == publisher->get_datawriter_qos_from_xml(xml_profile, qos, "test_datawriter_profile"))
{// 修改提取的 QoS 并用于创建 DDS 实体
}

10.1.3 根定义与独立定义配置文件

Fast DDS 提供了多种 XML 配置文件的定义方式,包括:

  • 独立定义:定义 XML 配置文件的元素是 XML 文件的根元素。<dds><profiles><library_settings><types><log> 元素可以独立定义。
  • 根定义:定义 XML 配置文件的元素是另一个元素的子元素。例如,<participant><data_reader><data_writer><topic><transport_descriptors> 元素必须定义为 <profiles> 元素的子元素。

以下是使用上述两种方法定义 <types> XML 配置文件的示例。

独立定义

<?xml version="1.0" encoding="UTF-8" ?><types xmlns="http://www.eprosima.com"><type><!-- 类型定义 --></type><type><!-- 类型定义 --><!-- 类型定义 --></type>
</types>

根定义

<?xml version="1.0" encoding="UTF-8" ?><dds xmlns="http://www.eprosima.com"><types><type><!-- 类型定义 --></type><type><!-- 类型定义 --><!-- 类型定义 --></type></types>
</dds>

注意
确保 XML 配置文件的第一个元素必须带有 xmlns 标签,其值为 xmlns="http://www.eprosima.com",无论采用根定义还是独立定义。

10.1.4 修改预定义的 XML 配置文件

在某些场景中,可能需要在加载 XML 配置文件后修改部分 QoS。对于这种情况,作为工厂的实体类型提供了从 XML 配置文件获取 QoS 的方法。这允许用户在将预定义的 XML 配置文件应用于新实体之前读取并修改它们。

if (RETCODE_OK ==DomainParticipantFactory::get_instance()->load_XML_profiles_file("my_profiles.xml"))
{DomainParticipantQos participant_qos;DomainParticipantFactory::get_instance()->get_participant_qos_from_profile("participant_xml_profile",participant_qos);// 在代码的另一部分获取名称participant_qos.name() = custom_name;// 修改预分配数量(这会覆盖在 XML 配置文件中设置的值)participant_qos.allocation().send_buffers.preallocated_number = 10;// 使用修改后的 XML QoS 创建参与者DomainParticipant* participant =DomainParticipantFactory::get_instance()->create_participant(0, participant_qos);
}

10.1.5 利用环境变量实现动态内容

对于需要动态生成部分 XML 内容的部署场景,Fast DDS 支持在任何 XML 标签的文本内容中使用环境变量。环境变量的扩展格式为 ${ENV_VAR_NAME},其中 ENV_VAR_NAME 需遵循 IEEE 1003.1 的限制:

注意
环境变量名称……仅由大写字母、数字和可移植字符集中定义的下划线(_)组成,且不以数字开头。

可以使用多个环境变量,并且它们可以与文本混合使用。

扩展将在 XML 文件加载时进行,因此之后更改环境变量的值将不会产生影响。

以下示例展示了一个 XML,它允许参与者仅与固定 IP 地址上的参与者通信(该 IP 地址取自 REMOTE_IP_ADDRESS 环境变量)。它还为参与者指定了一个名称,该名称将文本与两个环境变量的内容混合在一起。

<?xml version="1.0" encoding="UTF-8" ?><dds xmlns="http://www.eprosima.com"><profiles><participant profile_name="env_var_parsing_example"><rtps><name>This is app '${MY_APP_NAME}' running on host '${MY_HOST_NAME}'</name><builtin><initialPeersList><locator><udpv4><address>${REMOTE_IP_ADDRESS}</address></udpv4></locator></initialPeersList></builtin></rtps></participant></profiles>
</dds>

10.2 域参与者工厂配置文件

域参与者工厂(DomainParticipantFactory)配置文件允许通过 XML 文件定义 DomainParticipantFactory 的配置。这些配置文件在 <domainparticipant_factory> XML 标签内定义。

10.2.1 域参与者工厂的 XML 属性

<domainparticipant_factory> 元素定义了两个属性:profile_nameis_default_profile

名称描述使用
profile_name设置 <domainparticipant_factory> 配置文件在 DDS 域中注册时使用的名称,以便 DomainParticipantFactory 之后可以加载它,如加载和应用配置文件中所示。必需
is_default_profile<domainparticipant_factory> 配置文件设置为默认配置文件。因此,如果存在默认配置文件,创建域参与者工厂时将使用该默认配置文件。可选

10.2.2 域参与者工厂配置

<domainparticipant_factory> 元素有以下子元素:

名称描述
<qos>域参与者工厂的 QoS。QoS 元素类型

10.2.2.1 QoS 元素类型

名称描述
<entity_factory>实体工厂 QoS 策略。实体工厂
<shm_watchdog_thread>共享内存(SHM)看门狗线程的线程设置(ThreadSettings)。参见并发和多线程。线程设置
<file_watch_threads>文件监视线程的线程设置(ThreadSettings)。参见并发和多线程。线程设置

示例

<?xml version="1.0" encoding="UTF-8" ?><dds><profiles xmlns="http://www.eprosima.com"><domainparticipant_factory profile_name="domainparticipant_factory_profile_name"><qos><entity_factory><autoenable_created_entities>true</autoenable_created_entities></entity_factory><shm_watchdog_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></shm_watchdog_thread><file_watch_threads><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></file_watch_threads></qos></domainparticipant_factory></profiles></dds>

10.3. DomainParticipant 配置文件

DomainParticipant配置文件允许通过XML文件定义DomainParticipants的配置。这些配置文件在<participant>XML标签内定义。

10.3.1. DomainParticipant XML属性

<participant>元素定义了两个属性:profile_nameis_default_profile

名称描述使用
profile_name设置<participant>配置文件在DDS域中注册时使用的名称,以便DomainParticipantFactory稍后可以加载它,如加载和应用配置文件中所示。必选
is_default_profile<participant>配置文件设置为默认配置文件。因此,如果存在默认配置文件,则在创建DomainParticipant时未指定其他DomainParticipant配置文件时,将使用该默认配置文件。可选

10.3.2. DomainParticipant配置

<participant>元素有两个子元素:<domainId><rtps>。所有DomainParticipant配置选项都属于<rtps>元素,除了由<domainId>元素定义的DDSDomainId。下面列出了配置XML元素:

名称描述默认值
<domainId>DomainParticipant要使用的DomainId。请参见基于配置文件的DomainParticipant创建。uint32_t0
<rtps>Fast DDS DomainParticipant配置。请参见RTPS元素类型。RTPS元素类型

10.3.2.1. RTPS元素类型

以下是<rtps>元素所有可能的子XML元素的列表。这些元素允许用户定义DomainParticipant配置。

名称描述默认值
<name>DomainParticipant的名称。string_255
<defaultUnicastLocatorList>用户数据流量的默认接收单播定位器列表(请参见内置参数中定义的<metatrafficUnicastLocatorList>)。它需要一个LocatorListType。<locator>
<defaultMulticastLocatorList>用户数据流量的默认接收多播定位器列表(请参见内置参数中定义的<metatrafficMulticastLocatorList>)。它需要一个LocatorListType。<locator>
<default_external_unicast_locators>为该参与者的默认用户流量宣布的外部定位器列表。ExternalLocatorListType
<ignore_non_matching_locators>当从其他参与者收到的公告中的定位器与该参与者宣布的任何定位器不匹配时,是否忽略这些定位器。boolfalse
<sendSocketBufferSize>发送套接字缓冲区的大小(以字节为单位)。如果该值为零,则Fast DDS将使用系统默认的套接字大小。uint32_t0
<listenSocketBufferSize>接收套接字缓冲区的大小(以字节为单位)。如果该值为零,则Fast DDS将使用系统默认的套接字大小。uint32_t0
<netmask_filter>参与者的子网掩码过滤配置。请参见子网掩码过滤部分。NetmaskFilterKindAUTO
<builtin>WireProtocolConfigQos类的builtin公共数据成员。请参见内置参数部分。内置参数
<port>允许定义与RTPS协议相关的端口和增益。请参见端口部分。端口
<participantID>DomainParticipant的标识符。通常,它将由DomainParticipantFactory自动生成。int32_t0
<easy_mode_ip>使用发现服务器简易模式连接到的远程发现服务器的IP地址。string
<userTransports>DomainParticipant要使用的传输描述符。请参见传输描述符。List <string>
<useBuiltinTransports>布尔字段,指示系统DomainParticipant是否将除其<userTransports>之外还使用默认的builtin传输。booltrue
<builtinTransports>如果useBuiltinTransports设置为true,则确定要实例化哪些传输的配置选项。请参见管理内置传输。BuiltinTransportType
<propertiesPolicy>附加的配置属性。请参见PropertyPolicyQos。PropertiesPolicyType
<allocation>有关分配行为的配置。它需要一个DomainParticipantAllocationType。DomainParticipantAllocationType
<userData>附加到DomainParticipant并随发现信息一起传输的附加信息。请参见UserDataQosPolicy。List <string>
<prefix>DomainParticipant的GuidPrefix_t标识在同一进程中运行的对等方。GuidPrefix_t的前8个字节相同的两个参与者被视为在同一进程中运行,因此使用进程内交付。请参见进程内交付。string
<builtin_controllers_sender_thread>内置流控制器发送线程的ThreadSettings。ThreadSettings
<timed_events_thread>参与者定时事件线程的ThreadSettings。ThreadSettings
<discovery_server_thread>发现服务器线程的ThreadSettings。ThreadSettings
<typelookup_service_thread>内置TypeLookup服务用于发现未知远程类型的线程的ThreadSettings。请参见远程数据类型发现。ThreadSettings
<builtin_transports_reception_threads>内置传输接收线程的ThreadSettings。ThreadSettings
<security_log_thread>安全日志线程的ThreadSettings。ThreadSettings
<flow_controller_descriptor_list>DomainParticipant要使用的已定义流控制器描述符。请参见流控制器描述符。FlowControllersQos

示例

<?xml version="1.0" encoding="UTF-8" ?>
<dds><profiles xmlns="http://www.eprosima.com"><participant profile_name="domainparticipant_profile_name"><domainId>4</domainId><rtps><name>DomainParticipant Name</name><defaultUnicastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><port>7400</port><address>192.168.1.41</address></udpv4></locator></defaultUnicastLocatorList><defaultMulticastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><port>7400</port><address>192.168.2.41</address></udpv4></locator></defaultMulticastLocatorList><default_external_unicast_locators><!-- EXTERNAL_LOCATOR_LIST --><udpv4 externality="1" cost="0" mask="24"><address>100.100.100.10</address><port>23456</port></udpv4></default_external_unicast_locators><ignore_non_matching_locators>true</ignore_non_matching_locators><sendSocketBufferSize>8192</sendSocketBufferSize><listenSocketBufferSize>8192</listenSocketBufferSize><netmask_filter>ON</netmask_filter><builtin><!-- BUILTIN --></builtin><port><portBase>7400</portBase><domainIDGain>200</domainIDGain><participantIDGain>10</participantIDGain><offsetd0>0</offsetd0><offsetd1>1</offsetd1><offsetd2>2</offsetd2><offsetd3>3</offsetd3></port><participantID>99</participantID><userTransports><transport_id>TransportId1</transport_id><transport_id>TransportId2</transport_id></userTransports><useBuiltinTransports>false</useBuiltinTransports><builtinTransports>DEFAULT</builtinTransports><propertiesPolicy><!-- PROPERTIES_POLICY --><properties><property><name>Property1Name</name><value>Property1Value</value><propagate>false</propagate></property></properties></propertiesPolicy><allocation><!-- ALLOCATION --></allocation><userData><value>3.4.7.0.C</value></userData><prefix>72.61.73.70.66.61.72.6d.74.65.73.74</prefix><builtin_controllers_sender_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></builtin_controllers_sender_thread><timed_events_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></timed_events_thread><discovery_server_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></discovery_server_thread><typelookup_service_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></typelookup_service_thread><builtin_transports_reception_threads><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></builtin_transports_reception_threads><security_log_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></security_log_thread><flow_controller_descriptor_list><flow_controller_descriptor><name>example_flow_controller</name><scheduler>FIFO</scheduler><max_bytes_per_period>4096</max_bytes_per_period><period_ms>500</period_ms><sender_thread><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></sender_thread></flow_controller_descriptor></flow_controller_descriptor_list></rtps></participant></profiles>
</dds>

注意

  • LOCATOR_LIST表示需要一个LocatorListType。
  • EXTERNAL_LOCATOR_LIST表示需要一个ExternalLocatorListType。
  • 有关BUILTIN的详细信息,请参阅内置参数。
  • PROPERTIES_POLICY表示该标签是一个PropertiesPolicyType块。
  • 有关ALLOCATION的详细信息,请参阅ParticipantAllocationType。

10.3.2.2. 内置参数

通过调用DomainParticipantQoswire_protocol()成员函数,可以访问WireProtocolConfigQos类的builtin公共数据成员。本节指定了用于配置此builtin参数的可用XML成员。

名称描述默认值
<discovery_config>这是可以在其中配置与发现相关的设置的主要元素。请参见发现。discovery_config
<avoid_builtin_multicast>将多播元流量限制为仅PDP。booltrue
<use_WriterLivelinessProtocol>指示是否使用DataWriterLiveliness协议。booltrue
<metatrafficUnicastLocatorList>元流量单播定位器列表。一组<locator>成员。请参见LocatorListType
<metatrafficMulticastLocatorList>元流量多播定位器列表。一组<locator>成员。请参见LocatorListType
<initialPeersList>DomainParticipant将与之通信的所有其他DomainParticipants的IP端口地址对列表。请参见初始对等方一组<locator>成员。请参见LocatorListType
<metatraffic_external_unicast_locators>为该参与者的元流量宣布的外部定位器列表。ExternalLocatorListType
<readerHistoryMemoryPolicy>DataReaders的内存策略。请参见HistoryQosPolicyKind。HistoryMemoryPolicyPREALLOCATED
<writerHistoryMemoryPolicy>DataWriters的内存策略。请参见HistoryQosPolicyKind。HistoryMemoryPolicyPREALLOCATED
<readerPayloadSize>DataReader的历史有效负载最大大小。允许在DataReader初始化时保留所有所需的内存。请参见MemoryManagementPolicy。uint32_t512
<writerPayloadSize>DataWriter的历史有效负载最大大小。允许在DataWriter初始化时保留所有所需的内存。请参见MemoryManagementPolicy。uint32_t512
<mutation_tries>如果DataReader的物理端口已在使用中,要尝试的不同端口的数量。uint32_t100
<flow_controller_name>FlowControllersQos名称。string

示例

<builtin><discovery_config><discoveryProtocol>CLIENT</discoveryProtocol><discoveryServersList><locator><udpv4><address>192.168.10.57</address><port>56542</port></udpv4></locator><locator><udpv4><address>192.168.10.58</address><port>24565</port></udpv4></locator></discoveryServersList><ignoreParticipantFlags>FILTER_DIFFERENT_HOST</ignoreParticipantFlags><EDP>SIMPLE</EDP><simpleEDP><PUBWRITER_SUBREADER>true</PUBWRITER_SUBREADER><PUBREADER_SUBWRITER>true</PUBREADER_SUBWRITER></simpleEDP><leaseDuration><!-- DURATION --><sec>20</sec></leaseDuration><leaseAnnouncement><!-- DURATION --><sec>3</sec></leaseAnnouncement><initialAnnouncements><!-- INITIAL_ANNOUNCEMENTS --><count>10</count><period><nanosec>50</nanosec></period></initialAnnouncements><clientAnnouncementPeriod><nanosec>250000000</nanosec></clientAnnouncementPeriod><static_edp_xml_config>file://filename1.xml</static_edp_xml_config><static_edp_xml_config>file://filename2.xml</static_edp_xml_config><static_edp_xml_config>file://filename3.xml</static_edp_xml_config></discovery_config><avoid_builtin_multicast>true</avoid_builtin_multicast><use_WriterLivelinessProtocol>false</use_WriterLivelinessProtocol><metatrafficUnicastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></metatrafficUnicastLocatorList><metatrafficMulticastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></metatrafficMulticastLocatorList><initialPeersList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></initialPeersList><metatraffic_external_unicast_locators><!-- EXTERNAL_LOCATOR_LIST --><udpv4 externality="1" cost="0" mask="24"><address>100.100.100.10</address><port>34567</port></udpv4></metatraffic_external_unicast_locators><readerHistoryMemoryPolicy>PREALLOCATED_WITH_REALLOC</readerHistoryMemoryPolicy><writerHistoryMemoryPolicy>PREALLOCATED_WITH_REALLOC</writerHistoryMemoryPolicy><readerPayloadSize>512</readerPayloadSize><writerPayloadSize>512</writerPayloadSize><mutation_tries>55</mutation_tries></builtin>
10.3.2.2.1. discovery_config

通过<discovery_config>元素,Fast DDS允许通过XML文件配置发现机制。有关各种发现机制和可配置设置的更多详细信息,请参阅发现部分。

名称描述默认值
<discoveryProtocol>指示DomainParticipant将使用哪种发现协议。请参见发现机制。如果未设置为SIMPLENONE,则将使用<discoveryServersList>元素。SIMPLECLIENTSERVERBACKUPSUPER_CLIENTNONESIMPLE
<discoveryServersList>描述服务器的定位器,从中仅接收建立与匹配端点通信所需的发现信息。它需要一个LocatorListType。<locator>
<ignoreParticipantFlags>使用多个过滤条件限制元流量。请参见忽略参与者标志。ignoreParticipantFlagsNO_FILTER
<EDP>如果设置为SIMPLE,则将使用<simpleEDP>元素。如果设置为STATIC,则将执行EDPStatic,并使用<static_edp_xml_config>中设置的XML文件内容进行配置。请参见发现。SIMPLESTATICSIMPLE
<simpleEDP>简单发现协议的属性。请参见简单EDP属性。simpleEDP
<leaseDuration>指示DomainParticipant应将远程DomainParticipant视为活动状态的时长。请参见租约持续时间。DurationType20s
<leaseAnnouncement>DomainParticipant向所有其他已发现的DomainParticipant以及所有多播端口发送其发现消息的周期。请参见公告周期。DurationType3s
<initialAnnouncements>允许用户配置DomainParticipant的初始发现消息的数量和周期。请参见初始公告。初始公告
<clientAnnouncementPeriod>DomainParticipant向其服务器发送发现消息并检查匹配的EDP端点的周期。DurationType450 ms
<static_edp_xml_config>包含静态EDP配置的XML文件名。仅当<EDP>成员设置为STATIC时才需要。请参见静态发现设置。List <string>

ignoreParticipantFlags

可能的值描述
NO_FILTER处理所有发现流量。
FILTER_DIFFERENT_HOST丢弃来自其他主机的发现流量。
FILTER_DIFFERENT_PROCESS丢弃来自同一主机上其他进程的发现流量。
FILTER_SAME_PROCESS丢弃来自DomainParticipant自身进程的发现流量。

此选项还支持OR(|)运算符,以过滤来自其他配置的发现流量。例如,FILTER_DIFFERENT_PROCESS|FILTER_SAME_PROCESS值会丢弃来自DomainParticipant自身主机的发现流量。

simpleEDP

名称描述默认值
<PUBWRITER_SUBREADER>指示参与者是否必须使用发布DataWriter和订阅DataReader。booltrue
<PUBREADER_SUBWRITER>指示参与者是否必须使用发布DataReader和订阅DataWriter。booltrue

初始公告

名称描述默认值
<count><period>指定的周期发送的初始发现消息的数量。在这些公告之后,DomainParticipant将继续以<leaseAnnouncement>速率发送其发现消息。uint32_t5
<period>DomainParticipant发送其发现消息的周期。DurationType100 ms

10.3.2.3. 端口配置

根据RTPS标准(第9.6.1.1节),RTPSParticipants的发现流量单播监听端口使用以下公式计算:7400 + 250 ∗ DomainId + 10 + 2 ∗ ParticipantId。因此,可以指定以下参数:

名称描述默认值
<portBase>基础端口。uint16_t7400
<domainIDGain>DomainId的增益。uint16_t250
<participantIDGain>参与者ID的增益。uint16_t2
<offsetd0>多播元数据偏移量。uint16_t0
<offsetd1>单播元数据偏移量。uint16_t10
<offsetd2>多播用户数据偏移量。uint16_t1
<offsetd3>单播用户数据偏移量。uint16_t11

警告
更改这些默认参数可能会破坏与其他RTPS兼容实现的兼容性,以及与具有默认端口设置的其他Fast DDS应用程序的兼容性。

10.3.2.4. ParticipantAllocationType

ParticipantAllocationType定义了<allocation>元素,该元素允许设置与DomainParticipant上的分配行为相关的参数。有关DomainParticipants分配配置的详细文档,请参阅ParticipantResourceLimitsQos。

名称描述
<remote_locators>定义远程定位器集合的限制。请参见RemoteLocatorsAllocationAttributes。远程定位器分配
<total_participants>用于指定域中DomainParticipant总数(本地和远程)的DomainParticipant分配配置。请参见ResourceLimitedContainerConfig。分配配置
<total_readers>用于指定每个DomainParticipant上DataReader总数(本地和远程)的DomainParticipant分配配置。请参见ResourceLimitedContainerConfig。分配配置
<total_writers>与每个DomainParticipant上DataWriter总数(本地和远程)相关的DomainParticipant分配配置。请参见ResourceLimitedContainerConfig。分配配置
<max_partitions>分区子消息的最大大小。设置为零表示无限制。uint32_t
<max_user_data>用户数据子消息的最大大小。设置为零表示无限制。uint32_t
<max_properties>属性子消息的最大大小。设置为零表示无限制。uint32_t
<send_buffers>发送缓冲区管理器的分配行为。发送缓冲区

示例

<allocation><remote_locators><max_unicast_locators>4</max_unicast_locators><max_multicast_locators>1</max_multicast_locators></remote_locators><total_participants><initial>0</initial><maximum>0</maximum><increment>1</increment></total_participants><total_readers><initial>0</initial><maximum>0</maximum><increment>1</increment></total_readers><total_writers><initial>0</initial><maximum>0</maximum><increment>1</increment></total_writers><max_partitions>256</max_partitions><max_user_data>256</max_user_data><max_properties>512</max_properties><send_buffers><preallocated_number>127</preallocated_number><dynamic>true</dynamic><network_buffers_config><initial>16</initial><maximum>0</maximum><increment>16</increment></network_buffers_config></send_buffers><!-- content_filter 尚不能使用XML进行配置 -->
</allocation>
10.3.2.4.1. 远程定位器分配
名称描述默认值
<max_unicast_locators>远程实体上预期的最大单播定位器数量。建议使用运行DomainParticipant的机器上可用的最大网络接口数量。请参见RemoteLocatorsAllocationAttributes。uint32_t4
<max_multicast_locators>远程实体上预期的最大多播定位器数量。可以设置为零以禁用多播流量。请参见RemoteLocatorsAllocationAttributes。uint32_t1
10.3.2.4.2. 发送缓冲区
名称描述默认值
<preallocated_number>要分配的初始发送缓冲区数量。请参见SendBuffersAllocationAttributes。uint32_t0
<dynamic>是否允许发送缓冲区的数量增加。请参见SendBuffersAllocationAttributes。boolfalse
<network_buffers_config>用于指定为每个发送缓冲区分配的网络缓冲区数量的网络缓冲区分配配置。请参见ResourceLimitedContainerConfig。分配配置(16,无限,16)

注意
preallocated_number的默认值0将根据可以启动发送操作的线程数量初步猜测所需的缓冲区数量。因此,它并不意味着没有缓冲区,而是会使用可用的最大缓冲区数量。相反,network_buffers_config的默认值为初始16个缓冲区,最大为无限,每个发送缓冲区增加16个缓冲区。初始值为0意味着更多的动态分配,尤其是在执行开始时。如有疑问,应保留默认值。

10.4. DataWriter 配置文件

DataWriter配置文件允许通过XML文件配置DataWriter。这些配置文件在<data_writer>XML标签内定义。

10.4.1. DataWriter XML属性

<data_writer>元素定义了两个属性:profile_nameis_default_profile

名称描述使用
profile_name设置<data_writer>配置文件在DDS域中注册时使用的名称,以便DomainParticipant稍后可以加载它,如加载和应用配置文件中所示。必选
is_default_profile<data_writer>配置文件设置为默认配置文件。因此,如果存在默认配置文件,则在创建DataWriter时未指定其他DataWriter配置文件时,将使用该默认配置文件。可选

10.4.2. DataWriter配置

DataWriter的配置通过下表所列的XML元素进行。

名称描述默认值
<topic>DataWriter的TopicType配置。TopicType
<qos>DataWriter的QoS配置。QoS
<times>配置DataWriter的一些与时间相关的参数。WriterTimes
<unicastLocatorList>输入单播定位器列表。需要一个LocatorListType。<locator>
<multicastLocatorList>输入多播定位器列表。需要一个LocatorListType。<locator>
<external_unicast_locators>用于宣布与该DataWriter通信的外部定位器列表。ExternalLocatorListType
<ignore_non_matching_locators>当从其他实体收到的公告中的定位器与该DataWriter宣布的任何定位器不匹配时,是否忽略这些定位器。boolfalse
<historyMemoryPolicy>DataWriter历史记录的内存分配方式。参见HistoryQosPolicyKind。HistoryMemoryPolicyPREALLOCATED
<propertiesPolicy>附加的配置属性。PropertiesPolicyType
<userDefinedID>用于EDPStaticint16_t-1
<entityID>设置RTPSEndpointQos类的entity_idint16_t-1
<matchedSubscribersAllocation>设置已匹配的DataReader集合的限制。参见ParticipantResourceLimitsQos。分配配置

示例

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com"><profiles><data_writer profile_name="datawriter_profile_name"><topic><historyQos><kind>KEEP_LAST</kind></historyQos></topic><qos><!-- QOS --></qos><times> <!-- writerTimesType --><initial_heartbeat_delay><nanosec>12</nanosec></initial_heartbeat_delay><heartbeat_period><sec>3</sec></heartbeat_period><nack_response_delay><nanosec>5</nanosec></nack_response_delay><nack_supression_duration><sec>0</sec></nack_supression_duration></times><unicastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></unicastLocatorList><multicastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></multicastLocatorList><external_unicast_locators><!-- EXTERNAL_LOCATOR_LIST --><udpv4 externality="1" cost="0" mask="24"><address>100.100.100.10</address><port>12345</port></udpv4></external_unicast_locators><ignore_non_matching_locators>true</ignore_non_matching_locators><historyMemoryPolicy>DYNAMIC</historyMemoryPolicy><!-- PROPERTIES_POLICY --><propertiesPolicy><properties><property><name>PropertyName</name><value>PropertyValue</value></property></properties></propertiesPolicy><userDefinedID>55</userDefinedID><entityID>66</entityID><matchedSubscribersAllocation><initial>0</initial><maximum>0</maximum><increment>1</increment></matchedSubscribersAllocation><!-- reader_filters_allocation 尚不能使用XML进行配置 --></data_writer></profiles>
</dds>

注意

  • LOCATOR_LIST表示需要一个LocatorListType。
  • EXTERNAL_LOCATOR_LIST表示需要一个ExternalLocatorListType。
  • PROPERTIES_POLICY表示该标签是一个PropertiesPolicyType块。
  • 有关QOS的详细信息,请参阅QoS。
  • TOPIC_TYPE在TopicType部分中有详细说明。

10.4.2.1. WriterTimes

这些参数包含在RTPSReliableWriterQos的WriterTimes结构中。

名称描述默认值
<initial_heartbeat_delay>初始心跳延迟。DurationType12 ms
<heartbeat_period>周期性心跳周期。DurationType3 s
<nack_response_delay>应用于ACKNACK消息响应的延迟。DurationType5 ms
<nack_supression_duration>该时间允许DataWriter在数据发送后的特定时间段内忽略NACK消息。DurationType0 ms

10.5. DataReader 配置文件

DataReader配置文件允许通过XML文件声明DataReader。这些配置文件在<data_reader>XML标签内定义。

10.5.1. DataReader XML属性

<data_reader>元素定义了两个属性:profile_nameis_default_profile

名称描述使用
profile_name设置<data_reader>配置文件在DDS域中注册时使用的名称,以便DomainParticipant稍后可以加载它,如加载和应用配置文件中所示。必选
is_default_profile<data_reader>配置文件设置为默认配置文件。因此,如果存在默认配置文件,则在创建DataReader时未指定其他DataReader配置文件时,将使用该默认配置文件。可选

10.5.2. DataReader配置

DataReader的配置通过下表所列的XML元素进行。

名称描述默认值
<topic>DataReader的TopicType配置。TopicType
<qos>订阅者的QoS配置。QoS
<times>允许配置DataReader的一些与时间相关的参数。ReaderTimes
<unicastLocatorList>输入单播定位器列表。需要一个LocatorListType。LocatorListType列表
<multicastLocatorList>输入多播定位器列表。需要一个LocatorListType。LocatorListType列表
<external_unicast_locators>用于宣布与该DataReader通信的外部定位器列表。ExternalLocatorListType
<ignore_non_matching_locators>当从其他实体收到的公告中的定位器与该DataReader宣布的任何定位器不匹配时,是否忽略这些定位器。boolfalse
<expects_inline_qos>指示是否期望QoS内联。boolfalse
<historyMemoryPolicy>DataReader历史记录的内存分配方式。HistoryMemoryPolicyPREALLOCATED
<propertiesPolicy>附加的配置属性。PropertiesPolicyType
<userDefinedID>用于静态端点发现(StaticEndpointDiscovery)。int16_t-1
<entityID>设置RTPSEndpointQos类的entity_idint16_t-1
<matchedPublishersAllocation>设置已匹配的DataWriter集合的限制。参见ParticipantResourceLimitsQos。分配配置

示例

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com"><profiles><data_reader profile_name="data_reader_profile_name"><topic><historyQos><kind>KEEP_LAST</kind></historyQos></topic><qos><!-- QOS --></qos><times> <!-- readerTimesType --><initial_acknack_delay><nanosec>70</nanosec></initial_acknack_delay><heartbeat_response_delay><nanosec>5</nanosec></heartbeat_response_delay></times><unicastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></unicastLocatorList><multicastLocatorList><!-- LOCATOR_LIST --><locator><udpv4><address>192.168.0.1</address></udpv4></locator></multicastLocatorList><external_unicast_locators><!-- EXTERNAL_LOCATOR_LIST --><udpv4 externality="1" cost="0" mask="24"><address>100.100.100.10</address><port>12345</port></udpv4></external_unicast_locators><ignore_non_matching_locators>true</ignore_non_matching_locators><expects_inline_qos>true</expects_inline_qos><historyMemoryPolicy>DYNAMIC</historyMemoryPolicy><!-- PROPERTIES_POLICY --><propertiesPolicy><properties><property><name>PropertyName</name><value>PropertyValue</value></property></properties></propertiesPolicy><userDefinedID>55</userDefinedID><entityID>66</entityID><matchedPublishersAllocation><initial>0</initial><maximum>0</maximum><increment>1</increment></matchedPublishersAllocation></data_reader></profiles>
</dds>

注意

  • LOCATOR_LIST表示需要一个LocatorListType。
  • EXTERNAL_LOCATOR_LIST表示需要一个ExternalLocatorListType。
  • PROPERTIES_POLICY表示该标签是一个PropertiesPolicyType块。
  • 有关QOS的详细信息,请参阅QoS。
  • TOPIC_TYPE在TopicType部分中有详细说明。

10.5.2.1. ReaderTimes

这些参数包含在RTPSReliableReaderQos的ReaderTimes结构中。

名称描述默认值
<initial_acknack_delay>初始ACKNACK延迟。DurationType70 ms
<heartbeat_response_delay>收到心跳(Heartbeat)时的响应时间延迟。DurationType5 ms

10.6. Topic 配置文件

Topic配置文件允许通过XML文件配置Topic。这些配置文件在<topic>XML标签内定义。

10.6.1. Topic XML属性

<topic>元素定义了两个属性:profile_nameis_default_profile

名称描述使用
profile_name设置<topic>配置文件在DDS域中注册时使用的名称,以便DataWriter或DataReader稍后可以加载它。必选
is_default_profile<topic>配置文件设置为默认配置文件。因此,如果存在默认配置文件,则在创建Topic时未指定其他Topic配置文件时,将使用该默认配置文件。可选

10.6.2. Topic配置

该XML元素允许配置TopicQos。

名称描述
<historyQos>控制当实例的值在最终传送到某些现有DataReader之前发生更改时,Fast DDS的行为。HistoryQoS
<resourceLimitsQos>控制Fast DDS可使用的资源,以满足应用程序和其他QoS设置所施加的要求。ResourceLimitsQos

示例

<topic profile_name="topic_example"><historyQos><kind>KEEP_LAST</kind><depth>20</depth></historyQos><resourceLimitsQos><max_samples>5</max_samples><max_instances>2</max_instances><max_samples_per_instance>1</max_samples_per_instance><allocated_samples>20</allocated_samples><extra_samples>10</extra_samples></resourceLimitsQos>
</topic>

10.7. 传输描述符

本节定义了可用于配置 Fast DDS 中传输层参数的 XML 元素。这些元素在 XML 标签 <transports_descriptors> 内定义。<transports_descriptors> 可以包含一个或多个 <transport_descriptor> XML 元素。每个 <transport_descriptor> 元素定义了特定类型传输协议的配置。每个 <transport_descriptor> 元素通过 <transport_id> XML 标签的传输 ID 进行唯一标识。一旦用户定义了有效的 <transports_descriptor>(即定义了传输层参数),就可以使用 <transport_id> XML 标签将其加载到 DomainParticipant 的 XML 配置文件中。关于如何将 <transport_descriptor> 加载到 DomainParticipant 的 XML 配置文件中的示例可在 DomainParticipant 配置文件中找到。

下表列出了可在 <transport_descriptor> 元素内定义的用于配置传输层的所有可用 XML 元素。每个元素的更详细说明可在传输层中找到。

名称描述默认值
<transport_id>用于标识每个传输描述符的唯一名称。string-
<type>传输描述符的类型。UDPv4、UDPv6、TCPv4、TCPv6、SHMUDPv4
<sendBufferSize>发送套接字缓冲区的大小(以字节为单位)。如果该值为 0,则 Fast DDS 将使用系统默认的套接字大小。uint32_t0
<receiveBufferSize>接收套接字缓冲区的大小(以字节为单位)。如果该值为 0,则 Fast DDS 将使用系统默认的套接字大小。uint32_t0
<maxMessageSize>传输消息缓冲区的最大大小(以字节为单位)。uint32_t65500
<maxInitialPeersRange>与每个初始远程对等端打开的通道数量。uint32_t4
<netmask_filter>传输的子网掩码过滤配置。OFF、AUTO、ONAUTO
<interfaces>允许定义接口配置。接口配置-
<interfaceWhiteList>允许定义接口白名单。白名单-
<TTL>生存时间(仅适用于 UDP)。参见 UDP 传输。uint8_t1
<non_blocking_send>是否在套接字上设置非阻塞发送模式(SHM 类型不支持)。参见 UDPTransportDescriptor 和 TCPTransportDescriptor。boolfalse
<output_port>用于输出绑定的端口。如果未定义此字段,则输出端口将是随机的(仅适用于 UDP)。uint16_t0
<wan_addr>使用 TCPv4 传输时的公共广域网地址。如果传输不需要定义广域网地址,则此字段为可选(仅适用于 TCPv4)。IPv4 格式的 stringXXX.XXX.XXX.XXX-
<keep_alive_frequency_ms>发送 RTCP 保活请求的频率(以毫秒为单位)(仅适用于 TCP)。uint32_t50000
<keep_alive_timeout_ms>自上次发送保活请求后,判定连接中断的时间(以毫秒为单位)(仅适用于 TCP)。uint32_t10000
<max_logical_port>RTCP 协商期间尝试的最大逻辑端口数量(仅适用于 TCP)。uint16_t100
<logical_port_range>RTCP 协商期间每次请求尝试的最大逻辑端口数量(仅适用于 TCP)。uint16_t20
<logical_port_increment>RTCP 协商期间尝试的逻辑端口之间的增量(仅适用于 TCP)。uint16_t2
<listening_ports>作为 TCP 接受器用于输入连接的本地端口。如果未设置,传输将仅作为 TCP 客户端工作。如果设置为 0,将自动分配一个可用端口(仅适用于 TCP)。List <uint16_t>-
<tls>允许定义与 TLS 相关的参数和选项(仅适用于 TCP)。TLS 配置-
<calculate_crc>计算循环冗余码(CRC)以进行错误控制(仅适用于 TCP)。booltrue
<check_crc>检查 CRC 以进行错误控制(仅适用于 TCP)。booltrue
<enable_tcp_nodelay>用于禁用 Nagle 算法的套接字选项(仅适用于 TCP)。boolfalse
<tcp_negotiation_timeout>等待逻辑端口协商的时间(以毫秒为单位)(仅适用于 TCP)。uint32_t0
<segment_size>共享内存段的大小(以字节为单位)(可选,仅适用于 SHM)。uint32_t262144
<port_queue_capacity>每个监听器可用的容量(以消息数量计)(可选,仅适用于 SHM)。uint32_t512
<healthy_check_timeout_ms>用于检查监听器是否存活的最大超时时间(以毫秒为单位)(可选,仅适用于 SHM)。uint32_t1000
<rtps_dump_file>用于存储 RTPS 消息以进行调试的完整路径(包括文件)。空字符串表示不执行跟踪(可选,仅适用于 SHM)。string

以下 XML 代码展示了使用所有可配置参数的传输协议配置示例。更多传输描述符示例可在传输层部分找到。

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com"><profiles><transport_descriptors><transport_descriptor><transport_id>my_udpv4_transport</transport_id><type>UDPv4</type><sendBufferSize>8192</sendBufferSize><receiveBufferSize>8192</receiveBufferSize><maxMessageSize>16384</maxMessageSize><maxInitialPeersRange>100</maxInitialPeersRange><netmask_filter>AUTO</netmask_filter><interfaces><allowlist><interface name="wlp59s0" netmask_filter="ON"/></allowlist><blocklist><interface name="127.0.0.1"/><interface name="docker0"/></blocklist></interfaces><interfaceWhiteList><address>192.168.1.41</address><interface>lo</interface></interfaceWhiteList><TTL>250</TTL><non_blocking_send>false</non_blocking_send><output_port>5101</output_port><wan_addr>80.80.55.44</wan_addr><keep_alive_frequency_ms>5000</keep_alive_frequency_ms><keep_alive_timeout_ms>25000</keep_alive_timeout_ms><max_logical_port>9000</max_logical_port><logical_port_range>100</logical_port_range><logical_port_increment>2</logical_port_increment><listening_ports><port>5100</port><port>5200</port></listening_ports><tls><!-- TLS Section --></tls><calculate_crc>false</calculate_crc><check_crc>false</check_crc><enable_tcp_nodelay>false</enable_tcp_nodelay><segment_size>262144</segment_size><port_queue_capacity>512</port_queue_capacity><healthy_check_timeout_ms>1000</healthy_check_timeout_ms><rtps_dump_file>rtsp_messages.log</rtps_dump_file></transport_descriptor></transport_descriptors></profiles>
</dds>

注意:实时传输控制协议(RTCP)是在 TCP/IP 连接上与 RTPS 进行通信的控制协议。

10.7.1. TLS 配置

Fast DDS 提供了通过 <transport_descriptor><tls> XML 元素配置传输层安全(TLS)协议参数的机制。有关 Fast DDS 中完整 TLS 配置的详细说明,请参考 TCP 上的 TLS。有关如何在 Fast DDS 中设置安全通信的更多信息,请参见安全部分。

警告:要完全理解本节,需要具备有关 SSL/TLS、证书颁发机构(CA)、公钥基础设施(PKI)和 Diffie-Hellman 的网络安全基础知识;加密协议不会详细解释。

可在 <tls> 元素内定义的用于配置 TLS 协议的所有可用 XML 元素如下表所示:

名称描述默认值
<password>如果提供了 <private_key_file><rsa_private_key_file>,则为此处的密码。string-
<private_key_file>私钥证书文件的路径。string-
<rsa_private_key_file>RSA 私钥证书文件的路径。string-
<cert_chain_file>公共证书链文件的路径。string-
<tmp_dh_file>Diffie-Hellman 参数文件的路径。string-
<verify_file>证书颁发机构(CA)文件的路径。string-
<verify_mode>建立验证模式掩码。可以在同一个 <transport_descriptor> 中组合多个验证选项。VERIFY_NONEVERIFY_PEERVERIFY_FAIL_IF_NO_PEER_CERTVERIFY_CLIENT_ONCE-
<options>建立 SSL 上下文选项掩码。可以在同一个 <transport_descriptor> 中组合多个选项。DEFAULT_WORKAROUNDSNO_COMPRESSIONNO_SSLV2NO_SSLV3NO_TLSV1NO_TLSV1_1NO_TLSV1_2NO_TLSV1_3SINGLE_DH_USE-
<verify_paths>系统将查找验证文件的路径。List <string>-
<verify_depth>验证中间证书的最大允许深度。uint32_t-
<default_verify_path>指定系统是否在默认路径中查找验证文件。boolfalse
<handshake_role>传输在握手时将承担的角色。默认情况下,接受器充当 SERVER,连接器充当 CLIENTDEFAULTSERVERCLIENTDEFAULT
<server_name>如果使用服务器名称指示(SNI),则需要服务器名称或主机名。string-

下面显示了 TLS 协议参数配置的示例。

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com"><profiles><transport_descriptors><transport_descriptor><transport_id>Test</transport_id><type>TCPv4</type><tls><password>Password</password><private_key_file>Key_file.pem</private_key_file><rsa_private_key_file>RSA_file.pem</rsa_private_key_file><cert_chain_file>Chain.pem</cert_chain_file><tmp_dh_file>DH.pem</tmp_dh_file><verify_file>verify.pem</verify_file><verify_mode><verify>VERIFY_PEER</verify></verify_mode><options><option>NO_TLSV1</option><option>NO_TLSV1_1</option></options><verify_paths><verify_path>Path1</verify_path><verify_path>Path2</verify_path><verify_path>Path3</verify_path></verify_paths><verify_depth>55</verify_depth><default_verify_path>true</default_verify_path><handshake_role>SERVER</handshake_role><server_name>my_server.com</server_name></tls></transport_descriptor>
<!--></profiles>

该网页主要介绍了Fast DDS中进程内传输配置文件的相关内容,具体如下:

  1. 配置位置:进程内传输的设置参数通过XML标签<library_settings>内的元素进行配置。
  2. 配置项说明
    • 配置项为<intraprocess_delivery>,其作用是通过避免传输层的开销,加快同一进程内实体之间的通信。
    • 可用值包括OFFUSER_DATA_ONLYFULL
    • 默认值为OFF
  3. 示例
<library_settings><intraprocess_delivery>FULL</intraprocess_delivery> <!-- OFF | USER_DATA_ONLY | FULL -->
</library_settings>

10.9. 日志配置文件

eProsima Fast DDS 允许使用 XML 配置文件注册和配置日志消费者。有关 Fast DDS 可扩展日志内置模块的更多信息,请参阅日志记录。日志配置文件在 <log> XML 标签内定义。<log> 元素包含三个子元素:<use_default><consumer><thread_settings>。下面的表格对这些元素进行了描述。

名称描述默认值
<use_default>如果设置为 FALSE,则会调用 Log::ClearConsumers()。参见注册消费者。booltrue
<consumer>定义要注册的消费者的类和配置。可以通过这种方式注册多个消费者。参见消费者。ConsumerDataType-
<thread_settings>日志线程的线程设置。ThreadSettings-

以下是一个 XML 配置文件的示例,该文件设置 Log 使用一个 StdoutConsumer、一个 StdoutErrConsumer 和一个 FileConsumer

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com"><log><!--清除消费者--><use_default>false</use_default><!--StdoutConsumer 没有任何属性--><consumer><class>StdoutConsumer</class></consumer><!--阈值设置为 Log::Kind::Error 的 StdoutErrConsumer--><consumer><class>StdoutErrConsumer</class><property><name>stderr_threshold</name><value>Log::Kind::Error</value></property></consumer><!--以追加模式打开 "execution.log" 的 FileConsumer--><consumer><class>FileConsumer</class><property><name>filename</name><value>execution.log</value></property><property><name>append</name><value>true</value></property></consumer><!--日志消费者线程的 ThreadSettings--><thread_settings><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></thread_settings></log>
</dds>

10.9.1. ConsumerDataType

名称描述
<class>消费者的类。StdoutConsumerStdoutErrConsumerFileConsumer
<property>此元素用于配置日志消费者,仅当 <class> 设置为 StdoutErrConsumerFileConsumer 时适用。PropertyType

10.9.2. PropertyType

名称描述默认值
<name>要配置的属性名称。filenameappendstderr_threshold-
<value>属性的值。-
<name> 设置为 filename,则此元素包含日志文件的名称。此属性仅当 <class> 设置为 FileConsumer 时适用。stringoutput.log
<name> 设置为 append,则此元素定义消费者在创建时是打开文件以追加内容还是覆盖内容。此属性仅当 <class> 设置为 FileConsumer 时适用。Booleanfalse
<name> 设置为 stderr_threshold,则此元素定义日志消费者使用的阈值。此属性仅当 <class> 设置为 StdoutErrConsumer 时适用。Log::KindLog::Kind::Warning

10.10. 动态类型配置文件

Fast DDS 支持通过 XML 文件定义动态语言绑定的实现。因此,无需修改 DDS 应用程序的源代码,就可以修改主题数据类型。

10.10.1. XML 结构

XML 文件中数据类型配置文件的定义通过 types 标签完成。每个 types 元素可以包含一个或多个类型定义。在一个 types 元素中定义多个类型,与为每个类型单独使用一个 types 元素,效果是相同的。下面是一个通过 XML 进行独立类型定义的示例。

<types xmlns="http://www.eprosima.com"><type><!-- 类型定义 --></type><type><!-- 类型定义 --><!-- 类型定义 --></type>
</types>

注意:有关根定义和独立定义之间差异的更多信息,请参阅根配置文件与独立配置文件定义部分。

10.10.2. 类型定义

下面介绍 eProsima Fast DDS 支持的类型。有关支持的动态语言绑定的更多信息,请参阅支持的类型。对于下面列出的每种类型,都提供了如何构建该类型的 XML 配置文件的示例。

  • 基本类型
  • 字符串类型
  • 枚举类型
  • 位掩码类型
  • 别名类型
  • 序列类型
  • 数组类型
  • 映射类型
  • 结构类型
  • 联合类型
  • 位集类型

10.10.2.1. 成员类型

成员类型被定义为可以属于结构(Struct)或联合(Union),或者被别名(Alias)别名化的任何类型。这些可以通过 <member> XML 标签来定义。通过将 key 属性设置为 "true",可以将成员标注为 key(相当于 IDL 中的 @key)。

<member name="my_long" type="int32" key="true"/>

10.10.2.2. 基本类型

基本类型是内置类型,它们应被声明为聚合类型(结构类型或联合类型)的成员。基本类型通过 type 属性声明,可能的值如下表所示。有关基本类型的更多信息,请参阅基本类型。

booleanbytechar8char16int32
uint32int8uint8int16uint16
int64uint64float32float64float128

所有基本类型的声明如下:

XML

<struct name="PrimitivesStruct"><member name="my_bool" type="boolean"/><member name="my_octet" type="byte"/><member name="my_char" type="char8"/><member name="my_wchar" type="char16"/><member name="my_long" type="int32"/><member name="my_ulong" type="uint32"/><member name="my_int8" type="int8"/><member name="my_uint8" type="uint8"/><member name="my_short" type="int16"/><member name="my_ushort" type="uint16"/><member name="my_longlong" type="int64"/><member name="my_ulonglong" type="uint64"/><member name="my_float" type="float32"/><member name="my_double" type="float64"/><member name="my_longdouble" type="float128"/>
</struct>

IDL

struct PrimitivesStruct
{boolean my_bool;octet my_octet;char my_char;wchar my_wchar;long my_long;unsigned long my_ulong;int8 my_int8;uint8 my_uint8;short my_short;unsigned short my_ushort;long long my_longlong;unsigned long long my_ulonglong;float my_float;double my_double;long double my_longdouble;
};

10.10.2.3. 字符串类型

字符串类型应被定义为聚合类型(结构类型或联合类型)的成员。字符串类型通过将 type 属性设置为 stringwstring 来定义。可以使用可选属性 stringMaxLength 来设置字符串集合的最大长度。有关字符串类型的更多信息,请参阅字符串类型。

XML

<struct name="StringsStruct"><member name="my_string" type="string"/><member name="my_wstring" type="wstring"/><member name="my_bounded_string" type="string" stringMaxLength="41925"/><member name="my_bounded_wstring" type="wstring" stringMaxLength="20925"/>
</struct>

IDL

struct StringsStruct
{string my_string;wstring my_wstring;string<41925> my_bounded_string;wstring<20925> my_bounded_wstring;
};

10.10.2.4. 枚举类型

枚举类型使用 <enum> 标签定义。name 属性和至少一个 <enumerator> 子元素是必需的。枚举常量使用 <enumerator> 标签定义,且 name 属性是必需的。可选地,可以添加无符号整数属性 value 来为枚举常量设置特定值。

注意:value 属性等同于 @value 内置标注。

有关枚举类型的更多信息,请参阅枚举类型。

XML

<enum name="MyEnum"><enumerator name="A" value="0"/><enumerator name="B" value="1"/><enumerator name="C"/>
</enum><struct name="EnumStruct"><member name="my_enum" type="nonBasic" nonBasicTypeName="MyEnum"/>
</struct>

IDL

enum MyEnum
{A,B,C
};struct EnumStruct
{MyEnum my_enum;
};

10.10.2.5. 位掩码类型

位掩码类型使用 <bitmask> 标签定义。name 属性和至少一个 <bit_value> 子元素是必需的。可选地,可以设置 bit_bound 属性来指定位掩码的边界(默认是 32 位)。位标志元素使用 <bit_value> 标签定义,name 属性是必需的。可选地,可以定义 position 属性来设置位标志在位掩码中的位置。有关位掩码类型的更多信息,请参阅位掩码类型。

XML

<bitmask name="MyBitMask" bit_bound="8"><bit_value name="flag0" position="0"/><bit_value name="flag1"/><bit_value name="flag2"/><bit_value name="flag5" position="5"/>
</bitmask><struct name="BitmaskStruct"><member name="my_bitmask" type="nonBasic" nonBasicTypeName="MyBitMask"/>
</struct>

IDL

@bit_bound(8)
bitmask MyBitMask
{@position(0) flag0,flag1,flag2,@position(5) flag5
};struct BitmaskStruct
{MyBitMask my_bitmask;
};

10.10.2.6. 别名类型

别名类型使用 <typedef> 标签定义。nametype 属性是必需的。根据被别名化的类型,可能需要或可使用其他一些必需和/或可选属性。非基本类型必须将 type 属性定义为 nonBasic,并包含 nonBasicTypeName 属性,其值为被别名化类型的名称。有关别名类型的更多信息,请参阅别名类型。

XML

<typedef name="MyAliasedEnum" type="nonBasic" nonBasicTypeName="MyEnum"/><!-- XSD 不允许为别名化的字符串设置边界 -->
<typedef name="MyAliasedBoundedString" type="string"/><typedef name="MyRecursiveAlias" type="nonBasic" nonBasicTypeName="MyAliasedEnum"/><struct name="AliasStruct"><member name="my_aliased_enum" type="nonBasic" nonBasicTypeName="MyAliasedEnum"/><member name="my_aliased_bounded_string" type="nonBasic" nonBasicTypeName="MyAliasedBoundedString"/><member name="my_recursive_alias" type="nonBasic" nonBasicTypeName="MyRecursiveAlias"/>
</struct>

IDL

typedef MyEnum MyAliasedEnum;
typedef string<100> MyAliasedBoundedString;
typedef MyAliasedEnum MyRecursiveAlias;struct AliasStruct
{MyAliasedEnum my_aliased_enum;MyAliasedBoundedString my_aliased_bounded_string;MyRecursiveAlias my_recursive_alias;
};

10.10.2.7. 序列类型

序列类型应被定义为聚合类型(结构类型或联合类型)的成员。序列类型通过必需属性 type(设置为集合的元素类型)和 sequenceMaxLength(用于设置集合的最大长度)来定义。无界序列应将 sequenceMaxLength 属性设置为 -1。有关序列类型的更多信息,请参阅序列类型。

XML

<struct name="SequenceStruct"><member name="bitmask_sequence" type="nonBasic" nonBasicTypeName="MyBitMask" sequenceMaxLength="-1"/><member name="short_sequence" sequenceMaxLength="5" type="int16"/>
</struct>

IDL

struct SequenceStruct
{sequence<MyBitMask> bitmask_sequence;sequence<short, 5> short_sequence;
};

10.10.2.8. 数组类型

数组类型应被定义为聚合类型(结构类型或联合类型)的成员。数组类型通过必需属性 type(设置为集合的元素类型)和 arrayDimensions(用于设置集合的维度)来定义。arrayDimensions 属性值的格式是每个维度的大小,用逗号分隔。有关数组类型的更多信息,请参阅数组类型。

XML

<struct name="ArrayStruct"><member name="long_array" type="int32" arrayDimensions="2,3,4"/>
</struct>

IDL

struct ArrayStruct
{long long_array[2][3][4];
};

10.10.2.9. 映射类型

映射类型应被定义为聚合类型(结构类型或联合类型)的成员。映射类型通过必需属性 type(设置为映射的值类型)、key_type(设置为映射的键类型)和 mapMaxLength(用于设置映射的键值对最大数量)来定义。无界映射应将 mapMaxLength 属性设置为 -1。有关映射类型的更多信息,请参阅映射类型。

XML

<struct name="MapStruct"><member name="string_alias_unbounded_map" type="nonBasic" nonBasicTypeName="MyAliasedBoundedString" key_type="string" mapMaxLength="-1"/><member name="short_long_map" type="int32" key_type="int16" mapMaxLength="2"/>
</struct>

IDL

struct MapStruct
{map<string, MyAliasedBoundedString> string_alias_unbounded_map;map<short, long, 2> short_long_map;
};

10.10.2.10. 结构类型

结构类型使用 <struct> 标签定义,name 属性是必需的。可以通过设置可选属性 baseType 来配置结构继承。XML 结构类型至少需要定义一个成员。

注意:IDL 4.1 版本规范引入了空内容结构的可能性。XML 类型配置文件尚不支持空结构。

结构成员使用 <member> 标签定义,nametype 属性是必需的。根据成员类型,可能需要或可使用其他一些必需和/或可选属性。非基本类型必须将 type 属性定义为 nonBasic,并包含 nonBasicTypeName 属性,其值为成员类型的名称。

注意:目前,XML 类型配置文件不支持设置成员 ID 或将成员标记为键。

有关结构类型的更多信息,请参阅结构类型。

XML

<struct name="InnerStruct"><!-- XML 不支持设置成员 ID --><member name="first" type="int32"/>
</struct><!-- TODO(XTypes: Fix inheritance loading from XML profile) Fast DDS#4626 -->
<!-- <struct name="ParentStruct"><member name="first" type="float32"/><member name="second" type="int64"/>
</struct><struct name="ComplexStruct" baseType="ParentStruct"><member name="complex_member" type="nonBasic" nonBasicTypeName="InnerStruct"/>
</struct> -->

IDL

struct InnerStruct
{@id(0x10) long first;
};struct ParentStruct
{float first;long long second;
};struct ComplexStruct : ParentStruct
{InnerStruct complex_member;
};

10.10.2.11. 联合类型

联合类型使用 <union> 标签定义,name 属性是必需的。必须使用 <discriminator> 标签定义一个必需的鉴别器子元素。鉴别器元素需要 type 作为必需属性。

联合类型还需要至少一个使用 <case> 标签定义的情况子元素。每个情况子元素至少需要一个使用 <caseDiscriminator> 标签的标签子元素。value 属性是必需的,用于定义标签值。可以使用多个 <caseDiscriminator> 元素来定义多个标签。每个情况子元素必须专门定义一个联合成员。

联合成员使用 <member> 标签定义,nametype 属性是必需的。根据成员类型,可能需要或可使用其他一些必需和/或可选属性。非基本类型必须将 type 属性定义为 nonBasic,并包含 nonBasicTypeName 属性,其值为成员类型的名称。为了使联合类型一致,必须至少定义一个联合成员。

注意:目前,XML 类型配置文件不支持设置成员 ID 或将成员标记为键。

有关联合类型的更多信息,请参阅联合类型。

XML

<union name="InnerUnion"><discriminator type="int16"/><case><caseDiscriminator value="0"/><member name="first" type="nonBasic" nonBasicTypeName="PrimitivesStruct"/></case><case><caseDiscriminator value="1"/><caseDiscriminator value="default"/><member name="second" type="int64"/></case>
</union><union name="ComplexUnion"><discriminator type="int32"/><case><caseDiscriminator value="0"/><caseDiscriminator value="1"/><member name="third" type="int32"/></case><case><caseDiscriminator value="default"/><member name="fourth" type="nonBasic" nonBasicTypeName="InnerUnion"/></case>
</union>

IDL

union InnerUnion switch (short)
{case 0:@id(0x10) PrimitivesStruct first;case 1:default:long long second;
};union ComplexUnion switch (long)
{case 0:case 1:long third;default:InnerUnion fourth;
};

10.10.2.12. 位集类型

位集类型使用 <bitset> 标签定义,name 属性是必需的。可以通过设置可选属性 baseType 来配置位集继承。必须至少有一个使用 bitfield 标签定义的位域子元素。

位域元素需要 bit_bound 必需属性,其值为该位域管理的位数(最大 64 位)。可选地,可以定义 nametype 属性。匿名位域(未设置 name 属性)是不可访问的,用作命名位域之间的填充。type 属性可以通过显式设置处理该位域的整数类型,来简化位域管理。

有关位集类型的更多信息,请参阅位集类型。
XML

<bitset name="ParentBitset"><bitfield name="a" bit_bound="3"/><bitfield name="b" bit_bound="1"/><bitfield bit_bound="4"/><bitfield name="c" bit_bound="10"/><bitfield name="d" bit_bound="12" type="int16"/>
</bitset><!-- TODO(XTypes: Fix inheritance loading from XML profile) Fast DDS#4626 -->
<!--<bitset name="ChildBitSet" baseType="ParentBitSet"><bitfield name="e" bit_bound="1"/><bitfield name="f" bit_bound="20" type="uint32"/>
</bitset><struct name="BitsetStruct"><member name="my_bitset" type="nonBasic" nonBasicTypeName="ChildBitSet"/>
</struct>-->

IDL

bitset ParentBitSet
{bitfield<3> a;bitfield<1> b;bitfield<4>;bitfield<10> c;bitfield<12, short> d;
};bitset ChildBitSet : ParentBitSet
{bitfield<1> e;bitfield<20, unsigned long> f;
};struct BitsetStruct
{ChildBitSet my_bitset;
};
<bitfield name="b" bit_bound="1"/>
<bitfield bit_bound="4"/>
<bitfield name="c" bit_bound="10"/>
<bitfield name="d" bit_bound="12" type="int16"/>

10.10.3. 在 Fast DDS 应用程序中加载 XML 类型配置文件

一旦通过 load_XML_profiles_file() 将 XML 配置文件加载到 DomainParticipantFactory 中,Fast DDS 应用程序就可以使用这些文件中定义的类型。可以使用 DomainParticipantFactory::get_dynamic_type_builder_from_xml_by_name() 检索类型。获取动态类型后,可以实例化 DynamicPubSubType 类的对象,并用于读写数据。

// 创建 DomainParticipant
DomainParticipant* participant =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == participant)
{// 错误return;
}// 加载 XML 文件
if (RETCODE_OK ==DomainParticipantFactory::get_instance()->load_XML_profiles_file("my_profiles.xml"))
{// 检索所需类型的实例DynamicTypeBuilder::_ref_type my_struct_type;if (RETCODE_OK !=DomainParticipantFactory::get_instance()->get_dynamic_type_builder_from_xml_by_name("MyStruct", my_struct_type)){// 错误return;}// 注册 MyStruct 类型TypeSupport my_struct_type_support(new DynamicPubSubType(my_struct_type->build()));my_struct_type_support.register_type(participant, nullptr);
}
else
{std::cout << "无法打开 XML 文件 \"types.xml\"。"<< "请设置正确的 XML 文件路径"<< std::endl;
}

10.11. 通用元素

前面的XML配置文件定义了一些多个配置文件通用的XML元素。本节旨在解释这些通用元素。

  • LocatorListType
  • ExternalLocatorListType
  • PropertiesPolicyType
  • DurationType
  • TopicType
  • HistoryQoS
  • ResourceLimitsQos
  • ThreadSettings
  • BuiltinTransports
  • QoS
  • Data-Sharing(数据共享)
  • Deadline(截止时间)
  • DisableHeartbeatPiggyback(禁用心跳捎带)
  • DisablePositiveAcks(禁用肯定确认)
  • Durability(持久性)
  • Entity Factory(实体工厂)
  • GroupData(组数据)
  • LatencyBudget(延迟预算)
  • Lifespan(生存周期)
  • Liveliness(活跃度)
  • Ownership(所有权)
  • Ownership Strength(所有权强度)
  • Partition(分区)
  • PublishMode(发布模式)
  • ReliabilityQosPolicy(可靠性QoS策略)
  • TopicData(主题数据)
  • UserData(用户数据)
  • HistoryMemoryPolicy(历史记录内存策略)
  • Allocation Configuration(分配配置)

10.11.1. LocatorListType

它表示一个Locator_t列表。LocatorListType用于其他需要定位器列表的配置参数标签中,例如在<defaultUnicastLocatorList>中。因此,LocatorListType被定义为一组<locator>元素。<locator>元素有一个子元素,用于定义该定位器所使用的传输协议,包括:<udpv4><tcpv4><udpv6><tcpv6>。下面的表格概述了每个定位器可能的字段。

注意:SHM传输定位器无法配置,因为它们由SHM自动处理。

名称描述取值默认值
<port>定位器的RTPS端口号。UDP中为物理端口,TCP中为逻辑端口。uint16_t0
<physical_port>TCP的物理端口。uint16_t0
<address>定位器的IP地址。string(IPv4/IPv6格式或DNS名称)
<unique_lan_id>LAN ID唯一标识定位器所属的LAN(仅适用于TCPv4)。string(16字节)
<wan_address>WAN IPv4地址(仅适用于TCPv4)。string(IPv4格式)0.0.0.0

示例

下面的示例展示了在<defaultUnicastLocatorList>中每种传输协议的一个定位器的实现。

<defaultUnicastLocatorList><locator><udpv4><!-- 作为物理端口访问,典型的UDP用法 --><port>7400</port><address>192.168.1.41</address></udpv4><udpv4><!-- 作为物理端口访问,典型的UDP用法 --><port>7600</port><address>localhost</address></udpv4></locator><locator><tcpv4><!-- 物理端口和逻辑端口(port),在TCP传输中很有用 --><physical_port>5100</physical_port><port>7400</port><unique_lan_id>192.168.1.1.1.1.2.55</unique_lan_id><wan_address>80.80.99.45</wan_address><address>192.168.1.55</address></tcpv4></locator><locator><udpv6><port>8844</port><address>::1</address></udpv6><udpv6><port>8888</port><address>localhost</address></udpv6></locator><locator><tcpv6><!-- 物理端口和逻辑端口(port),在TCP传输中很有用 --><physical_port>5100</physical_port><port>7400</port><address>fe80::55e3:290:165:5af8</address></tcpv6></locator>
</defaultUnicastLocatorList>

10.11.2. ExternalLocatorListType

它表示外部定位器条目的列表。每个条目可以是<udpv4><udpv6>标签。这些标签可以配置以下属性:

名称描述取值默认值
externality从参与者主机到外部定位器所代表的LAN的跳数。有效值:1到255。uint8_t1
cost相对于同一外部性级别的其他定位器的通信成本。有效值:0到255。uint8_t0
mask外部定位器所代表的LAN上的有效位数。有效值:UDPv4为1到31,UDPv6为1到127uint8_t24

它们应包含以下标签:

名称描述取值
<port>定位器的UDP端口号。UDP端口号应有效。uint16_t
<address>定位器的IP地址。string(IPv4/IPv6格式或DNS名称)

示例

下面的示例展示了在<default_external_unicast_locators>中每种传输协议的一个定位器的实现。

<default_external_unicast_locators><udpv4 externality="1" cost="0" mask="24"><address>100.100.100.10</address><port>23456</port></udpv4><udpv6 externality="2" cost="0" mask="48"><address>::1</address><port>1234</port></udpv6>
</default_external_unicast_locators>

10.11.3. PropertiesPolicyType

PropertiesPolicyType定义了<propertiesPolicy>元素。它允许用户在<properties>元素内定义一组通用属性。这在定义扩展或自定义配置参数时很有用。

名称描述取值默认值
<name>用于标识属性的名称。string-
<value>属性的值。string-
<propagate>指示是否将其与所属对象一起序列化。boolfalse

示例

<propertiesPolicy><properties><property><name>Property1Name</name><value>Property1Value</value><propagate>false</propagate></property><property><name>Property2Name</name><value>Property2Value</value><propagate>true</propagate></property></properties>
</propertiesPolicy>

10.11.4. DurationType

DurationType表示一段时间,通常用于其他XML元素内部,例如在<leaseAnnouncement><leaseDuration>中。DurationType至少由两个可能的元素中的一个必填元素定义:<sec>加上<nanosec>。可以使用DURATION_INFINITYDURATION_INFINITE_SECDURATION_INFINITE_NSEC值来指定无限值。

名称描述取值默认值
<sec>秒数。int32_t0
<nanosec>纳秒数。uint32_t0

示例

<discovery_config><leaseDuration><sec>DURATION_INFINITY</sec></leaseDuration><leaseAnnouncement><sec>1</sec><nanosec>856000</nanosec></leaseAnnouncement>
</discovery_config>

10.11.5. TopicType

此XML元素允许配置DataWriter和DataReader中定义的特定HistoryQosPolicy和ResourceLimitsQosPolicy QoS。它还使用详细的策略设置TopicQos配置。

名称描述取值
<historyQos>控制当实例的值在最终传递给某些现有DataReader之前发生变化时,Fast DDS的行为。HistoryQoS
<resourceLimitsQos>控制Fast DDS为满足应用程序和其他QoS设置所施加的要求而可以使用的资源。ResourceLimitsQos

示例

<data_writer profile_name="dataWriter_topic_example"><topic><historyQos><kind>KEEP_LAST</kind><depth>20</depth></historyQos><resourceLimitsQos><max_samples>5</max_samples><max_instances>2</max_instances><max_samples_per_instance>1</max_samples_per_instance><allocated_samples>20</allocated_samples><extra_samples>10</extra_samples></resourceLimitsQos></topic>
</data_writer>

10.11.5.1. HistoryQoS

它控制当实例的值在最终传递给某些现有DataReader之前发生变化时,Fast DDS的行为。有关HistoryQoS的更多信息,请参考HistoryQosPolicyKind。

名称描述取值默认值
<kind>Fast DDS将仅尝试保留实例的最新值,并丢弃较旧的值。KEEP_LASTKEEP_LAST
Fast DDS将尝试维护并向现有DataReader传递实例的所有值。KEEP_ALL
<depth>它必须与ResourceLimitsQos的<max_samples_per_instance>元素值一致。必须验证:<depth> <= <max_samples_per_instance>uint32_t1

10.11.5.2. ResourceLimitsQos

它控制Fast DDS为满足应用程序和其他QoS设置所施加的要求而可以使用的资源。有关ResourceLimitsQos的更多信息,请参考ResourceLimitsQosPolicy。

名称描述取值默认值
<max_samples>必须验证:<max_samples> >= <max_samples_per_instance>int32_t5000
<max_instances>定义实例的最大数量。int32_t10
<max_samples_per_instance>必须验证:HistoryQos的<depth> <= <max_samples_per_instance>int32_t400
<allocated_samples>控制要存储的最大样本数。int32_t100
<extra_samples>在池中分配的额外样本数。int32_t1

10.11.6. ThreadSettings

它控制Fast DDS创建的线程的一些操作系统设置。有关ResourceLimitsQos的更多信息,请参考ThreadSettings。

名称描述取值默认值
scheduling_policy配置线程使用的调度策略。int32_t-1
priority配置线程的优先级。int32_t-2^31
affinity在某些系统(Windows、Linux)上,这是一个位掩码,用于分别设置线程与每个核心的亲和性。在MacOS上,这设置线程的亲和性标签,操作系统会尝试在具有相同亲和性的线程之间共享L2缓存。uint32_t0
stack_size配置线程的堆栈大小(以字节为单位)。int32_t-1

10.11.7. BuiltinTransports

它控制在DomainParticipant初始化期间将使用的内置传输。有关内置传输的更多信息,请参考Managing the Builtin Transports。

此类型必须遵循以下配置:

名称描述取值默认值
<builtinTransport>定义内置传输模式。NONEDEFAULTDEFAULTv6SHMUDPv4UDPv6LARGE_DATADEFAULT

<builtinTransport>标签可以配置以下属性:

名称描述取值默认值
max_msg_size在传输层中指定的最大消息大小。有效值:1到(2^32)-1。uint32_t65500
sockets_size发送和接收套接字缓冲区的大小。有效值:0到(2^32)-1。uint32_t操作系统默认值
non_blocking是否使用非阻塞发送调用。有效值:truefalseboolfalse
tcp_negotiation_timeout逻辑端口协商的超时时间。有效值:1到(2^32)-1。仅对LARGE_DATA模式有效。uint32_t0

10.11.8. QoS

服务质量(QoS)用于指定服务的行为,允许用户定义每个实体的行为方式。有关QoS的更多信息,请参考Policy部分。

名称描述取值
<data_sharing>参见DataSharingQosPolicyData-Sharing
<deadline>参见DeadlineQosPolicy。Deadline
<disable_heartbeat_piggyback>参见DisableHeartbeatPiggyback。DisableHeartbeatPiggyback
<disablePositiveAcks>参见DisablePositiveACKsQosPolicy。DisablePositiveAcks
<durability>参见DurabilityQosPolicy。Durability
<entity_factory>参见EntityFactoryQosPolicy。Entity Factory
<groupData>参见GroupDataQosPolicy。GroupData
<latencyBudget>参见LatencyBudgetQosPolicy。LatencyBudget
<lifespan>参见LifespanQosPolicy。Lifespan
<liveliness>参见LivelinessQosPolicy。Liveliness
<ownership>参见OwnershipQosPolicy。Ownership
<ownershipStrength>参见OwnershipStrengthQosPolicy。Ownership Strength
<partition>参见PartitionQosPolicy。Partition
<publishMode>参见PublishModeQosPolicy。PublishMode
<reliability>参见ReliabilityQosPolicy。ReliabilityQosPolicy
<topicData>参见TopicDataQosPolicy。TopicData
<userData>参见UserDataQosPolicy。UserData

示例

<data_writer profile_name="pub_topic_qos">
<qos> <!-- writerQosPoliciesType --><data_sharing><kind>AUTOMATIC</kind><shared_dir>/home</shared_dir><max_domains>10</max_domains><domain_ids><domainId>0</domainId><domainId>11</domainId></domain_ids></data_sharing><deadline><period><sec>1</sec></period></deadline><!-- DataWriter specific QoS --><disable_heartbeat_piggyback>true</disable_heartbeat_piggyback><disablePositiveAcks><enabled>true</enabled><duration><sec>1</sec></duration></disablePositiveAcks><durability><kind>VOLATILE</kind></durability><groupData><value>1.a.2</value></groupData><!-- QoS policy pending implementation --><latencyBudget><duration><sec>1</sec></duration></latencyBudget><lifespan><duration><sec>1</sec></duration></lifespan><liveliness><kind>AUTOMATIC</kind><lease_duration><sec>1</sec></lease_duration><announcement_period><sec>1</sec></announcement_period></liveliness><ownership><kind>EXCLUSIVE</kind></ownership><!-- DataWriter specific QoS --><ownershipStrength><value>50</value></ownershipStrength><partition><names><name>part1</name><name>part2</name></names></partition><!-- DataWriter specific QoS --><publishMode><kind>ASYNCHRONOUS</kind></publishMode><reliability><kind>BEST_EFFORT</kind><max_blocking_time><sec>1</sec></max_blocking_time></reliability><topicData><value>2.b.1</value></topicData><userData><value>3.c.0</value></userData>
</qos>

10.11.8.1. 数据共享(Data-Sharing)

名称描述取值默认值
<kind>参见DataSharingKindAUTOMATICONOFFAUTOMATIC
<shared_dir>用于内存映射文件的目录。string
<max_domains>本地或远程端点中数据共享域ID的最大数量。uint32_t0(无限制)
<domain_ids>为当前端点配置的数据共享域ID列表。<domainId>空列表
名称描述取值
<domainId>端点用于数据共享的域ID。uint32_t

10.11.8.2. 截止时间(Deadline)

名称描述取值默认值
<period>参见DeadlineQosPolicy。DurationTypec_TimeInfinite

10.11.8.3. 禁用心跳捎带(DisableHeartbeatPiggyback)

名称描述取值默认值
<disable_heartbeat_piggyback>参见DisableHeartbeatPiggyback。boolfalse

重要:此配置仅适用于DataWriter QoS配置文件配置。

10.11.8.4. 禁用肯定确认(DisablePositiveAcks)

名称描述取值默认值
<enabled>参见DisablePositiveACKsQosPolicy。boolfalse
<duration>参见DisablePositiveACKsQosPolicy。DurationTypec_TimeInfinite

10.11.8.5. 持久性(Durability)

名称描述取值默认值
<kind>参见DurabilityQosPolicyKind。VOLATILETRANSIENT_LOCALTRANSIENTPERSISTENT数据读取器:VOLATILE;数据写入器:TRANSIENT_LOCAL

10.11.8.6. 实体工厂(Entity Factory)

名称描述取值默认值
<autoenable_created_entities>参见EntityFactoryQosPolicy。booltrue

10.11.8.7. 组数据(GroupData)

名称描述取值默认值
<value>参见GroupDataQosPolicy。string(std::vector<octet>)

10.11.8.8. 延迟预算(LatencyBudget)

名称描述取值默认值
<duration>参见LatencyBudgetQosPolicy。DurationType0

10.11.8.9. 生存周期(Lifespan)

名称描述取值默认值
<duration>参见LifespanQosPolicy。DurationTypec_TimeInfinite

10.11.8.10. 活跃度(Liveliness)

名称描述取值默认值
<kind>参见LivelinessQosPolicyKind。AUTOMATICMANUAL_BY_PARTICIPANTMANUAL_BY_TOPICAUTOMATIC
<lease_duration>参见LivelinessQosPolicy。DurationTypec_TimeInfinite
<announcement_period>参见LivelinessQosPolicy。DurationTypec_TimeInfinite

10.11.8.11. 所有权(Ownership)

名称描述取值默认值
<kind>参见OwnershipQosPolicyKind。SHAREDEXCLUSIVESHARED

10.11.8.12. 所有权强度(Ownership Strength)

名称描述取值默认值
<value>参见OwnershipStrengthQosPolicy。uint32_t0

重要:此配置仅适用于DataWriter QoS配置文件配置。

10.11.8.13. 分区(Partition)

名称描述取值
<names>包含一组<name>元素,每个元素包含一个分区的名称。参见PartitionQosPolicy。<name>

10.11.8.14. 发布模式(PublishMode)

名称描述取值默认值
<kind>参见PublishModeQosPolicy。ASYNCHRONOUSSYNCHRONOUSASYNCHRONOUS
<flow_controller_name>流控制器QoS名称。<string>

重要:此配置仅适用于DataWriter QoS配置文件配置。

10.11.8.15. 可靠性QoS策略(ReliabilityQosPolicy)

名称描述取值默认值
<kind>参见ReliabilityQosPolicyKind。BEST_EFFORTRELIABLE数据读取器:BEST_EFFORT;数据写入器:RELIABLE
<max_blocking_time>参见ReliabilityQosPolicy。DurationType100毫秒

10.11.8.16. 主题数据(TopicData)

名称描述取值默认值
<value>参见TopicDataQosPolicy。string(std::vector<octet>)

10.11.8.17. 用户数据(UserData)

名称描述取值默认值
<value>参见UserDataQosPolicy。string(std::vector<octet>)

10.11.9. 历史记录内存策略(HistoryMemoryPolicy)

指示在处理RTPSEndpointQos的CacheChanges方面的内存管理方式。

名称描述取值默认值
<historyMemoryPolicy>四种不同的选项,如MemoryManagementPolicy中所述。PREALLOCATEDPREALLOCATED_WITH_REALLOCDYNAMICDYNAMIC_REUSABLEPREALLOCATED

示例

<data_writer profile_name="data_writer_historyMemoryPolicy"><!-- ...  --><historyMemoryPolicy>DYNAMIC</historyMemoryPolicy>
</data_writer><data_reader profile_name="data_reader_historyMemoryPolicy"><!-- ...  --><historyMemoryPolicy>DYNAMIC</historyMemoryPolicy>
</data_reader>

10.11.10. 分配配置(Allocation Configuration)

<allocation>元素允许控制内部集合的分配行为,这些集合的元素数量取决于系统中的实体数量。例如,DataWriter内部有一些集合,其数量取决于与其匹配的DataReader的数量。有关DomainParticipant分配的详细文档,请参考ParticipantResourceLimitsQos,有关如何调整分配相关参数的详细信息,请参考Tuning allocations。

名称描述取值默认值
<initial>最初为其分配空间的元素数量。uint32_t0
<maximum>将为其分配空间的最大元素数量。uint32_t0(表示无限制)
<increment>当需要更多空间时将分配的新元素数量。uint32_t1

10.11.11. 流控制器描述符(Flow Controller Descriptors)

<flow_controller_descriptor_list>元素配置参与者的流控制器列表,以便稍后在其DataWriter上使用。有关详细文档,请参考FlowControllersQos。

数据成员名称类型默认值
<name>string
<scheduler>FlowControllerSchedulerPolicyFIFO
<max_bytes_per_period>int32_t0(即无限)
<period_ms>uint64_t100
<sender_thread>ThreadSettings-

10.11.12. Example

在本节中,有一个包含所有可能配置的完整 XML 示例。

此示例可用作快速参考,但由于存在不兼容或互斥的属性,它可能并不正确。请勿将其视为可直接运行的示例。
https://fast-dds.docs.eprosima.com/en/latest/fastdds/xml_configuration/example.html

http://www.xdnf.cn/news/20436.html

相关文章:

  • AI助力特征工程:智能化数据科学新范式
  • leetcode 912 排序数组
  • 微前端框架性能对比与选型指南:从理论到实践
  • Redis 的三种高效缓存读写策略!
  • 从技术架构、接入路径、应用场景全梳理的智慧地产开源了
  • C++ 并发编程指南 并发设计模式:Actor vs. CSP (生活场景版)
  • [Upscayl图像增强] Electron主进程命令 | 进程间通信IPC
  • Django 项目6:表单与认证系统
  • PostgreSQL与Greenplum数据库的编程语言连接
  • 深入理解 RequestContextHolder、ThreadLocal 与 RequestContextFilter
  • Spring 基于注解的自动化事务
  • JBoltAI:解锁企业AI数智化升级的Java利器
  • 算法与数据结构实战技巧:从复杂度分析到数学优化
  • 13-Java-面向对象-封装和this关键字
  • Jenkins运维之路(自动获得分支tag自动构建)
  • ComfyUI Easy - Use:简化ComfyUI操作的得力插件
  • echarts实现点击图表添加标记
  • MySQL MHA 高可用集群搭建
  • 5.物理服务器搭建FC
  • 决策树概念与原理
  • MySQL DBA需要掌握的 7 个问题
  • Windows权限提升(二)
  • 深蓝汽车人事调整:邓承浩升任董事长,姜海荣出任首席执行官
  • 【LeetCode热题100道笔记】对称二叉树
  • 跨域彻底讲透
  • ThinkPHP 6框架常见错误:htmlentities()函数参数类型问题解决
  • 【pyhton】函数
  • [Godot入门大全]目录
  • 【杂类】I/O
  • MiniDrive:面向自动驾驶的更高效的视觉语言模型