<div id="content_views" class="markdown_views prism-atom-one-dark">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<h2><a name="t0"></a><a id="xml_0"></a>xml配置说明</h2>
见右侧目录或直接在网页搜索
创建一个xml文件
一个xml文件可以包含多个xml配置,这些xml配置在元素中定义,整个xml的结构包括根元素配置和独立元素配置,大致结构如下:
<?xml version="1.0" encoding="UTF-8" ?> <dds> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles" > <participant profile_name="participant_profile"> <!-- ... --> </participant>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>data_writer</span> <span class="token attr-name">profile_name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>datawriter_profile<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- ... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>data_writer</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>data_reader</span> <span class="token attr-name">profile_name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>datareader_profile<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- ... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>data_reader</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>transport_descriptors</span><span class="token punctuation">></span></span> <span class="token comment"><!-- ... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>transport_descriptors</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>log</span><span class="token punctuation">></span></span> <span class="token comment"><!-- ... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>log</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>types</span><span class="token punctuation">></span></span> <span class="token comment"><!-- ... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>types</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>profiles</span><span class="token punctuation">></span></span>
</dds>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
FastDDS提供如下可配置的选项:
加载和使用配置文件
用户可以在代码中通过加载xml配置文件去创建对应的实体
-
加载xml文件
注:文件需要指定路径,可以是相对路径
可以通过读取xml文件的方式:
DomainParticipantFactory::get_instance()->load_XML_profiles_file("my_profiles.xml")
- 1
也可以通过直接将xml格式文件格式写在代码中,加载字符串
std::string xml_profile =
"\
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\
<dds>\
<profiles xmlns=\"http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles\" >\
<data_writer profile_name=\"test_publisher_profile\" is_default_profile=\"true\">\
<qos>\
<durability>\
<kind>TRANSIENT_LOCAL</kind>\
</durability>\
</qos>\
</data_writer>\
</profiles>\
</dds>\
";
if (ReturnCode_t::RETCODE_OK ==
DomainParticipantFactory::get_instance()->load_XML_profiles_string(xml_profile.c_str(),
xml_profile.length()))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 定义参与者,发布者,订阅者,读,写
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”);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
其中,在函数的传参中所使用的配置项名字,为个配置项顶级节点所配置的名字,如:
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<participant profile_name="participant_xml_profile">
<rtps>
<name>xxx</name>
</rtps>
</participant>
</profiles>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在通过xml文件创建participant实例的时候,所传入的名字为<participant>
节点中的participant_xml_profile
,其余的同理
DomainParticipant* participant = DomainParticipantFactory::get_instance()->create_participant_with_profile(0, "participant_xml_profile");
- 1
读取xml文件后可修改
Qos通过读取xml配置文件后,在投入使用前,可修改:
if (ReturnCode_t::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);
<span class="token comment">// 修改名称,覆盖</span> participant_qos<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> custom_name<span class="token punctuation">;</span> <span class="token comment">// 修改预分配的数量,覆盖</span> participant_qos<span class="token punctuation">.</span><span class="token function">allocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>send_buffers<span class="token punctuation">.</span>preallocated_number <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token comment">// 使用读取xml,并且修改后的Qox,创建participant</span> DomainParticipant<span class="token operator">*</span> participant <span class="token operator">=</span> <span class="token class-name">DomainParticipantFactory</span><span class="token double-colon punctuation">::</span><span class="token function">get_instance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">create_participant</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> participant_qos<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
DomainParticipant配置(域参与者配置)
participant属性
<participant>
标签位于<dds>/<profiles>/<participant>
<participant>
有两个属性可以配置
属性名 | 描述 | 是否必要 |
---|---|---|
profile_name | 这个名字会被注册到DDS的Domain中,以便后续可以被DomainParticipantFactory 加载 | 必配 |
is_default_profile | 该选项决定这个标签是否为默认的,如果在创建时未指定其他的,则默认使用该选项 | 选配 |
rtps
name
描述:participant
的名字
类型:string_255
默认值:无
defaultUnicastLocatorList
描述:是一个List,单播定位器,用于指定发布者和订阅者之间的链接
类型:<locator>
该标签下可以有多个<locator>
locator
描述:配置定位器
类型:<udpv4> / <udpv6> / <tcpv4> / <tcpv6>
-
<udpv4>
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
-
<udpv6>
-
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
-
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
-
-
<tcpv4>
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
<physical_port>
—TCP 的物理端口,uint32_t
, 默认值:0
<unique_lan_id>
—LAN ID 唯一标识标识符, locator所属的LAN,string(16字节)
, 默认值:空
<wan_address>
—WAN IPv4 地址,string(IPv4格式)
, 默认值:0.0.0.0
-
<tcpv6>
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
<physical_port>
—TCP 的物理端口,uint32_t
, 默认值:0
defaultMulticastLocatorList
描述:是一个List,组播定位器
类型:<locator>
该标签下可以有多个<locator>
locator
描述:配置定位器
类型:<udpv4> / <udpv6> / <tcpv4> / <tcpv6>
-
<udpv4>
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
-
<udpv6>
-
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
-
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
-
-
<tcpv4>
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
<physical_port>
—TCP 的物理端口,uint32_t
, 默认值:0
<unique_lan_id>
—LAN ID 唯一标识标识符, locator所属的LAN,string(16字节)
, 默认值:空
<wan_address>
—WAN IPv4 地址,string(IPv4格式)
, 默认值:0.0.0.0
-
<tcpv6>
-
<port>
----RTPS 端口号, UDP 中的物理端口,TCP 中的逻辑端口,uint32_t
, 默认值:0
<address>
—IP地址,string(IPv4/IPv6格式或DNS名称)
, 默认值:无
<physical_port>
—TCP 的物理端口,uint32_t
, 默认值:0
default_external_unicast_locators
描述:为每个单播定位器配置一个外部的定位器列表, 可配多个
类型:<udpv4> / <udpv6>
udpv4 / udpv6
<udpv4> / <udpv6>
属性配置如下
名字 | 描述 | 类型 | 默认值 |
---|---|---|---|
externality | 从参与者的主机到外部定位器表示的LAN的跃点数,有效值:1~255 | uint8_t | 1 |
cost | 相对于同一外部定位器的通信损耗, 有效值: 0~255 | uint8_t | 0 |
mask | 外部定位器所代表的LAN上的有效bits数。有效值:1-31(UDPv4)或1-127(UDPv6) | uint8_t | 24 |
-
<udpv4>
-
<port>
—定位器的 UDP 端口号, UDP 端口号应有效,uint32_t
<address>
—定位器的IP地址,string(IPv4/IPv6格式或DNS名称)
-
<udpv6>
-
<port>
—定位器的 UDP 端口号, UDP 端口号应有效,uint32_t
<address>
—定位器的IP地址,string(IPv4/IPv6格式或DNS名称)
-
xml例子:
-
<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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ignore_non_matching_locators
描述:当其他参与者发布的定位器与该参与者发布的任何定位器不匹配时,是否忽略其他定位器。
类型:bool
默认值:false
sendSocketBufferSize
描述:发送套接字缓冲区的大小(字节)。如果该值为0,那么Fast DDS将使用系统默认的套接字大小。
类型:uint32_t
默认值:0
(无限大)
listenSocketBufferSize
描述:接收套接字缓冲区的大小(字节)。如果该值为0,那么Fast DDS将使用系统默认的套接字大小。
类型:uint32_t
默认值:0
(无限大)
builtin
描述:class eprosima::fastdds::dds::WireProtocolConfigQos
中的public
变量,在代码中可通过类DomainParticipantQos
中的wire_protocol()
去访问类WireProtocolConfigQos
中的public
变量
discovery_config
描述:这是可以配置与Discovery有关的设置的主要元素。
类型:discovery_config
-
<discoveryProtocol>
—表示DomainParticipant将使用哪种Discovery协议。可选值: -
-
SIMPLE
:根据 "实时发布-订阅协议(RTPS)DDS互操作性线协议规范 "进行Discovery操作。 -
CLIENT
:参与者作为客户端去Discovery。 -
SERVER
:参与者作为服务端去Discovery。 -
BACKUP
:参与者在Discovery操作上表现得像一个服务器,如果断开链接,则不会重新握手。 -
NONE
:不会进行Discovery操作,即使定义为相同主题名称的Publisher和Subscriber将不会被链接。所有的匹配必须通过addReaderLocator、addReaderProxy、addWriterProxy方法手动完成。 -
默认值:
SIMPLE
-
c++例子
-
DomainParticipantQos pqos;
-
pqos.wire_protocol().builtin.discovery_config.discoveryProtocol =
DiscoveryProtocol_t::SIMPLE;
- 1
- 2
- 3
- 4
-
xml例子
-
<participant profile_name="participant_discovery_protocol"> <rtps> <builtin> <discovery_config> <discoveryProtocol>SIMPLE</discoveryProtocol> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-
<ignoreParticipantFlags>
—定义一个过滤器,以便在收到某些Discovery流量时忽略。 这对于添加额外的域参与者隔离级别非常有用。 可能的值为: -
-
NO_FILTER
:不进行过滤 -
FILTER_DIFFERENT_HOST
:其他主机的Discovery流量将被过滤 -
FILTER_DIFFERENT_PROCESS
:来自同一主机的不同进程Discovery流量将被过滤 -
FILTER_SAME_PROCESS
:来自DomainParticipant自己进程的Discovery流量被过滤 -
FILTER_DIFFERENT_PROCESS | FILTER_SAME_PROCESS
:来自DomainParticipant自己主机的Discovery流量被过滤 -
默认值:
NO_FILTER
-
c++例子:
-
DomainParticipantQos pqos;
-
pqos.wire_protocol().builtin.discovery_config.ignoreParticipantFlags =
static_cast<eprosima::fastrtps::rtps::ParticipantFilteringFlags_t>(
ParticipantFilteringFlags_t::FILTER_DIFFERENT_PROCESS |
ParticipantFilteringFlags_t::FILTER_SAME_PROCESS);- 1
- 2
- 3
- 4
- 5
- 6
-
xml例子
-
<participant profile_name="participant_discovery_ignore_flags"> <rtps> <builtin> <discovery_config> <ignoreParticipantFlags>FILTER_DIFFERENT_PROCESS | FILTER_SAME_PROCESS</ignoreParticipantFlags> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-
<EDP>
—在参与者注册完了之后,开始匹配他们的DataWriter和DataReader,使用在参与者注册期间建立的通信管道,相互发布关于其DataWriters和DataReaders的信息。还包括主题和数据类型。对于两个端点的匹配,它们的主题和数据类型必须是一致的。一旦DataWriter和DataReader匹配,它们就可以发送/接收用户数据流量,可选值有: -
SIMPLE
:这是默认机制。 它支持PDP和EDP的RTPS标准,因此提供与任何其他 DDS 和 RTPS 实现的兼容性。STATIC
:有点复杂,见后文单独章节EDP的STATIC属性配置- 默认值:
SIMPLE
-
<simpleEDP>
:用于指定Publisher和Subscriper是否激活读写器,注:只有当EDP配置为SIMPLE时可以使用 -
-
<PUBWRITER_SUBREADER>
:表明参与者是否必须使用Publication DataWriter和Subscription DataReader。 -
-
类型:
bool
-
默认:
true
-
-
<PUBREADER_SUBWRITER>
:表明参与者是否必须使用Publication DataReader和Subscription DataWriter。 -
-
类型:
bool
-
默认:
true
-
-
c++代码
-
DomainParticipantQos pqos;
-
pqos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocol = true;
pqos.wire_protocol().builtin.discovery_config.m_simpleEDP.use_PublicationWriterANDSubscriptionReader = true;
pqos.wire_protocol().builtin.discovery_config.m_simpleEDP.use_PublicationReaderANDSubscriptionWriter = false;- 1
- 2
- 3
- 4
- 5
-
xml示例
-
<participant profile_name="participant_profile_qos_discovery_edp"> <rtps> <builtin> <discovery_config> <EDP>SIMPLE</EDP> <simpleEDP> <PUBWRITER_SUBREADER>true</PUBWRITER_SUBREADER> <PUBREADER_SUBWRITER>false</PUBREADER_SUBWRITER> </simpleEDP> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
-
<leaseDuration>
—表示DomainParticipant应该认为远程DomainParticipant还存在多长时间。默认值:20s
-
-
<sec>
—以秒来设定, 类型:int32_t
, 默认值:20
-
<nanosec>
—以纳秒数来设定, 类型:int32_t
, 默认值:0
-
注:可使用提供的宏来设定无限时间:
DURATION_INFINITY DURATION_INFINITE_SEC DURATION_INFINITE_NSEC
-
c++例子
-
DomainParticipantQos pqos;
-
-
pqos.wire_protocol().builtin.discovery_config.leaseDuration = Duration_t(10, 20);
- 1
- 2
- 3
-
xml例子1:
-
<participant profile_name="participant_discovery_lease_duration"> <rtps> <builtin> <discovery_config> <leaseDuration> <sec>10</sec> <nanosec>20</nanosec> </leaseDuration> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
-
xml例子2:
-
<discovery_config> <leaseDuration> <sec>DURATION_INFINITY</sec> </leaseDuration>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>leaseDuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>856000<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>leaseDuration</span><span class="token punctuation">></span></span>
</discovery_config>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-
<leaseAnnouncement>
—公告期:DomainParticipant向所有其他被发现的DomainParticipant以及所有多播端口发送其Discovery消息的时期。默认值:3s
-
-
<sec>
—以秒来设定, 类型:int32_t
, 默认值:3
-
<nanosec>
—以纳秒数来设定, 类型:int32_t
, 默认值:0
-
注:可使用提供的宏来设定无限时间:
DURATION_INFINITY DURATION_INFINITE_SEC DURATION_INFINITE_NSEC
-
c++例子:
-
DomainParticipantQos pqos;
-
-
pqos.wire_protocol().builtin.discovery_config.leaseDuration_announcementperiod = Duration_t(1, 2);
- 1
- 2
- 3
-
xml例子:
-
<participant profile_name="participant_discovery_lease_announcement"> <rtps> <builtin> <discovery_config> <leaseAnnouncement> <sec>1</sec> <nanosec>2</nanosec> </leaseAnnouncement> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
-
<initialAnnouncements>
—允许用户配置DomainParticipant的初始Discovery信息的数量和周期。在Discovery阶段,这些匹配的消息是以不可靠的方式传输的,避免两端由于处理信息的延迟导致没有匹配在一起,可以配置在Discovery阶段多发几次匹配的信息。-
-
<count>
:定义发送几次,uint32_t
,默认值:5
-
<period>
:定义发送的周期,默认值:100ms
-
-
<sec>
—以秒来设定, 类型:int32_t
, 默认值:0
-
<nanosec>
—以纳秒数来设定, 类型:int32_t
, 默认值:100000000
-
-
c++例子:
-
DomainParticipantQos pqos;
-
-
pqos.wire_protocol().builtin.discovery_config.initial_announcements.count = 5;
pqos.wire_protocol().builtin.discovery_config.initial_announcements.period = Duration_t(0, 100000000u);- 1
- 2
- 3
- 4
-
xml例子:
-
<participant profile_name="participant_profile_simple_discovery"> <rtps> <builtin> <discovery_config> <initialAnnouncements> <count>5</count> <period> <sec>0</sec> <nanosec>100000000</nanosec> </period> </initialAnnouncements> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
-
<staticEndpointXMLFilename>
—具有静态EDP配置的XML文件名。只有在<EDP>
成员被设置为STATIC时才需要。string
avoid_builtin_multicast
描述:用于控制fastdds的内置多播行为,以避免在发布/订阅消息时的性能下降。例如,如果发布者和订阅者位于同一个网络中,则可以使用多播来发布消息,而不是将消息发送到每个订阅者。如果将avoid_builtin_multicast设置为true,fastdds将启用此功能,以避免性能下降。
类型:
bool
默认值:
true
use_WriterLivelinessProtocol
描述:表示是否使用DataWriterLiveliness协议。
类型:
bool
默认值:
true
metatrafficUnicastLocatorList
描述:用于指定在元数据传输流中使用的单播位置器列表。在元数据传输流中,发布者将向每个位置器发送元数据消息。
类型:
<locator>
注:
<locator>
这个元素组的配置方法与participant/rtps /defaultUnicastLocatorList/locator
的方法一致metatrafficMulticastLocatorList
描述:用于指定在元数据传输流中使用的多播位置器列表。在元数据传输流中,发布者将向每个位置器发送元数据消息。
类型:
<locator>
注:
<locator>
这个元素组的配置方法与participant/rtps /defaultUnicastLocatorList/locator
的方法一致initialPeersList
描述:用于指定初始的对等端列表。这个列表中的每个对等端都将被FastDDS用来发现和连接其他的对等端,以建立网络中的连接
类型:
<locator>
注:
<locator>
这个元素组的配置方法与participant/rtps /defaultUnicastLocatorList/locator
的方法一致metatraffic_external_unicast_locators
描述:公布此参与者metatraffic的外部单播定位器列表
类型:
<udpv4> / <udpv6>
<udpv4> / <udpv6>
属性配置如下:名字 描述 类型 默认值 externality 从参与者的主机到外部定位器表示的LAN的跃点数,有效值:1~255 uint8_t
1 cost 相对于同一外部定位器的通信损耗, 有效值: 0~255 uint8_t
0 mask 外部定位器所代表的LAN上的有效bits数。有效值:131(UDPv4)或1127(UDPv6) uint8_t
24 -
<udpv4>
-
<port>
—定位器的 UDP 端口号, UDP 端口号应有效,uint32_t
<address>
—定位器的IP地址,string(IPv4/IPv6格式或DNS名称)
-
<udpv6>
-
<port>
—定位器的 UDP 端口号, UDP 端口号应有效,uint32_t
<address>
—定位器的IP地址,string(IPv4/IPv6格式或DNS名称)
readerHistoryMemoryPolicy
描述:读取器历史记录的存储策略。允许用户指定消息历史记录应该如何存储,以及在发布者和订阅者之间如何共享这些历史记录
类型:
HistoryMemoryPolicy
的枚举-
可用值如下:
-
PREALLOCATED_MEMORY_MODE
:将每个数据类型的大小设置为最大,它产生最大的内存占用,但内存分配次数最小。 -
PREALLOCATED_WITH_REALLOC_MEMORY_MODE
:将每种数据类型的大小设置为默认值,当有更大的消息到达时,它需要重新分配内存。它以增加内存分配次数为代价,产生了较低的内存占用。 -
DYNAMIC_RESERVE_MEMORY_MODE
:这个选项在消息到达时动态地分配内存大小。它产生最小的内存占用,但内存分配次数最多。 -
DYNAMIC_REUSABLE_MEMORY_MODE
: 这个选项与DYNAMIC_RESERVE_MEMORY_MODE
类似,但分配的内存会被重新用于未来的信息。 -
默认值:
PREALLOCATED_MEMORY_MODE
writerHistoryMemoryPolicy
描述:写入器历史记录的存储策略。允许用户指定消息历史记录应该如何存储,以及在发布者和订阅者之间如何共享这些历史记录
类型:
HistoryMemoryPolicy
的枚举-
可用值如下:
-
PREALLOCATED_MEMORY_MODE
:将每个数据类型的大小设置为最大,它产生最大的内存占用,但内存分配次数最小。 -
PREALLOCATED_WITH_REALLOC_MEMORY_MODE
:将每种数据类型的大小设置为默认值,当有更大的消息到达时,它需要重新分配内存。它以增加内存分配次数为代价,产生了较低的内存占用。 -
DYNAMIC_RESERVE_MEMORY_MODE
:这个选项在消息到达时动态地分配内存大小。它产生最小的内存占用,但内存分配次数最多。 -
DYNAMIC_REUSABLE_MEMORY_MODE
: 这个选项与DYNAMIC_RESERVE_MEMORY_MODE
类似,但分配的内存会被重新用于未来的信息。 -
默认值:
PREALLOCATED_MEMORY_MODE
readerPayloadSize
描述:数据读取器的最大历史有效载荷大小。允许在DataReader初始化时保留所有需要的内存。
类型:
uint32_t
默认值:
512
writerPayloadSize
描述:数据写入器的最大历史有效载荷大小。允许在DataReader初始化时保留所有需要的内存。
类型:
uint32_t
默认值:
512
mutation_tries
描述:如果DataReader的物理端口已经被使用,要尝试的不同端口的数量。
类型:
uint32_t
默认值:
100
port
描述:允许定义与RTPS协议相关的port和gains。
类型:
<port>
子集标签如下:-
<portBase>
—Base .port,uint16_t
,默认值7400
-
<domainIDGain>
—DomainId增益,uint16_t
,默认值250
-
<participantIDGain>
—participant_id增益,uint16_t
, 默认值2
-
<offsetd0>
—多播metadata偏移,uint16_t
, 默认值0
-
<offsetd1>
—单播metadata偏移,uint16_t
, 默认值10
-
<offsetd2>
—多播user data偏移,uint16_t
, 默认值1
-
<offsetd3>
—单播user data偏移,uint16_t
, 默认值11
注:更改这些默认参数可能会破坏与其他RTPS兼容实现的兼容性,以及与具有默认端口设置的其他Fast DDS应用程序的兼容性。
participantID
描述:DomainParticipant的id。通常,它将由DomainParticipantFactory自动生成。
类型:
int32_t
默认值:
0
userTransports
描述:DomainParticipant要使用的传输描述符。
类型:
List<string>
值为
dds/profiles/transport_descriptors/transport_id
的值,可配置多个<userTransports> <transport_id>TransportId1</transport_id> <transport_id>TransportId2</transport_id> </userTransports>
- 1
- 2
- 3
- 4
useBuiltinTransports
描述:布尔字段,指示系统DomainParticipant是否将使用默认内置传输及其
<userTransports>
。类型:
bool
默认值:
true
propertiesPolicy
描述:暂不明确,可以看这里
类型:
<properties>
子集标签如下:-
<property>
-
-
<name>
—标识属性的名称,string
-
<value>
—该属性的值,string
-
<propagate>
—指明是否将与所属对象一起序列化,bool
,默认值:false
-
例子
<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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
allocation
描述:关于分配行为的配置
类型:
DomainParticipantAllocationType
该类型中有如下标签:-
<remote_locators>
—此结构包含远程定位器集合的限制 -
-
<max_unicast_locato>
—用于指定参与者可以使用的最大单播数量, 类型:size_t
,默认:4
-
<max_multicast_locators>
—指定了一个参与者可以接收的最大多播地址数量,它有助于限制参与者接收的多播消息,从而减少网络负载 类型:size_t
,默认:1
-
-
<total_participants>
—用于描述一个参与者组中参与者的总数。它可以用于指定每个参与者组中参与者的最大数量,以便在发布/订阅过程中正确管理参与者 -
-
<initial>
—最初分配的个数,uint32_t
,默认:0
-
<maximum>
—最大的个数,uint32_t
,默认:0
(0的话就是不限制最大个数) -
<increment>
—达到配置的最大空间后,允许增加的数量,uint32_t
,默认:1
-
-
<total_readers>
—指定了每个参与者可以最多创建的reader数量,它可以用来限制参与者的reader数量,以防止参与者创建太多reader,从而导致系统资源耗尽 -
-
<initial>
—最初分配的个数,uint32_t
,默认:0
-
<maximum>
—最大的个数,uint32_t
,默认:0
(0的话就是不限制最大个数) -
<increment>
—达到配置的最大空间后,允许增加的数量,uint32_t
,默认:1
-
-
<total_writers>
—指定了每个参与者可以最多创建的writer数量,它可以用来限制参与者的writer数量,以防止参与者创建太多writer,从而导致系统资源耗尽 -
-
<initial>
—最初分配的个数,uint32_t
,默认:0
-
<maximum>
—最大的个数,uint32_t
,默认:0
(0的话就是不限制最大个数) -
<increment>
—达到配置的最大空间后,允许增加的数量,uint32_t
,默认:1
-
-
<max_partitions>
—声明本地或远程参与者中分区数据的最大大小 ( 以八位字节为单位 ) ,size_t
,默认:0
(0的话就是无限制) -
<max_user_data>
—确定本地或远程参与者中用户数据的最大大小(以八位字节为单位),size_t
,默认:0
(0的话就是无限制) -
<max_properties>
—定义本地或远程参与者中属性数据的最大大小(以八位字节为单位),uint32_t
,默认:0
(0的话就是无限制)
例子:
<allocation> <remote_locators> <!--用于指定参与者可以使用的最大单播数量,类型:size_t,默认:4--> <max_unicast_locators>4</max_unicast_locators> <!--指定了一个参与者可以接收的最大多播地址数量,它有助于限制参与者接收的多播消息,从而减少网络负载,类型:size_t,默认:1--> <max_multicast_locators>1</max_multicast_locators> </remote_locators>
<span class="token comment"><!--用于描述一个参与者组中参与者的总数。它可以用于指定每个参与者组中参与者的最大数量,以便在发布/订阅过程中正确管理参与者--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>total_participants</span><span class="token punctuation">></span></span> <span class="token comment"><!--最初分配的个数,uint32_t,默认:0--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initial</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initial</span><span class="token punctuation">></span></span> <span class="token comment"><!--最大的个数,uint32_t,默认:0(0的话就是不限制最大个数)--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>maximum</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>maximum</span><span class="token punctuation">></span></span> <span class="token comment"><!--达到配置的最大空间后,允许增加的数量,uint32_t,默认:1--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>increment</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>increment</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>total_participants</span><span class="token punctuation">></span></span> <span class="token comment"><!--指定了每个参与者可以最多创建的reader数量,它可以用来限制参与者的reader数量,以防止参与者创建太多reader,从而导致系统资源耗尽--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>total_readers</span><span class="token punctuation">></span></span> <span class="token comment"><!--以下三项同上--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initial</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initial</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>maximum</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>maximum</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>increment</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>increment</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>total_readers</span><span class="token punctuation">></span></span> <span class="token comment"><!--指定了每个参与者可以最多创建的writer数量,它可以用来限制参与者的writer数量,以防止参与者创建太多writer,从而导致系统资源耗尽--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>total_writers</span><span class="token punctuation">></span></span> <span class="token comment"><!--以下三项同上--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initial</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initial</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>maximum</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>maximum</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>increment</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>increment</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>total_writers</span><span class="token punctuation">></span></span> <span class="token comment"><!--声明本地或远程参与者中分区数据的最大大小(以八位字节为单位),size_t,默认:0(0的话就是无限制)--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>max_partitions</span><span class="token punctuation">></span></span>256<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>max_partitions</span><span class="token punctuation">></span></span> <span class="token comment"><!--确定本地或远程参与者中用户数据的最大大小(以八位字节为单位),size_t,默认:0(0的话就是无限制)--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>max_user_data</span><span class="token punctuation">></span></span>256<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>max_user_data</span><span class="token punctuation">></span></span> <span class="token comment"><!--定义本地或远程参与者中属性数据的最大大小(以八位字节为单位),uint32_t,默认:0(0的话就是无限制)--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>max_properties</span><span class="token punctuation">></span></span>512<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>max_properties</span><span class="token punctuation">></span></span> <span class="token comment"><!-- content_filter cannot be configured using XML (yet) --></span>
</allocation>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
userData
描述:附加到DomainParticipant并与Discovery信息一起传输的附加信息。
类型:
string
例子
<userData> <value>13.40.37.00.CE</value> </userData>
- 1
- 2
- 3
EDP的STATIC属性配置
由于激活STATIC EDP会抑制所有EDP元流量,所以必须静态地指定关于远程实体(DataWriters和DataReaders)的信息,这是用专门的XML文件完成的。一个DomainParticipant可以加载几个这样的配置文件,这样关于不同实体的信息可以包含在一个文件中,或者分成不同的文件以保持更有条理。Fast DDS提供了一个静态发现的例子,实现了这个EDP发现协议。
当EDP标签被设置为STATIC时,才会使用此配置,即:
<participant profile_name="participant_profile_qos_discovery_edp"> <rtps> <builtin> <discovery_config> <EDP>STATIC</EDP> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
可配置项
STATIC EDP XML配置文件的所有可能元素:
userId
描述:必配项,DataReader/DataWriter的userID
类型:
uint16_t
默认值:
0
entityID
描述:DataReader/DataWriter的entityID
类型:
uint16_t
默认值:
0
expectsInlineQos
描述:它表示是否期望内联QOS(仅限DataReader)
类型:
bool
默认值:
false
topicName
描述:必配项,远程DataReader/DataWriter的话题。应该与本地DataReader/DataWriter的话题之一相匹配。
类型:
string_255
topicDataType
描述:必配项,话题的数据类型,根据idl文件里的结构体
类型:
string_255
topicKind
描述:指话题传输消息的种类,
类型:
NO_KEY
:不是键值对类型,WITH_KEY
:是键值对类型默认值:
NO_KEY
partitionQos
描述:远端连接的参与者的名字,可以重复配置多个
类型:
string
unicastLocator
描述:单播定位器,可重复配置多个
类型:通过属性配置
<unicastLocator address="192.168.0.128" port="5000"/>
- 1
multicastLocator
描述:多播定位器
类型:通过属性配置
<multicastLocator address="239.255.1.1" port="7000"/>
- 1
reliabilityQos
描述:该QoS策略表示服务提供和要求的可靠性水平。
类型:
Enum
-
BEST_EFFORT_RELIABILITY_QOS
:它表明可以接受不重发缺失的样本,所以信息的发送不需要等待到达确认。据推测,样本的新值会经常产生,因此没有必要重新发送任何样本。然而,由同一个DataWriter发送的数据样本将按照它们出现的顺序存储在DataReader的历史中。换句话说,即使DataReader错过了一些数据样本,一个较旧的值也不会覆盖一个较新的值。 -
RELIABLE_RELIABILITY_QOS
:它表示该服务将尝试交付DataWriter历史上的所有样本,期望得到DataReader的到达确认。如果有以前的样本还没有被收到,那么同一个DataWriter发送的数据样本就不能提供给DataReader。该服务将重新传输丢失的数据样本,以便在数据读取器可以访问之前重建DataWriter历史的正确快照。注:这个选项可能会阻塞写操作,因此设置了max_blocking_time,一旦时间过了就会解除阻塞。但是如果max_blocking_time在数据被发送之前就过期了,写操作将返回一个错误。
默认值:
BEST_EFFORT_RELIABILITY_QOS
这些配置是允许的:
DataWriter 种类 DataReader 种类 可行性 BEST_EFFORT_RELIABILITY_QOS BEST_EFFORT_RELIABILITY_QOS Yes BEST_EFFORT_RELIABILITY_QOS RELIABLE_RELIABILITY_QOS No RELIABLE_RELIABILITY_QOS BEST_EFFORT_RELIABILITY_QOS Yes RELIABLE_RELIABILITY_QOS RELIABLE_RELIABILITY_QOS Yes durabilityQos
描述:定义如何处理那些在DataReader加入之前就存在在Topic中的消息
类型:
Enum
-
VOLATILE_DURABILITY_QOS
:忽略DataReader加入之前的消息 -
TRANSIENT_LOCAL_DURABILITY_QOS
:新的DataReader加入后,在话题中的历史消息会保存在内存中 -
TRANSIENT_DURABILITY_QOS
:新的DataReader加入后,在话题中的历史消息会保存在硬盘中
默认值:
VOLATILE_DURABILITY_QOS
ownershipQos
描述:定义主题的所有权
类型:通过标签属性设置
-
kind
,必配项,可用值: -
-
SHARED_OWNERSHIP_QOS
:表示每个实例的共享所有权。允许多个writers 更新同一个实例,所有的更新都提供给readers。换句话说,实例没有 "所有者 "的概念。 -
EXCLUSIVE_OWNERSHIP_QOS
:表示每个实例只能由一个DataWriter拥有,但一个实例的所有者可以动态改变。所有者的选择由OwnershipStrengthQosPolicy的设置来控制。所有者总是被设置为当前 "活跃 "的DataWriter对象中强度最高的一个(由LivelinessQosPolicy决定)。
-
-
strength
,可选项,uint32_t
,用于指定远程DomainParticipant对该Topic的拥有程度。这个服务质量只能在DataWriters上设置。默认值:0
。
<reader> <ownershipQos kind="SHARED_OWNERSHIP_QOS"/> </reader>
<writer>
<ownershipQos kind=“SHARED_OWNERSHIP_QOS” strength=“50”/>
</writer>- 1
- 2
- 3
- 4
- 5
- 6
- 7
livelinessQos
描述:确认远端存活的Qos配置
类型:通过标签属性设置
-
kind
,必配项,可取值: -
-
AUTOMATIC_LIVELINESS_QOS
:框架内将自动为DataWriter/DataReader发出liveliness信号,其频率至少与租赁期的要求一致。 -
MANUAL_BY_PARTICIPANT_LIVELINESS_QOS
:假定,只要DomainParticipant中的至少一个实体是活跃的,该DomainParticipant中的其他实体也是活跃。 -
MANUAL_BY_TOPIC_LIVELINESS_QOS
:只有当DataWirter/DataReader自己判断自己是活跃的,该Server才会判定其实活跃的。
-
-
leaseDuration_ms
,可选项,uint32_t
,定远程对等体的租用期限。特殊值INF可以用来表示无限的租赁期限。默认值:INF
。
disablePositiveAcks
描述:当不需要严格的可靠通信和有限带宽时,这种QoS允许减少网络流量。它包括改变默认的行为(从reader向writter发送正向脉冲)。取而代之的是,当reader缺少一个样本时,将只发送负的脉冲,但writter将以足够长的时间保留数据,然后再将其视为确认。
类型:下级可配置标签有两个:
-
enabled
:指定QoS是否被启用。如果为true,意味着禁用正脉冲,DataReader只发送负脉冲。否则,正反脉冲都会被发送。bool
,默认值:false
-
duration
:说明DataWriters在将其视为确认之前保留数据的时间。这个值不适用于DataReaders。
例子
下面是两个远程DomainParticipant、一个DataWriter和一个DataReader的配置XML文件的完整例子。这个配置必须与用于创建远程DataReader/DataWriter的配置一致。否则,DataReaders和DataWriter之间的通信可能会受到影响。如果缺少任何非强制性的元素,它将采用默认值。所有在创建远程DataReader/DataWriter时指定的元素都应该被配置。
<staticdiscovery> <participant> <name>HelloWorldSubscriber</name> <reader> <userId>3</userId> <entityID>4</entityID> <expectsInlineQos>true</expectsInlineQos> <topicName>HelloWorldTopic</topicName> <topicDataType>HelloWorld</topicDataType> <topicKind>WITH_KEY</topicKind> <partitionQos>HelloPartition</partitionQos> <partitionQos>WorldPartition</partitionQos> <unicastLocator address="192.168.0.128" port="5000"/> <unicastLocator address="10.47.8.30" port="6000"/> <multicastLocator address="239.255.1.1" port="7000"/> <reliabilityQos>BEST_EFFORT_RELIABILITY_QOS</reliabilityQos> <durabilityQos>VOLATILE_DURABILITY_QOS</durabilityQos> <ownershipQos kind="SHARED_OWNERSHIP_QOS"/> <livelinessQos kind="AUTOMATIC_LIVELINESS_QOS" leaseDuration_ms="1000"/> <disablePositiveAcks> <enabled>true</enabled> </disablePositiveAcks> </reader> </participant> <participant> <name>HelloWorldPublisher</name> <writer> <unicastLocator address="192.168.0.120" port="9000"/> <unicastLocator address="10.47.8.31" port="8000"/> <multicastLocator address="239.255.1.1" port="7000"/> <userId>5</userId> <entityID>6</entityID> <topicName>HelloWorldTopic</topicName> <topicDataType>HelloWorld</topicDataType> <topicKind>WITH_KEY</topicKind> <partitionQos>HelloPartition</partitionQos> <partitionQos>WorldPartition</partitionQos> <reliabilityQos>BEST_EFFORT_RELIABILITY_QOS</reliabilityQos> <durabilityQos>VOLATILE_DURABILITY_QOS</durabilityQos> <ownershipQos kind="SHARED_OWNERSHIP_QOS" strength="50"/> <livelinessQos kind="AUTOMATIC_LIVELINESS_QOS" leaseDuration_ms="1000"/> <disablePositiveAcks> <enabled>true</enabled> <duration> <sec>300</sec> </duration> </disablePositiveAcks> </writer> </participant> </staticdiscovery>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
静态EDPxml校验
在代码中若想加载这些配置,在加载前可以加上校验,以确定该配置是否符合规定,这种验证可以使用
DomainParticipantFactory::check_xml_static_discovery()
进行,使用XML文件或直接使用配置,如下面的例子:cpp校验静态EDP的xml例子:
// The (file://) flag is optional. std::string file = "file://static_Discovery.xml"; DomainParticipantFactory* factory = DomainParticipantFactory::get_instance(); if (ReturnCode_t::RETCODE_OK != factory->check_xml_static_discovery(file)) { std::cout << "Error parsing xml file " << file << std::endl; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
或者通过直接在代码中写入xml,进行校验:
// The (data://) flag is required to load the configuration directly. std::string fileData = "data://<?xml version=\"1.0\" encoding=\"utf-8\"?>" \ "<staticdiscovery>" \ "<participant>" \ "<name>HelloWorldPublisher</name>" \ "<writer>" \ "<userId>1</userId>" \ "<entityID>2</entityID>" \ "<topicName>HelloWorldTopic</topicName>" \ "<topicDataType>HelloWorld</topicDataType>" \ "</writer>" \ "</participant>" \ "</staticdiscovery>"; if (ReturnCode_t::RETCODE_OK != factory->check_xml_static_discovery(fileData)) { std::cout << "Error parsing xml file data:" << std::endl << fileData << std::endl; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
静态EDPxml加载
在C++代码中加载这些配置例子:
// Configure the DataWriter DataWriterQos wqos; wqos.endpoint().user_defined_id = 1;
// Configure the DataReader
DataReaderQos rqos;
rqos.endpoint().user_defined_id = 3;- 1
- 2
- 3
- 4
- 5
- 6
- 7
主要通过xml中的id选项在cpp中读取,静态发现的远程DataReaders/DataWriters必须在其配置文件上定义一个唯一的用户ID,其值必须与发现配置XML中指定的用户ID一致。这是通过在DataReaderQos/DataWriterQos上设置用户ID完成的。:
<data_writer profile_name="writer_xml_conf_static_discovery"> <userDefinedID>3</userDefinedID> </data_writer>
<data_reader profile_name=“reader_xml_conf_static_discovery”>
<userDefinedID>5</userDefinedID>
</data_reader>- 1
- 2
- 3
- 4
- 5
- 6
- 7
在本地DomainParticipant上,可以加载STATIC EDP配置内容,指定包含它的文件:
cpp:
DomainParticipantQos pqos;
pqos.wire_protocol().builtin.discovery_config.static_edp_xml_config(“file://RemotePublisher.xml”);
pqos.wire_protocol().builtin.discovery_config.static_edp_xml_config(“file://RemoteSubscriber.xml”);- 1
- 2
- 3
- 4
xml:
<participant profile_name="participant_profile_static_load_xml"> <rtps> <builtin> <discovery_config> <static_edp_xml_config>file://RemotePublisher.xml</static_edp_xml_config> <static_edp_xml_config>file://RemoteSubscriber.xml</static_edp_xml_config> </discovery_config> </builtin> </rtps> </participant>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
或者可以直接指定STATIC EDP配置内容。
DomainParticipantQos pqos;
pqos.wire_protocol().builtin.discovery_config.static_edp_xml_config(
“data://<?xml version=“1.0” encoding=“utf-8”?>”
“<staticdiscovery><participant><name>RTPSParticipant</name></participant></staticdiscovery>”);- 1
- 2
- 3
- 4
- 5
DataWriter profiles(数据写入器配置)
DataWriter的标签
<data_writer>
位于<dds>/<profiles>/<data_writer>
下<data_writer>
标签的属性:-
profile_name
:必配项,设置<data_writer>
配置文件在DDS域中的注册名称。
以便DomainParticipant以后可以加载它 -
is_default_profile
:选配项,将<data_writer>
配置文件设置为默认配置文件。因此,如果一个默认的配置文件存在,它将被用于在创建DataWriter时没有指定其他DataWriter配置文件的情况下,将使用该配置文件。
<data_writer profile_name="datawriter_profile_name">
- 1
子集标签如下:
topic
描述:DataWriter的Topic配置
historyQos
描述:当实例的值在传输到DataReaders前发生改变时,该标签的配置可以控制fastDDS的行为
-
<kind>
—可选值:1.KEEP_LAST
:FastDDS将只尝试保留实例的最新值而丢弃旧的。2.KEEP_ALL
:Fast DDS将试图维护并提供该实例的所有值到现有的DataReader。默认值:KEEP_LAST
-
<depth>
—消息队列的深度,uint32_t
,默认值:1
,注:需遵循<depth>
<=<max_samples_per_instance>
resourceLimitsQos
描述:它控制Fast DDS可以使用的资源,以满足应用和其他QoS设置的要求。
-
<max_samples>
—控制DataWriter或DataReader在与之相关的所有实例中可以管理的最大样本数。换句话说,它代表了中间件可以为一个DataReader或DataWriter存储的最大样本数。uint32_t
,默认值:5000
,注:寻遵循<max_samples>
>=<max_samples_per_instance>
-
<max_instances>
—控制一个DataWriter或DataReader可以管理的最大实例数。int32_t
,默认值:10
-
<max_samples_per_instance>
—控制一个实例中DataWriter或DataReader可以管理的最大样本数。int32_t
,默认值:400
,注:须遵循<depth>
<=<max_samples_per_instance>
-
<allocated_samples>
—说明初始化时将被分配的样本数。uint32_t
,默认值:100
-
<extra_samples>
—当样本数达到max_samples中所配置的值后,还可以额外拓展的个数,uint32_t
,默认值:1
xml例子:
<topic> <historyQos> <kind>KEEP_LAST</kind> <depth>20</depth> </historyQos> <resourceLimitsQos> <max_samples>5000</max_samples> <max_instances>2</max_instances> <max_samples_per_instance>100</max_samples_per_instance> <allocated_samples>20</allocated_samples> <extra_samples>10</extra_samples> </resourceLimitsQos> </topic>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
qos
描述:允许用户定义每个实体的行为方式
data_sharing
描述:FastDDS允许在同一台机器内的实体之间加速通信,通过共享内存与DataWriter的历史记录共享给DataReader。这防止了传输层所涉及的任何开销,有效地避免了DataWriter和DataReader之间的任何数据拷贝。
-
<kind>
—指定使用那种数据共享,可用值:1.OFF
:数据共享分发被禁用。将不使用数据共享分发功能进行通信。2.ON
:启动数据共享功能,如果当前Topic和数据共享分发不兼容,则会发生错误。3.AUTOMATIC
:如果当前主题与数据共享兼容,则数据共享交付将被激活,如果不兼容则停用。默认值:AUTOMATIC
-
<shared_dir>
—将用于内存映射文件的目录。如果没有配置,那么将使用系统默认目录。string
-
<max_domains>
—确定本地或远程端点中数据共享域ID的最大数量。域ID在数据共享交付兼容的端点之间交换。如果这个值低于任何远程端点的列表大小,匹配可能会失败。数值为零代表ID数量不受限制,uint32_t
,默认值:0
,配置为0
则无限制 -
<domain_ids>
—为当前端配置的数据共享域ID的列表。 -
<domainId>
—为当前DataWriter或DataReader配置的数据共享域ID的列表。如果没有提供ID,系统将为当前机器创建一个唯一的ID。uint32_t
deadline
描述:当新样本的频率低于某个阈值时,QoS会发出警报。它对那些预计会定期更新数据的情况很有用。在发布侧,deadline定义了应用程序预计提供新样本的最长期限。在订阅侧,deadline定义了应接收新样本的最长期限。
默认值:
0
以秒来定义:
<deadline> <period> <sec>1</sec> </period> </deadline>
- 1
- 2
- 3
- 4
- 5
以纳秒定义:
<deadline> <period> <nanosec>1000000</nanosec> </period> </deadline>
- 1
- 2
- 3
- 4
- 5
disable_heartbeat_piggyback
描述:判断是否禁用发送心跳子消息-------在FastDDS中除了使用heartbeatPeriod定期发送心跳之外,可靠的DataWriters还使用一种机制,在将数据传递给DataReaders的同一消息中附加一个心跳子消息。这个机制在可靠的通信状态必须是最新的以维持最佳通信的特定情况下发挥作用。
-
当DataWriter向套接字发送的字节数与套接字缓冲区的长度相同时,在最后一个数据之后会附加一个心跳子信息。
-
当DataWriter的历史记录已满时,DataWriter开始在每个数据后附加心跳子消息。
类型:
bool
默认值:
false
disablePositiveAcks
描述:当不需要严格的可靠通信和带宽有限时,这种QoS允许减少网络流量。它包括改变默认的行为,即从DataReader向DataWriter发送正向脉冲。取而代之的是,当DataReader缺少一个样本时,将只发送负的脉冲信号,但DataWriter将保留数据足够长的时间,然后再将其视为确认。
-
enabled
:指定QoS是否被启用。如果为true,意味着禁用正脉冲,DataReader只发送负脉冲。否则,正反脉冲都会被发送。bool
,默认值:false
-
duration
:说明DataWriters在将其视为确认之前保留数据的时间。这个值不适用于DataReaders。
<disablePositiveAcks> <enabled>true</enabled> <duration> <sec>1</sec> </duration> </disablePositiveAcks>
- 1
- 2
- 3
- 4
- 5
- 6
durability
描述:即使网络上没有DataReaders,DataWriter也可以在整个Topic上发送消息。此外,在一些数据被写入后加入主题的数据读取器可能对访问该信息感兴趣
DurabilityQoSPolicy定义了系统将如何处理那些在DataReader加入之前就存在于Topic上的样本。系统的行为取决于DurabilityQosPolicyKind的值。
<kind>
—可选值:1.VOLATILE_DURABILITY_QOS
:该服务不需要代表任何DataReader保留任何在实例写入时不为DataWriter所知的数据实例的样本。换句话说,该服务将只尝试向现有的订阅者提供数据。2.TRANSIENT_LOCAL_DURABILITY_QOS
:服务只需要在写入数据的DataWriter的内存中保留数据,数据不需要在DataWriter中生存。3.TRANSIENT_DURABILITY_QOS
:对于TRANSIENT,服务只需要将数据保存在内存中,而不是永久存储;但数据并不与DataWriter的生命周期相联系,而且一般来说,它将在DataWriter中存活。4.PERSISTENT_DURABILITY_QOS
:数据被保存在永久存储器上,因此它们可以超过系统会话的寿命。默认值:DataReader:VOLATILE_DURABILITY_QOS
,DataWriter:TRANSIENT_LOCAL_DURABILITY_QOS
<durability> <kind>VOLATILE</kind> </durability>
- 1
- 2
- 3
latencyBudget
描述:指定了从数据被写入到被插入DataReader历史记录并被通知的最大可接受的延迟。该延迟默认设置为0,以便优化内部操作
<latencyBudget> <duration> <sec>1</sec> </duration> </latencyBudget>
- 1
- 2
- 3
- 4
- 5
lifespan
描述:每个由DataWriter写入的数据样本都有一个相关的过期时间,超过这个时间,数据就会从数据写入器和数据读取器的历史以及瞬时和持久的信息缓存中删除(参见LifespanQosPolicy)。
默认情况下,持续时间是无限的,这意味着由DataWriter写入的样本的有效性没有一个最大的持续时间。
<lifespan> <duration> <sec>5</sec> <nanosec>0</nanosec> </duration> </lifespan>
- 1
- 2
- 3
- 4
- 5
- 6
liveliness
描述:确保网络上的特定实体仍然活跃
-
<kind>
:是自己判断自己是否活跃,还是由发布方判断是否活跃,可选值:1.AUTOMATIC_LIVELINESS_QOS
:只要链接存在,就认为是活跃的。2.MANUAL_BY_PARTICIPANT_LIVELINESS_QOS
:如果发布方的一个实体宣称它是活的,服务就会推断出同一DomainParticipant中的所有其他实体也是活的。3.MANUAL_BY_TOPIC_LIVELINESS_QOS
:这种模式的限制性更强,要求DataWriter内至少有一个实例被判断是活的。默认值:AUTOMATIC_LIVELINESS_QOS
-
<lease_duration>
:从上一次DataWriter判断活跃后,需要等待多少时间才能认为它不再活跃了。 -
<announcement_period>
:由DataWriter发送的连续活跃信息之间的时间量。这个数据成员只有在种类为AUTOMATIC_LIVELINESS_QOS
或MANUAL_BY_PARTICIPANT_LIVELINESS_QOS
的情况下才会生效,并且需要低于<lease_duration>
。
<liveliness> <kind>AUTOMATIC</kind> <lease_duration> <sec>1</sec> <nanosec>856000</nanosec> </lease_duration> <announcement_period> <sec>1</sec> <nanosec>856000</nanosec> </announcement_period> </liveliness>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
ownership
描述:该QoS策略指定是否允许多个DataWriters更新同一数据实例,如果允许,应如何仲裁这些修改。
-
<kind>
,可选值: -
-
SHARED_OWNERSHIP_QOS
:该选项表示服务不为每个实例强制执行唯一的所有权。在这种情况下,允许多个DataWriters更新同一个数据实例,所有的更新都提供给现有的DataReaders使用。 -
EXCLUSIVE_OWNERSHIP_QOS
:这个选项表示每个实例只能由一个DataWriter更新,这意味着在任何时间点,一个DataWriter拥有每个实例,并且是唯一一个其修改对现有DataReaders可见的人。所有者可以根据活跃的DataWriter之间的最高实力动态地改变,这没有违反关于数据实例的最后期限合同。这种强度可以通过OwnershipStrengthQosPolicy来改变。如果两个DataWriter具有相同的强度值,具有较低GUID值的DataWriter将是该主题的所有者。
-
<ownership> <kind>EXCLUSIVE</kind> </ownership>
- 1
- 2
- 3
ownershipStrength
描述:这个QoS策略指定了用于在试图修改同一数据实例的多个DataWriter之间进行仲裁的强度值。它只在OwnershipQosPolicy种类被设置为
EXCLUSIVE_OWNERSHIP_QOS
时适用。<ownershipStrength> <value>50</value> </ownershipStrength>
- 1
- 2
- 3
partition
描述:该Qos策略允许在由域引入的物理分区内引入一个逻辑分区。为了让DataReader看到DataWriter对数据所做的改变,不仅主题必须匹配,而且它们还必须至少共享一个逻辑分区。注:空字符串也被认为是一个有效的分区,是用的正则表达式匹配规则。
<partition> <names> <name>part1</name> <name>part2</name> </names> </partition>
- 1
- 2
- 3
- 4
- 5
- 6
publishMode
描述:这个QoS策略配置了DataWriter发送数据的方式。
-
<kind>
—可选值: -
-
SYNCHRONOUS_PUBLISH_MODE
:同步的,数据是在调用写操作的用户线程的上下文中发送的。 -
ASYNCHRONOUS_PUBLISH_MODE
:异步的,一个内部线程负责异步发送数据。写操作在数据实际发送前返回。 -
默认值:
SYNCHRONOUS_PUBLISH_MODE
-
<publishMode> <kind>ASYNCHRONOUS</kind> </publishMode>
- 1
- 2
- 3
reliability
描述:该QoS策略表示服务提供和要求的可靠性水平。
类型:
Enum
-
BEST_EFFORT_RELIABILITY_QOS
:它表明可以接受不重发缺失的样本,所以信息的发送不需要等待到达确认。据推测,样本的新值会经常产生,因此没有必要重新发送任何样本。然而,由同一个DataWriter发送的数据样本将按照它们出现的顺序存储在DataReader的历史中。换句话说,即使DataReader错过了一些数据样本,一个较旧的值也不会覆盖一个较新的值。 -
RELIABLE_RELIABILITY_QOS
:它表示该服务将尝试交付DataWriter历史上的所有样本,期望得到DataReader的到达确认。如果有以前的样本还没有被收到,那么同一个DataWriter发送的数据样本就不能提供给DataReader。该服务将重新传输丢失的数据样本,以便在数据读取器可以访问之前重建DataWriter历史的正确快照。注:这个选项可能会阻塞写操作,因此设置了max_blocking_time,一旦时间过了就会解除阻塞。但是如果max_blocking_time在数据被发送之前就过期了,写操作将返回一个错误。
默认值:
BEST_EFFORT_RELIABILITY_QOS
这些配置是允许的:
DataWriter 种类 DataReader 种类 可行性 BEST_EFFORT_RELIABILITY_QOS BEST_EFFORT_RELIABILITY_QOS Yes BEST_EFFORT_RELIABILITY_QOS RELIABLE_RELIABILITY_QOS No RELIABLE_RELIABILITY_QOS BEST_EFFORT_RELIABILITY_QOS Yes RELIABLE_RELIABILITY_QOS RELIABLE_RELIABILITY_QOS Yes <reliability> <kind>BEST_EFFORT</kind> <max_blocking_time> <sec>1</sec> <nanosec>856000</nanosec> </max_blocking_time> </reliability>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
times
描述:配置了一些关于DataWriter的时间参数
initialHeartbeatDelay
描述:定义初始心跳延迟的持续时间。
默认值:
12ms
<times> <initialHeartbeatDelay> <sec>1</sec> <nanosec>856000</nanosec> </initialHeartbeatDelay> </times>
- 1
- 2
- 3
- 4
- 5
- 6
heartbeatPeriod
描述:指定定期心跳的时间间隔。
默认值:
3ms
<times> <heartbeatPeriod> <sec>1</sec> <nanosec>856000</nanosec> </heartbeatPeriod> </times>
- 1
- 2
- 3
- 4
- 5
- 6
nackResponseDelay
描述:当接收端接到消息后,延迟多长时间向发送端回复确认接收的信号
默认值:
5ms
<times> <nackResponseDelay> <sec>1</sec> <nanosec>856000</nanosec> </nackResponseDelay> </times>
- 1
- 2
- 3
- 4
- 5
- 6
nackSupressionDuration
描述:允许DataWriter忽略NACK消息,数据被发送后的一段时间内忽略NACK信息。
默认值:
0ms
不忽略<times> <nackSupressionDuration> <sec>1</sec> <nanosec>856000</nanosec> </nackSupressionDuration> </times>
- 1
- 2
- 3
- 4
- 5
- 6
unicastLocatorList
描述:指定单播列表
multicastLocatorList
描述:指定多播列表
配置同defaultMulticastLocatorList
external_unicast_locators
描述:指定外部单播定位器
配置同default_external_unicast_locators
ignore_non_matching_locators
描述:当其他参与者发布的定位器与该参与者发布的任何定位器不匹配时,是否忽略其他定位器。
配置同ignore_non_matching_locators
historyMemoryPolicy
描述:表示在处理RTPSEndpointQos的CacheChanges方面管理内存的方式。
类型:读取器历史记录的存储策略。允许用户指定消息历史记录应该如何存储,以及在发布者和订阅者之间如何共享这些历史记录
类型:
HistoryMemoryPolicy
的枚举-
可用值如下:
-
PREALLOCATED_MEMORY_MODE
:将每个数据类型的大小设置为最大,它产生最大的内存占用,但内存分配次数最小。 -
PREALLOCATED_WITH_REALLOC_MEMORY_MODE
:将每种数据类型的大小设置为默认值,当有更大的消息到达时,它需要重新分配内存。它以增加内存分配次数为代价,产生了较低的内存占用。 -
DYNAMIC_RESERVE_MEMORY_MODE
:这个选项在消息到达时动态地分配内存大小。它产生最小的内存占用,但内存分配次数最多。 -
DYNAMIC_REUSABLE_MEMORY_MODE
: 这个选项与DYNAMIC_RESERVE_MEMORY_MODE
类似,但分配的内存会被重新用于未来的信息。 -
默认值:
PREALLOCATED_MEMORY_MODE
propertiesPolicy
userDefinedID
配置同静态EDPxml加载
entityID
配置同entityID
matchedSubscribersAllocation
描述:定义DataWriter分配策略
-
<initial>
—最初分配的个数,uint32_t
,默认:0
-
<maximum>
—最大的个数,uint32_t
,默认:0
(0的话就是不限制最大个数) -
<increment>
—达到配置的最大空间后,允许增加的数量,uint32_t
,默认:1
<matchedSubscribersAllocation> <initial>0</initial> <maximum>0</maximum> <increment>1</increment> </matchedSubscribersAllocation>
- 1
- 2
- 3
- 4
- 5
例子
<?xml version="1.0" encoding="UTF-8" ?> <dds> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles" > <data_writer profile_name="datawriter_profile_name"> <topic> <!-- TOPIC_TYPE --> </topic>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>qos</span><span class="token punctuation">></span></span> <span class="token comment"><!-- QOS --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>qos</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>times</span><span class="token punctuation">></span></span> <span class="token comment"><!-- writerTimesType --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initialHeartbeatDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>12<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initialHeartbeatDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>heartbeatPeriod</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sec</span><span class="token punctuation">></span></span>3<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>heartbeatPeriod</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nackResponseDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>5<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nackResponseDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nackSupressionDuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nackSupressionDuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>times</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>unicastLocatorList</span><span class="token punctuation">></span></span> <span class="token comment"><!-- LOCATOR_LIST --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>udpv4</span><span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>unicastLocatorList</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>multicastLocatorList</span><span class="token punctuation">></span></span> <span class="token comment"><!-- LOCATOR_LIST --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>udpv4</span><span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>multicastLocatorList</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>external_unicast_locators</span><span class="token punctuation">></span></span> <span class="token comment"><!-- EXTERNAL_LOCATOR_LIST --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>udpv4</span> <span class="token attr-name">externality</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">cost</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">mask</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>address</span><span class="token punctuation">></span></span>100.100.100.10<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>address</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>port</span><span class="token punctuation">></span></span>12345<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>port</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>udpv4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>external_unicast_locators</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ignore_non_matching_locators</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ignore_non_matching_locators</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>historyMemoryPolicy</span><span class="token punctuation">></span></span>DYNAMIC<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>historyMemoryPolicy</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>propertiesPolicy</span><span class="token punctuation">></span></span> <span class="token comment"><!-- PROPERTIES_POLICY --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>propertiesPolicy</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>userDefinedID</span><span class="token punctuation">></span></span>55<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>userDefinedID</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>entityID</span><span class="token punctuation">></span></span>66<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>entityID</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>matchedSubscribersAllocation</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initial</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initial</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>maximum</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>maximum</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>increment</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>increment</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>matchedSubscribersAllocation</span><span class="token punctuation">></span></span> <span class="token comment"><!-- reader_filters_allocation cannot be configured using XML (yet) --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>data_writer</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>profiles</span><span class="token punctuation">></span></span>
<dds>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
DataReader profiles(数据读取器配置)
DataReader的标签
<data_reader>
位于<dds>/<profiles>/<data_reader>
下<data_reader>
标签的属性:-
profile_name
:必配项,设置<data_reader>
配置文件在DDS域中的注册名称。
以便DomainParticipant以后可以加载它 -
is_default_profile
:选配项,将<data_reader>
配置文件设置为默认配置文件。因此,如果一个默认的配置文件存在,它将被用于在创建DataWriter时没有指定其他DataWriter配置文件的情况下,将使用该配置文件。
<data_reader profile_name="datareader_profile_name">
- 1
topic
qos
同qos
times
unicastLocatorList
multicastLocatorList
external_unicast_locators
ignore_non_matching_locators
expectsInlineQos
描述:是否使用默认的内联Qos
类型:
bool
默认值:
false
historyMemoryPolicy
propertiesPolicy
userDefinedID
entityID
matchedPublishersAllocation
例子
<?xml version="1.0" encoding="UTF-8" ?> <dds> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles" > <data_reader profile_name="sub_profile_name"> <topic> <!-- TOPIC_TYPE --> </topic>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>qos</span><span class="token punctuation">></span></span> <span class="token comment"><!-- QOS --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>qos</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>times</span><span class="token punctuation">></span></span> <span class="token comment"><!-- readerTimesType --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initialAcknackDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>70<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initialAcknackDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>heartbeatResponseDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sec</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nanosec</span><span class="token punctuation">></span></span>5<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nanosec</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>heartbeatResponseDelay</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>times</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>unicastLocatorList</span><span class="token punctuation">></span></span> <span class="token comment"><!-- LOCATOR_LIST --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>udpv4</span><span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>unicastLocatorList</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>multicastLocatorList</span><span class="token punctuation">></span></span> <span class="token comment"><!-- LOCATOR_LIST --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>udpv4</span><span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>locator</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>multicastLocatorList</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>external_unicast_locators</span><span class="token punctuation">></span></span> <span class="token comment"><!-- EXTERNAL_LOCATOR_LIST --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>udpv4</span> <span class="token attr-name">externality</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">cost</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">mask</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>address</span><span class="token punctuation">></span></span>100.100.100.10<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>address</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>port</span><span class="token punctuation">></span></span>12345<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>port</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>udpv4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>external_unicast_locators</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ignore_non_matching_locators</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ignore_non_matching_locators</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>expectsInlineQos</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>expectsInlineQos</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>historyMemoryPolicy</span><span class="token punctuation">></span></span>DYNAMIC<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>historyMemoryPolicy</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>propertiesPolicy</span><span class="token punctuation">></span></span> <span class="token comment"><!-- PROPERTIES_POLICY --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>propertiesPolicy</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>userDefinedID</span><span class="token punctuation">></span></span>55<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>userDefinedID</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>entityID</span><span class="token punctuation">></span></span>66<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>entityID</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>matchedPublishersAllocation</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>initial</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>initial</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>maximum</span><span class="token punctuation">></span></span>0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>maximum</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>increment</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>increment</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>matchedPublishersAllocation</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>data_reader</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>profiles</span><span class="token punctuation">></span></span>
<dds>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
Transport descriptors(传输层配置)
<transports_descriptors>
标签位于<dds>/<profiles>/<transport_descriptors>
这些元素被定义在XML标签
<transports_descriptors>
中。<transport_descriptors>
可以包含一个或多个<transport_descriptor>
XML元素。每个<transport_descriptor>
元素都定义了对特定类型的传输协议的配置。这些<transport_descriptor>
元素中的每一个都是由<transport_id>
XML标签的传输ID唯一识别的。一旦用户定义了有效的<transports_descriptor>
,即定义了传输层参数,就可以使用<transport_id>
XML标签将这些参数加载到DomainParticipant的XML配置文件。下面列出了可以在
<transport_descriptor>
元素中定义的所有可用的 XML 元素,用于配置传输层。transport_id
描述:用于识别每个transport的唯一名称。
类型:
string
type
描述:transport的类型
类型:
UDPv4 / UDPv6 / TCPv4 / TCPv6 / SHM
默认值:
UDPv4
sendBufferSize
描述:发送套接字缓冲区的大小(字节)。如果该值为零,那么Fast DDS将使用系统默认的套接字大小。
类型:
uint32_t
默认值:
0
receiveBufferSize
描述:接收套接字的大小,单位是字节。如果该值为零,那么Fast DDS将使用系统默认的套接字大小。
类型:
uint32_t
默认值:
0
maxMessageSize
描述:消息缓冲区的最大尺寸(字节)。
类型:
uint32_t
默认值:
65500
maxInitialPeersRange
描述:最大与每个初始的远程peer打开的通道数量。
类型:
uint32_t
默认值:
4
interfaceWhiteList
描述:使用Fast DDS,可以限制TCP和UDP使用的网络接口。这是通过将接口的IP地址添加到TCPTransportDescriptor或UDPTransportDescriptor的interfaceWhiteList字段中来实现的。因此,DomainParticipants所使用的通信接口仅限于该列表中定义的接口的IP地址,因此避免了对系统中其他可用网络接口的使用。这个列表中的值应该与你的机器在该网络中的IP相匹配。
<?xml version="1.0" encoding="UTF-8" ?> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"> <transport_descriptors> <transport_descriptor> <transport_id>CustomTcpTransport</transport_id> <type>TCPv4</type> <interfaceWhiteList> <address>127.0.0.1</address> </interfaceWhiteList> </transport_descriptor> </transport_descriptors>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>participant</span> <span class="token attr-name">profile_name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>CustomTcpTransportParticipant<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>rtps</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>userTransports</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>transport_id</span><span class="token punctuation">></span></span>CustomTcpTransport<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>transport_id</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>userTransports</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>rtps</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>participant</span><span class="token punctuation">></span></span>
</profiles>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
TTL
描述:UDP的持续时间,注:仅UDP需要配置
类型:
uint8_t
默认值:
1
non_blocking_send
描述:是否在套接字上设置非阻塞的发送模式,注:仅UDP需要配置
类型:
bool
默认值:
false
output_port
描述:用于输出绑定的端口。如果没有定义这个字段,输出端口将是随机的注:仅UDP需要配置。
类型:
uint16_t
默认值:
0
wan_addr
描述:使用TCPv4时的公共广域网地址。这个字段是可选的,不定义就是不需要广域网传播,注:仅TCPv4需要配置**。
类型:IPv4 类型
string
:XXX.XXX.XXX.XXX
默认值:无
keep_alive_frequency_ms
描述:发送RTCP keep-alive请求的频率,以毫秒为单位,注:仅TCP需要配置
类型:
uint32_t
默认值:
50000
keep_alive_timeout_ms
描述:从最后一次发送keep-alive请求到认为连接中断的时间,注:仅TCP需要配置
类型:
uint32_t
默认值:
10000
max_logical_port
描述:在RTCP尝试连接过程中要尝试的最大逻辑端口数,注:仅TCP需要配置
类型:
uint16_t
默认值:
100
logical_port_range
描述:在RTCP尝试连接过程中每个请求去尝试的最大逻辑接口数量,注:仅TCP需要配置
类型:
uint16_t
默认值:
20
logical_port_increment
描述:在RTCP尝试连接过程中尝试的逻辑端口之间的增量,注:仅TCP需要配置
类型:
uint16_t
默认值:
2
listening_ports
描述:传输的端口号注:仅TCP需要配置
类型:
List <uint16_t>
tls
配置传输层相关的,可以看这里
calculate_crc
描述:计算用于错误控制的循环冗余码(CRC)注:仅TCP需要配置
类型:
bool
默认值:
true
check_crc
描述:检查CRC的错误控制。注:仅TCP需要配置
类型:
bool
默认值:
true
enable_tcp_nodelay
描述:用于禁用Nagle算法的Socket选项。注:仅TCP需要配置
类型:
bool
默认值:
false
segment_size
描述:共享内存段的大小(以字节为单位)。注:仅SHM需要配置
类型:
uint32_t
默认值:
262144
port_queue_capacity
描述:每个Listener可用的容量(消息数量)。注:仅SHM需要配置
类型:
uint32_t
默认值:
512
healthy_check_timeout_ms
描述:检查Listener是否活跃的最大时间,以ms为单位。注:仅SHM需要配置
类型:
uint32_t
默认值:
1000
rtps_dump_file
描述:一个完整的目录,RTPS的log调试信息会存在这里,如果为空,表示不记录log。注:仅SHM需要配置
类型:
string
例子
<?xml version="1.0" encoding="UTF-8" ?> <dds> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles" > <transport_descriptors> <transport_descriptor> <transport_id>TransportId1</transport_id> <type>UDPv4</type> <sendBufferSize>8192</sendBufferSize> <receiveBufferSize>8192</receiveBufferSize> <maxMessageSize>16384</maxMessageSize> <maxInitialPeersRange>100</maxInitialPeersRange> <interfaceWhiteList> <address>192.168.1.41</address> <address>127.0.0.1</address> </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
-