青海省建设监理协会网站,工业和信息化部产业发展促进中心,江西网站备案,semseo3. DDS层
eProsima Fast DDS公开了两个不同的API#xff0c;以在不同级别与通信服务交互。主要API是数据分发服务#xff08;DDS#xff09;数据中心发布订阅#xff08;DCPS#xff09;平台独立模型#xff08;PIM#xff09;API#xff0c;简称DDS DCPS PIM#xf… 3. DDS层
eProsima Fast DDS公开了两个不同的API以在不同级别与通信服务交互。主要API是数据分发服务DDS数据中心发布订阅DCPS平台独立模型PIMAPI简称DDS DCPS PIM由Fast DDS遵循的数据分发服务1.4版规范定义。本节旨在解释Fast DDS下此API的主要特性和使用模式并对其分为五个模块进行深入解释
Core 它定义了由其他模块细化的抽象类和接口。它还提供了服务质量QoS定义以及支持中间件的基于通知的交互。Domain 它包含充当服务入口点的DomainParticipant类以及许多类的工厂。DomainParticipant还充当构成服务的其他对象的容器。Publisher: 它描述了发布端使用的类包括Publisher和DataWriter类以及PublisherListener和DataWriterListener接口。 -Subscriber: 它描述了订阅端使用的类包括Subscriber和DataReader类以及SubscriberListener和DataReaderListener接口。Topic: 它描述了用于定义通信主题和数据类型的类包括Topic和TopicDescription类以及TypeSupport和TopicListener接口。 3.1 Core
此模块定义其他模块将使用的基础结构类和类型。它包含实体类、QoS策略和状态的定义。
Entity: 实体是具有状态的DDS通信对象可以使用策略进行配置。Policy: 控制实体行为的每个配置对象。Status: 与实体关联的每个对象其值表示该实体的通信状态。 3.1.1 Entity
实体是所有DDS实体的抽象基类意味着支持QoS策略、侦听器和状态的对象。 3.1.1.1 Entity的类型
DomainParticipant: 此实体是服务的入口点充当发布服务器、订阅服务器和主题的工厂。有关详细信息请参阅DomainParticipant。Publisher: 它充当一个工厂可以创建任意数量的DataWriter。有关详细信息请参阅Publisher。Subscriber: 它充当一个工厂可以创建任意数量的DataReader。有关详细信息请参阅订阅服务器。Topic: 此实体位于发布实体和订阅实体之间充当通道。有关详细信息请参阅主题。DataWriter: 是负责数据分发的对象。有关详细信息请参阅DataWriter。DataReader: 用于访问接收数据的对象。有关详细信息请参阅DataReader。
下图显示了所有DDS实体之间的层次结构 3.1.1.2 通用实体特征
所有实体类型都具有实体概念所共有的一些特征。这些是
3.1.1.2.1 Entity标识符
每个实体都由一个唯一的ID标识该ID在DDS实体与其对应的RTPS实体如果存在之间共享。该ID存储在Entity基类上声明的Instance Handle对象上可以使用getter函数get_Instance_Handle访问该对象。
3.1.1.2.1 QoS策略
可以使用一组配置策略来配置每个实体的行为。对于每个实体类型都有一个对应的服务质量QoS类该类对影响所述实体类型的所有策略进行分组。用户可以创建这些QoS类的实例根据自己的需要修改包含的策略并在创建过程中或稍后使用每个实体公开的set_QoS()函数来配置实体DomainParticipant::set_qos()Publisher::set_qos()Subscriber::set.qos()Topic::set.qos()DataWriter::set_qos()DataReader::set.qos())。有关可用策略及其说明的列表请参阅策略。QoS类及其包含的策略在每个实体类型的文档中进行了解释。
3.1.1.2.3 Listener监听器
侦听器包含一些函数实体使用这些函数来响应事件。因此侦听器充当异步通知系统允许实体向应用程序通知实体中的状态更改。因此侦听器就像一个异步通知系统允许实体向应用程序通知实体中的状态更改。
所有实体类型都定义一个抽象侦听器接口该接口包含实体将触发的回调函数以将状态更改传递给应用程序。用户可以实现自己的侦听器从这些接口继承并实现应用程序所需的回调。然后他们可以在创建过程中或稍后使用每个实体公开的set_listener函数将这些侦听器链接到每个实体DomainParticipant:set_listenrPublisher:set_litenerSubscriber:set-listenerTopic:set-liistenerDataWriter:set _listener。每个实体类型的侦听器接口及其回调在每个实体类型文档中进行了解释。当事件发生时它由具有非空侦听器的最低级别实体处理并且在其StatusTask中启用了相应的回调。高级侦听器继承自低级侦听器如下图所示 注意 on_data_on_readers回调在on_data_available之前拦截消息。这意味着如果启用了DomainParticipantListener用户应该考虑默认情况下侦听器使用StatusMask:all。由于保留了回调实体层次结构在这种情况下将调用on_data_on_readers。如果应用程序希望改用on_data_available则应禁用Statusask的相应位。 重要 在创建实体时使用StatusMask:none仅禁用DDS标准回调
on_sample_rejected()on_liveliness_changed()on_requested_deadline_missed()on_requested_incompatible_qos()on_data_available()on_subscription_matched()on_sample_lost()on_offered_incompatible_qos()on_offered_deadline_missed()on_liveliness_lost()on_publication_matched()on_inconsistent_topic()on_data_on_readers()
始终启用特定于Fast DDS的任何回调:
on_participant_discovery()on_ParticipantAuthentication()on_subscriber_discovery()on_publisher_discovery()on_type_discovery()on_type_dependencies_reply()on_type_information_received()on_unacknowledged_sample_removed() 警告 只创建一个线程来侦听每个实现的侦听器因此建议保持侦听器函数的简单性将此类信息的处理留给适当的类。
警告 不要在侦听器成员函数的范围内创建或删除任何实体因为这可能会导致未定义的行为。相反建议使用Listener类作为信息通道并使用上层Entity类来封装此类行为。 3.1.1.2.4 Status
每个实体都与一组状态对象相关联这些状态对象的值表示该实体的通信状态。这些状态值的更改会触发调用相应的Listener回调以异步通知应用程序。有关所有状态对象的列表及其内容的描述请参见状态。在那里您还可以找到哪个状态适用于哪个实体类型。 3.1.1.2.5 StatusCondition
每个实体都有一个StatusCondition每当其启用状态更改时都会通知它。StatusCondition提供实体和等待集之间的链接。有关详细信息请参阅“条件和等待集”一节。 3.1.1.2.6 启用实体
所有实体都可以创建为已启用或未启用。默认情况下工厂被配置为创建已启用的实体但可以对已启用的工厂使用EntityFactoryQosPolicy进行更改。禁用的工厂创建禁用的实体而不管其QoS如何。禁用实体的操作仅限于以下操作
Set/Get 实体的QoS策略Set/Get 实体监听器Create/Delete 子实体得到实体的状态即使他们没有改变查找操作
在这种状态下调用的其他函数都会返回NOT_ENABLED.