实用指南:12. PropertyPolicyQos 选项
12. PropertyPolicyQos 选项
本节包含可通过 Fast DDS 进行设置的 PropertyPolicyQos 列表:
12.1 非整合式 QoS(Non consolidated QoS)
PropertyPolicyQoS 选项用于开发新的 eProsima 扩展 QoS。在新的 QoS 策略完成整合前,通常会通过这种通用 QoS 策略进行设置。因此,本节内容可能会频繁更新,建议用户在升级到不同版本后,查看最新变更内容。
12.1.1 “数据写入器运行模式” QoS 策略(DataWriter operating mode QoS Policy)
默认情况下,Fast DDS 的 DataWriter(数据写入器)采用推送模式(push mode) 启用。这意味着 DataWriter 会将新的数据样本加入队列,然后立即将其发送给匹配的 DataReader(数据读取器)。对于产生非周期性数据突发的 DataWriter 而言,这种模式可能导致大量数据包占用网络带宽,在不可靠传输(如 UDP 传输)中增加数据包丢失的概率。此外,根据自身 QoS 配置,DataReader 可能需要忽略部分接收的样本,这会导致这些样本需要重新发送。
将 DataWriter 配置为拉取模式(pull mode) 可提供一种替代方案,让每个 DataReader 自主控制数据流量的节奏。其工作原理是:DataWriter 先通知 DataReader 有可用数据,然后等待 DataReader 请求其能处理的数据量。尽管这种模式会增加一定延迟,但相比推送模式,它能在保证可靠性的同时,显著减少数据包的发送数量。
DataWriter 会通过心跳包(heartbeat)定期通告其队列状态。DataReader 接收到心跳包后,会请求 DataWriter 发送其想要处理的数据样本。因此,可通过调整心跳包周期来优化数据发布速率,更多细节请参见《调整心跳包周期》(Tuning Heartbeat Period)。
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 | 默认值 |
|---|---|---|
"fastdds.push_mode" | "true" / "false" | "true" |
C++ 代码示例
DataWriterQos wqos;
// 启用拉取模式
wqos.properties().properties().emplace_back(
"fastdds.push_mode",
"false");
XML 配置示例
fastdds.push_mode
false
注意(Note)
- 同一进程内的 DataReader 通信(进程内传输,Intra-process delivery)始终使用推送模式(push mode)。
- 采用 “尽力而为可靠性 QoS”(BEST_EFFORT_RELIABILITY_QOS)的 DataReader 通信,始终使用推送模式(push mode)。
警告(Warning)
- 同时启用 “拉取模式(pull mode)” 并将 “可靠性 QoS 策略类型”(ReliabilityQosPolicyKind)设置为 “尽力而为可靠性 QoS”(BEST_EFFORT_RELIABILITY_QOS),这种配置是不一致的。
- 同时启用 “拉取模式(pull mode)” 并将 “心跳包周期”(heartbeat_period)设置为 “无限时间”(c_TimeInfinite),这种配置是不一致的。
12.1.2 唯一网络流 QoS 策略(Unique network flows QoS Policy)
警告(Warning)
本节内容仍在开发中。
12.1.3 统计模块设置(Statistics Module Settings)
Fast DDS 统计模块通过 PropertyPolicyQoS 指定自动启用的统计数据写入器(statistics DataWriters),具体可参见《自动启用统计数据写入器》(Automatically enabling statistics DataWriters)。在此场景下,属性值是一个以分号分隔的列表,包含用户希望启用的统计主题名称别名。
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 | 默认值 |
|---|---|---|
"fastdds.statistics" | 以分号分隔的统计主题名称别名列表 | ""(空字符串) |
C++ 代码示例
DomainParticipantQos pqos;
// 启用 Fast DDS 统计模块
pqos.properties().properties().emplace_back("fastdds.statistics",
"HISTORY_LATENCY_TOPIC;ACKNACK_COUNT_TOPIC;DISCOVERY_TOPIC;PHYSICAL_DATA_TOPIC");
XML 配置示例
fastdds.statistics
HISTORY_LATENCY_TOPIC;ACKNACK_COUNT_TOPIC;DISCOVERY_TOPIC;PHYSICAL_DATA_TOPIC
12.1.3.1 发现信息中的物理数据(Physical Data in Discovery Information)
可将 “物理数据主题”(PHYSICAL_DATA_TOPIC)中传递的信息包含到参与者发现消息(即 DATA [p],具体可参见《发现阶段》(Discovery phases))中。只需在 PropertyPolicyQos 中设置以下属性即可实现:
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 | 未定义 FASTDDS_STATISTICS 时的默认值 | 定义 FASTDDS_STATISTICS 时的默认值 |
|---|---|---|---|
"fastdds.physical_data.host" | 应用程序运行所在的主机名 | 未设置(Not set) | ""(空字符串) |
"fastdds.physical_data.user" | 运行应用程序的用户名 | 未设置(Not set) | ""(空字符串) |
"fastdds.physical_data.process" | 运行应用程序的进程名 | 未设置(Not set) | ""(空字符串) |
只要在 “域参与者 QoS”(DomainParticipantQos)中定义了上述任一属性,DomainParticipant(域参与者)的 DATA [p] 消息就会包含对应的属性值。此外,若任一属性被设置为 ""(空字符串,这是定义 FASTDDS_STATISTICS 时的默认值,具体可参见《CMake 选项》(CMake options)),Fast DDS 会按以下规则自动填充属性值:
"fastdds.physical_data.host":由asio::ip::host_name()函数返回的主机名,后接":<默认数据共享域 ID>"(<default data sharing domain id>)。"fastdds.physical_data.user":运行应用程序的用户名;若无法获取用户名,则填充为"unknown"(未知)。"fastdds.physical_data.process":应用程序运行所在的进程 ID。
上述规则意味着,无论是否定义 FASTDDS_STATISTICS,都可向 DATA [p] 消息中添加物理信息,且可让 Fast DDS 为 “主机(host)”“用户(user)” 和 “进程(process)” 属性设置默认值,具体规则如下:
- 若定义了
FASTDDS_STATISTICS,且用户未指定其他配置,Fast DDS 会为 DATA [p] 的物理属性设置默认值。 - 若定义了
FASTDDS_STATISTICS,且用户为物理属性设置了自定义值,则优先使用用户配置的值。 - 若定义了
FASTDDS_STATISTICS,且用户从 DomainParticipantQos 中移除了物理属性,则 DATA [p] 消息中不会传输任何物理信息。 - 若未定义
FASTDDS_STATISTICS,仍可通过设置上述属性向 DATA [p] 消息中传输物理信息:- 若属性值设为
""(空字符串),Fast DDS 会按上述规则自动填充值。 - 若属性值设为非空字符串,则 DATA [p] 消息会直接传输该自定义值。
- 若属性值设为
若定义了 FASTDDS_STATISTICS,且启用了通过 “发现主题”(DISCOVERY_TOPIC)上报统计数据的功能(具体可参见《统计模块设置》(Statistics Module Settings)),则当一个 DomainParticipant 发现另一个 DomainParticipant 时,DATA [p] 中包含的物理信息也会通过 “物理数据主题”(PHYSICAL_DATA_TOPIC)传输。
C++ 代码示例
/* 创建上报默认物理属性的域参与者 */
DomainParticipantQos pqos_default_physical;
// 注意:若定义了 FASTDDS_STATISTICS,则无需将属性值设为 ""(空字符串)
pqos_default_physical.properties().properties().emplace_back("fastdds.physical_data.host", "");
pqos_default_physical.properties().properties().emplace_back("fastdds.physical_data.user", "");
pqos_default_physical.properties().properties().emplace_back("fastdds.physical_data.process", "");
DomainParticipant* participant_with_physical = DomainParticipantFactory::get_instance()->create_participant(0,
pqos_default_physical);
/* 创建上报自定义物理属性的域参与者 */
DomainParticipantQos pqos_custom_physical;
// 注意:若定义了 FASTDDS_STATISTICS,需先清空属性列表再设置自定义值
// pqos_custom_physical.properties().properties().clear()
pqos_custom_physical.properties().properties().emplace_back("fastdds.physical_data.host", "custom_hostname");
pqos_custom_physical.properties().properties().emplace_back("fastdds.physical_data.user", "custom_username");
pqos_custom_physical.properties().properties().emplace_back("fastdds.physical_data.process", "custom_process");
DomainParticipant* participant_custom_physical = DomainParticipantFactory::get_instance()->create_participant(0,
pqos_custom_physical);
/* 创建不上报物理属性的域参与者 */
DomainParticipantQos pqos_no_physical;
pqos_no_physical.properties().properties().clear();
DomainParticipant* participant_without_physical = DomainParticipantFactory::get_instance()->create_participant(
0, pqos_no_physical);
/* 从默认 XML 文件加载物理属性 */
DomainParticipantFactory::get_instance()->load_profiles();
DomainParticipantQos pqos_default_xml_physical =
DomainParticipantFactory::get_instance()->get_default_participant_qos();
DomainParticipant* participant_default_xml_physical =
DomainParticipantFactory::get_instance()->create_participant(0, pqos_default_xml_physical);
/* 从指定 XML 文件加载物理属性 */
DomainParticipantFactory::get_instance()->load_XML_profiles_file("somefile.xml");
DomainParticipantFactory::get_instance()->load_profiles();
DomainParticipantQos pqos_custom_xml_physical =
DomainParticipantFactory::get_instance()->get_default_participant_qos();
DomainParticipant* participant_custom_xml_physical =
DomainParticipantFactory::get_instance()->create_participant(0, pqos_custom_xml_physical);
XML 配置示例
fastdds.physical_data.host
custom_hostname
fastdds.physical_data.user
custom_username
fastdds.physical_data.process
custom_process
重要提示(Important)
通过 XML 设置的属性会覆盖默认 QoS 中的属性,这意味着无论是否定义 FASTDDS_STATISTICS,都可通过 XML 配置物理属性。但无法通过 XML 移除物理属性 —— 若应用程序启用了 FASTDDS_STATISTICS,且不希望在 DomainParticipant 的 DATA [p] 消息中传输物理信息,则必须通过上述 C++ API 移除相关属性。
12.1.4 端点分区(Endpoint Partitions)
Fast DDS 通过该 PropertyPolicyQoS 定义端点(Endpoint)所属的分区。此属性的匹配逻辑与 “发布者(Publisher)” 和 “订阅者(Subscriber)” 的 “分区 QoS 策略”(PartitionQoSPolicy)一致。
该属性的值是一个以分号分隔的列表,包含用户希望该端点所属的分区名称。
重要提示(Important)
若发布者(Publisher)与其下某个数据写入器(DataWriter)的分区配置存在冲突(即 DataWriter 定义了该属性,而 Publisher 定义了 PartitionQoSPolicy),则优先使用 DataWriter 的配置,且该端点会忽略 Publisher 的 PartitionQoSPolicy。此规则同样适用于订阅者(Subscriber)及其下的数据读取器(DataReader)。
通过 create_with_profile 函数创建 DataReader 和 DataWriter 时,会自动设置该属性。端点创建后,无法修改该属性。
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 | 默认值 |
|---|---|---|
"partitions" | 以分号分隔的分区名称列表 | ""(空字符串) |
C++ 代码示例
DataWriterQos wqos;
// 添加分区
wqos.properties().properties().emplace_back(
"partitions",
"part1;part2");
DataReaderQos rqos;
// 添加分区
rqos.properties().properties().emplace_back(
"partitions",
"part1;part2");
XML 配置示例
part1
part2
part1
part2
12.1.5 静态发现的交换格式(Static Discovery’s Exchange Format)
静态发现(Static Discovery)在 “参与者发现阶段”(PDP,Participant Discovery Phase)中交换数据。目前支持两种不同的交换格式,可通过属性 dds.discovery.static_edp.exchange_format 进行选择。
| PropertyPolicyQos 值 | 描述(Description) | 默认值 |
|---|---|---|
"v1" | 静态发现的标准交换格式。 | ✅ |
"v1_Reduced" | 精简格式,可减少 “参与者发现阶段”(PDP)中传输静态发现信息所需的网络带宽。 |
C++ 代码示例
DomainParticipantQos participant_qos;
participant_qos.properties().properties().emplace_back(
"dds.discovery.static_edp.exchange_format",
"v1_Reduced"
);
XML 配置示例
dds.discovery.static_edp.exchange_format
v1_Reduced
12.1.6 共享内存(SHM)传输元流量强制策略(SHM transport meta-traffic enforcement)
默认情况下,域参与者(DomainParticipant)会同时配置 UDP 传输和共享内存(SHM,Shared Memory)传输。当发现同一主机上其他进程中的参与者时,端点发现(endpoint discovery)可能通过上述任一传输方式完成。
避免使用共享内存传输发现流量(discovery traffic,属于元流量)可节省宝贵的资源。可通过属性 fastdds.shm.enforce_metatraffic 配置该行为。
| PropertyPolicyQos 值 | 描述(Description) | 默认值 |
|---|---|---|
"none" | 使用其他传输方式处理元流量。 | ✅ |
"unicast" | 启用共享内存传输的单播通信。 | |
"all" | 启用共享内存传输的单播和多播通信。此配置可实现 “仅共享内存参与者” 与 “多传输方式参与者” 之间的发现。 |
注意(Note)
若某个参与者仅配置了共享内存(SHM)这一种传输方式,则会忽略该属性的设置,默认按 "all"(全部启用)处理。
C++ 代码示例
DomainParticipantQos participant_qos;
// 共享内存传输将监听单播元流量
participant_qos.properties().properties().emplace_back(
"fastdds.shm.enforce_metatraffic",
"unicast");
XML 配置示例
fastdds.shm.enforce_metatraffic
unicast
12.1.7 最大消息大小(Maximum Message Size)
实际应用中常需区分接收数据报(datagram)和发送数据报的最大大小。在某些场景下,这种区分尤为重要 —— 例如,系统可能需要处理较大的入站数据,但为避免占用过多网络资源或遵守网络流量策略,需限制出站数据的大小。
控制数据报大小的核心属性是 maxMessageSize,它同时设置了可接收和可发送数据报的最大大小上限。而属性 fastdds.max_message_size 允许在不修改入站数据报大小限制的前提下,单独限制出站数据报的大小。通过该属性,可具体配置出站数据报的最大字节数。
若将该属性的值设置为小于所有传输方式中最小 maxMessageSize 的值,应用程序可在保持接收大尺寸数据报能力的同时,降低出站数据报的大小限制。
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 | 默认值 |
|---|---|---|
"fastdds.max_message_size" | uint32_t(无符号 32 位整数) | "4294967295"(即 2³²-1) |
注意(Note)
若 fastdds.max_message_size 的值无效(如非整数或超出 uint32_t 范围),系统会记录错误日志,并使用默认值。
12.1.7.1 在参与者级别设置 fastdds.max_message_size
C++ 代码示例
DomainParticipantQos pqos;
// 设置出站数据报的最大字节数
pqos.properties().properties().emplace_back(
"fastdds.max_message_size",
"1200");
XML 配置示例
fastdds.max_message_size
1200
12.1.7.2 在写入器级别设置 fastdds.max_message_size
C++ 代码示例
DataWriterQos wqos;
// 设置该写入器发送的所有 RTPS 数据报的最大字节数
wqos.properties().properties().emplace_back(
"fastdds.max_message_size",
"1200");
XML 配置示例
fastdds.max_message_size
1200
12.1.8 类型传播(Type Propagation)
默认情况下,Fast DDS 借助 “远程数据类型发现”(Remote Data Types Discovery)功能,既可以发现远程数据类型,也可以传播本地数据类型。类型传播包含两个操作:一是在 EDP(端点发现阶段,Endpoint Discovery Phase)消息中添加元信息(具体可参见《发现阶段》(Discovery phases));二是通过一组专用的内置端点,在网络中不同的 DomainParticipant 之间传输类型定义。
根据应用程序的设计和部署需求,有时可能需要修改默认的类型传播行为,以节省带宽和 / 或资源。为此,Fast DDS 允许为 DomainParticipant 配置属性 fastdds.type_propagation,用于控制类型信息的传播方式。
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 | 默认值 |
|---|---|---|
"fastdds.type_propagation" | "disabled"(禁用)、"enabled"(启用)、"minimal_bandwidth"(最小带宽)、"registration_only"(仅注册) | "enabled"(启用) |
不同属性值对本地 DomainParticipant 的影响如下表所示:
| 属性值(Value) | TypeObject 注册(TypeObject registration) | 在 EDP 上发送类型信息(Send type info on EDP) | 在 EDP 上接收类型信息(Receive type info on EDP) | 类型查询服务响应(Type lookup service replies) |
|---|---|---|---|---|
"disabled" | 否(NO) | 否(NO) | 忽略(IGNORED) | 禁用(DISABLED) |
"enabled" | 完整(COMPLETE)和最小(MINIMAL) | 完整(COMPLETE)和最小(MINIMAL) | 处理(PROCESSED) | 启用(ENABLED) |
"minimal_bandwidth" | 仅最小(MINIMAL only) | 仅最小(MINIMAL only) | 仅处理最小(Only MINIMAL PROCESSED) | 启用(ENABLED) |
"registration_only" | 完整(COMPLETE)和最小(MINIMAL) | 完整(COMPLETE)和最小(MINIMAL) | 忽略(IGNORED) | 禁用(DISABLED) |
C++ 代码示例
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"disabled");
XML 配置示例
fastdds.type_propagation
disabled
12.1.9 为发现数据添加可选 QoS(Adding optional QoS to Discovery data)
在发现(Discovery)过程中,DomainParticipant(域参与者)、DataWriter(数据写入器)和 DataReader(数据读取器)会相互确认身份。该过程分为两个阶段:参与者发现阶段(PDP,Participant Discovery Phase)和端点发现阶段(EDP,Endpoint Discovery Phase)。为实现身份确认,DomainParticipant 会通过 PDP 阶段建立的通信通道,相互共享其下 DataWriter 和 DataReader 的信息。这些信息包含端点匹配所需的所有数据,例如主题(Topic)、数据类型,以及可能影响匹配的特定 QoS 策略。具体的兼容性规则可参见《QoS 策略》(QoS Policies)的各个 QoS 章节。
然而,部分 QoS 并非端点匹配的必需条件,但在发现过程中获取这些 QoS 可能对应用程序有帮助。通过属性 fastdds.serialize_optional_qos,用户可在发现过程中包含这些可选 QoS。该属性需在 DomainParticipant 级别通过 PropertyPolicyQos 进行配置,因此,该 DomainParticipant 及其关联的所有端点,都会在发现消息中发送其可选 QoS。
与其他 QoS 相同,可选 QoS 仅在其值为非默认值时才会被序列化。若在 EDP 消息中未接收到某一 QoS 的信息,则表明该 QoS 采用默认值。
当属性 fastdds.serialize_optional_qos 的值设为 TRUE、True、true 或 1 时,可选 QoS 会被序列化;其他值均视为未设置或 FALSE(即不序列化可选 QoS)。
以下表格列出了可在发现消息中序列化的所有可选 QoS:
| PropertyPolicyQos(可选 QoS) | 适用对象(Applies to) |
|---|---|
WireProtocolConfigQos | DomainParticipant(域参与者) |
ResourceLimitsQosPolicy | DataWriter(数据写入器)和 DataReader(数据读取器) |
TransportPriorityQosPolicy | DataWriter(数据写入器) |
WriterDataLifecycleQosPolicy | DataWriter(数据写入器) |
ReaderDataLifecycleQosPolicy | DataReader(数据读取器) |
PublishModeQosPolicy | DataWriter(数据写入器) |
RTPSReliableWriterQos | DataWriter(数据写入器) |
RTPSReliableReaderQos | DataReader(数据读取器) |
RTPSEndpointQos | DataWriter(数据写入器)和 DataReader(数据读取器) |
WriterResourceLimitsQos | DataWriter(数据写入器) |
ReaderResourceLimitsQos | DataReader(数据读取器) |
C++ 代码示例
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.serialize_optional_qos",
"true"); // 可取值:true、True、TRUE、1
XML 配置示例
fastdds.serialize_optional_qos
true
12.2 流控制器设置(Flow Controller Settings)
在使用流控制器(Flow Controllers)时,可能需要为数据写入器(DataWriter)设置特定参数。与该功能相关的属性均位于 fastdds.sfc 命名空间下。
属性 fastdds.sfc.priority 用于为 HIGH_PRIORITY(高优先级) 和 PRIORITY_WITH_RESERVATION(带预留优先级) 类型的流控制器设置 DataWriter 的优先级。允许的取值范围为 -10(最高优先级)到 10(最低优先级)。若未设置该属性,其默认值将设为最低优先级(即 10)。
属性 fastdds.sfc.bandwidth_reservation 用于为 PRIORITY_WITH_RESERVATION(带预留优先级) 类型的流控制器设置 DataWriter 请求的带宽百分比。允许的取值范围为 0 到 100,代表占流控制器总带宽限制的百分比。若未设置该属性,其默认值将设为 0(即不为该 DataWriter 预留带宽)。
12.3 持久化服务设置(Persistence Service Settings)
安全插件设置
12.4.1 身份验证插件设置
若要激活DDS:Auth:PKI-DH身份验证插件,需将DomainParticipantQos的properties()属性中dds.sec.auth.plugin的值设置为builtin.PKI-DH。
下表列出了用于配置DDS:Auth:PKI-DH插件的属性:
| PropertyPolicyQos 名称 | PropertyPolicyQos 值 |
|---|---|
identity_ca | 采用 PEM 格式的身份证书机构(Identity CA)的 X.509 v3 证书的统一资源标识符(URI)。支持的 URI 方案:file(文件)。 |
identity_certificate | 由身份证书机构(Identity CA)签名、包含参与者(Participant)已签名公钥的 X.509 v3 证书(PEM 格式)的 URI。支持的 URI 方案:file(文件)。 |
identity_crl(可选) | X.509 证书吊销列表(CRL)的 URI。支持的 URI 方案:file(文件)。 |
private_key | 用于访问参与者(Participant)私钥的 URI。支持的 URI 方案:file(文件)、PKCS#11(公钥密码学标准 #11)。 |
password(可选) | 用于解密private_key(私钥)的密码。若未设置password属性,则private_key属性中提供的值必须包含已解密的私钥。若private_key(私钥)采用 PKCS#11 方案指定,则password属性将被忽略。 |
preferred_key_agreement(可选) | 在身份验证阶段结束时,用于生成会话共享密钥的首选算法。支持的值如下:a) DH、DH+MODP-2048-256:表示使用 2048 位 MODP 组参数的临时 Diffie-Hellman(Diffie-Hellman Ephemeral)算法。b) ECDH、ECDH+prime256v1-CEUM:表示使用 NIST P-256 曲线的临时椭圆曲线 Diffie-Hellman(Elliptic Curve Diffie-Hellman Ephemeral)算法。c) AUTO:表示根据身份证书机构(Identity CA)证书中的签名算法选择密钥协商算法。若未设置此属性,默认值为AUTO。 |
transmit_algorithms_as_legacy(可选) | 是否以非标准的旧格式传输算法标识符。若未设置此属性,默认值为false(不采用旧格式)。 |
注意:上述所有属性均带有前缀
dds.sec.auth.builtin.PKI-DH.。例如:dds.sec.auth.builtin.PKI-DH.identity_ca。有关示例和更多信息,请参阅 “身份验证插件:DDS:Auth:PKI-DH”(Authentication plugin: DDS:Auth:PKI-DH)部分。
https://fast-dds.docs.eprosima.com/en/latest/fastdds/property_policies/security.html
请重新完整的翻译此文档
安全插件设置
12.4.1 身份验证插件设置
DDS:Auth:PKI-DH身份验证插件可通过如下方式激活:在DomainParticipantQos(域参与者服务质量)的properties()(属性)中,将dds.sec.auth.plugin(DDS 安全身份验证插件)的值设置为builtin.PKI-DH(内置 PKI-DH)。
下表详细列出了用于DDS:Auth:PKI-DH插件配置的各项属性:
| PropertyPolicyQos(属性策略服务质量)名称 | PropertyPolicyQos(属性策略服务质量)值 |
|---|---|
identity_ca(身份证书机构) | 采用 PEM(隐私增强邮件)格式的身份证书机构(Identity CA)X.509 v3 证书的 URI(统一资源标识符)。支持的 URI 方案:file(文件)。 |
identity_certificate(身份证书) | 由身份证书机构(Identity CA)签名、且包含参与者(Participant)已签名公钥的 X.509 v3 证书(PEM 格式)的 URI。支持的 URI 方案:file(文件)。 |
identity_crl(身份证书吊销列表)(可选) | X.509 证书吊销列表(CRL,Certificate Revocation List)的 URI。支持的 URI 方案:file(文件)。 |
private_key(私钥) | 用于访问参与者(Participant)私钥的 URI。支持的 URI 方案:file(文件)、PKCS#11(公钥密码学标准 #11,一种用于加密设备接口的标准)。 |
password(密码)(可选) | 用于解密private_key(私钥)的密码。若未配置password属性,则private_key属性中提供的内容必须是已解密的私钥。若private_key(私钥)通过 PKCS#11 方案指定,则password属性将被忽略。 |
preferred_key_agreement(首选密钥协商算法)(可选) | 在身份验证阶段结束时,用于生成会话共享密钥的首选算法。支持的取值如下:a) DH、DH+MODP-2048-256:表示使用 2048 位 MODP(模素数 Diffie-Hellman)组参数的临时 Diffie-Hellman(Diffie-Hellman Ephemeral)算法,适用于传统的密钥协商场景。b) ECDH、ECDH+prime256v1-CEUM:表示使用 NIST(美国国家标准与技术研究院)P-256 曲线的临时椭圆曲线 Diffie-Hellman(Elliptic Curve Diffie-Hellman Ephemeral)算法,相比传统 DH 算法更高效、密钥长度更短。c) AUTO:表示根据身份证书机构(Identity CA)证书中的签名算法自动选择适配的密钥协商算法,无需手动指定。若未配置此属性,默认取值为AUTO。 |
transmit_algorithms_as_legacy(以旧格式传输算法标识符)(可选) | 用于指定是否以非标准的旧格式传输算法标识符。若未配置此属性,默认取值为false(即不采用旧格式,使用标准格式传输)。 |
注意:上述所有属性均带有前缀
dds.sec.auth.builtin.PKI-DH.。例如,identity_ca属性的完整名称为dds.sec.auth.builtin.PKI-DH.identity_ca。如需查看示例及更多详细信息,请参考 “身份验证插件:DDS:Auth:PKI-DH”(Authentication plugin: DDS:Auth:PKI-DH)章节。
12.4.2 身份验证握手设置
当从远程域参与者(DomainParticipant)接收到发现信息时,身份验证阶段即开始。此时,该参与者会发送握手请求,直到收到远程参与者的握手响应为止。此交互过程的行为涉及以下几个参数:
- max_handshake_requests:控制待发送的握手请求的最大数量。
- initial_handshake_resend_period:表示首次需重发的握手请求的初始等待时间,单位为毫秒(ms)。
- handshake_resend_period_gain:用于计算两次握手请求之间等待时间的增益系数。
因此,每次迭代中发送新握手请求的等待时间,需通过前两次握手请求的间隔时间乘以该增益系数得出,最终使等待时间逐步增加。
下表列出了用于配置 dds.sec.auth.builtin.PKI-DH 插件内身份验证握手行为的设置项:
| PropertyPolicyQos(属性策略服务质量)名称 | PropertyPolicyQos(属性策略服务质量)值 | PropertyPolicyQos(属性策略服务质量)取值范围 | 默认值 |
|---|---|---|---|
max_handshake_requests(最大握手请求数) | <int>(整数类型) | [1, max)(大于等于 1,无上限) | 10 |
initial_handshake_resend_period(初始握手重发间隔) | <int>(整数类型) | [1, max)(大于等于 1,无上限) | 125 |
handshake_resend_period_gain(握手重发间隔增益) | <double>(浮点数类型) | (1.0, max)(大于 1.0,无上限) | 1.5 |
注意:所有列出的属性均带有前缀
dds.sec.auth.builtin.PKI-DH.。例如,max_handshake_requests属性的完整名称为dds.sec.auth.builtin.PKI-DH.max_handshake_requests。
以下示例展示了如何为身份验证握手配置设置域参与者服务质量(DomainParticipantQoS)的属性:
C++
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"dds.sec.auth.builtin.PKI-DH.max_handshake_requests",
"5");
pqos.properties().properties().emplace_back(
"dds.sec.auth.builtin.PKI-DH.initial_handshake_resend_period",
"250");
pqos.properties().properties().emplace_back(
"dds.sec.auth.builtin.PKI-DH.handshake_resend_period_gain",
"1.5");
XML
dds.sec.auth.builtin.PKI-DH.max_handshake_requests
5
dds.sec.auth.builtin.PKI-DH.initial_handshake_resend_period
250
dds.sec.auth.builtin.PKI-DH.handshake_resend_period_gain
1.5
12.4.3 加密插件设置
若要激活 DDS:Crypto:AES-GCM-GMAC 加密插件,需在域参与者服务质量(DomainParticipantQos)的 properties()(属性)中,将 dds.sec.crypto.plugin(DDS 安全加密插件)的值设置为 builtin.AES-GCM-GMAC(内置 AES-GCM-GMAC)。
此外,该插件需依赖 DDS:Auth:PKI-DH 身份验证插件的激活才能使用。DDS:Crypto:AES-GCM-GMAC 插件通过访问控制插件 DDS:Access:Permissions(DDS:访问:权限)进行配置,即加密插件的配置需借助访问控制插件的属性和配置文件完成。
如需了解更多相关信息及示例,请参考 “加密插件:DDS:Crypto:AES-GCM-GMAC”(Cryptographic plugin: DDS:Crypto:AES-GCM-GMAC)章节。
12.4.4 日志插件设置
若要激活 DDS:Logging:DDS_LogTopic 日志插件,需在域参与者服务质量(DomainParticipantQos)的 properties()(属性)中,将 dds.sec.log.plugin(DDS 安全日志插件)的值设置为 builtin.DDS_LogTopic(内置 DDS_LogTopic)。
下表概述了用于配置 DDS:Logging:DDS_LogTopic 插件的属性。如需了解更多信息及示例,请查阅专门文档 “日志插件:DDS:Logging:DDS_LogTopic”(Logging plugin: DDS:Logging:DDS_LogTopic)。

浙公网安备 33010602011771号