实用指南: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)” 属性设置默认值,具体规则如下:

  1. 若定义了 FASTDDS_STATISTICS,且用户未指定其他配置,Fast DDS 会为 DATA [p] 的物理属性设置默认值。
  2. 若定义了 FASTDDS_STATISTICS,且用户为物理属性设置了自定义值,则优先使用用户配置的值。
  3. 若定义了 FASTDDS_STATISTICS,且用户从 DomainParticipantQos 中移除了物理属性,则 DATA [p] 消息中不会传输任何物理信息。
  4. 若未定义 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 的值设为 TRUETruetrue 或 1 时,可选 QoS 会被序列化;其他值均视为未设置或 FALSE(即不序列化可选 QoS)。

以下表格列出了可在发现消息中序列化的所有可选 QoS:

PropertyPolicyQos(可选 QoS)适用对象(Applies to)
WireProtocolConfigQosDomainParticipant(域参与者)
ResourceLimitsQosPolicyDataWriter(数据写入器)和 DataReader(数据读取器)
TransportPriorityQosPolicyDataWriter(数据写入器)
WriterDataLifecycleQosPolicyDataWriter(数据写入器)
ReaderDataLifecycleQosPolicyDataReader(数据读取器)
PublishModeQosPolicyDataWriter(数据写入器)
RTPSReliableWriterQosDataWriter(数据写入器)
RTPSReliableReaderQosDataReader(数据读取器)
RTPSEndpointQosDataWriter(数据写入器)和 DataReader(数据读取器)
WriterResourceLimitsQosDataWriter(数据写入器)
ReaderResourceLimitsQosDataReader(数据读取器)
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身份验证插件,需将DomainParticipantQosproperties()属性中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) DHDH+MODP-2048-256:表示使用 2048 位 MODP 组参数的临时 Diffie-Hellman(Diffie-Hellman Ephemeral)算法。b) ECDHECDH+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) DHDH+MODP-2048-256:表示使用 2048 位 MODP(模素数 Diffie-Hellman)组参数的临时 Diffie-Hellman(Diffie-Hellman Ephemeral)算法,适用于传统的密钥协商场景。b) ECDHECDH+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)。

posted @ 2025-11-24 17:42  yangykaifa  阅读(19)  评论(0)    收藏  举报