FastDDS 源码剖析:DataWriter分析

DataWriter是FastDDS库中用于数据发布的类,它实现了DDS的出版-订阅模型。DataWriterImpl是其实现,包含数据写入相关操作,如write、register_instance等。DataWriterImpl通过内部的RTPS通信处理数据传输,管理历史记录以支持可靠性等功能。此外,文章还讨论了关键函数如write_w_timestamp、register_instance和状态管理函数,如get_publication_matched_status、get_offered_deadline_missed_status等。

目录

DataWriter分析

DataWriter 类分析

DataWriterImpl 类分析

关键函数分析


DataWriter分析
DataWriter 类分析

DataWriter 类是 Fast DDS 库中的一个重要类,它用于实现 DDS(Data Distribution Service)发布-订阅通信模型中的数据写入功能。

用途:
DataWriter 类用于向特定主题(Topic)发布数据。它负责将数据写入到该主题,并将数据传输给订阅该主题的数据读取器(DataReader)。通过 DataWriter,用户可以发布数据,注册和注销数据实例,获取状态信息以及设置数据写入的 QoS(Quality of Service)。

成员变量:

  • impl_:指向 DataWriterImpl 类的实例的指针,它是 DataWriter 的实际实现。

成员函数:
DataWriter 类提供了多个成员函数,下面是一些重要的函数及其作用:

  • enable():启用数据写入器。
  • write(data):将数据写入到主题。
  • register_instance(instance):注册数据实例。
  • unregister_instance(instance):注销数据实例。
  • get_key_value(key_holder, handle):获取数据实例的键值。
  • set_qos(qos):设置数据写入的 QoS。
  • get_qos():获取当前数据写入的 QoS。
  • set_listener(listener):设置数据写入的监听器。
  • get_topic():获取关联的主题。
  • get_publisher():获取创建该数据写入器的发布者。

大致的实现方法:
DataWriter 类的实现方法主要依赖于底层的 DataWriterImpl 类。DataWriterImpl 类是 DataWriter 的实际实现,它封装了与数据写入相关的底层逻辑和操作。在 DataWriter 的成员函数中,通过调用 DataWriterImpl 对应的成员函数来完成相应的操作。例如,在 write(data) 函数中,会调用 DataWriterImpl 的 write(data) 函数来实际执行数据写入操作。

同时,DataWriter 类还提供了一些其他功能,如通过 loan_sample 和 discard_loan 函数直接在内部池中借用和归还数据样本的功能,以及获取数据写入的状态信息等。

下面是详细的方法描述

因为这个类本质上只是一个包装类,所以重点函数基本上都是DataWriterImpl 类实现的

DataWriterImpl 类分析

类图

DataWriterImpl类是Fast DDS库中的一个关键类,用于实现数据写入的功能。它包含了数据写入相关的操作和状态,以及与底层通信层(RTPS)的交互。下面是对该类及其函数的作用和大致实现方式的介绍:

  • DataWriterImpl(PublisherImpl*, TypeSupport, Topic*, const DataWriterQos&, DataWriterListener*):类的构造函数,用于创建DataWriterImpl对象并初始化其成员变量。
  • ~DataWriterImpl():类的析构函数,用于清理资源和释放内存。
  • enable():启用DataWriterImpl对象,创建底层实体(RTPSWriter)等。
  • loan_sample(void*, LoanInitializationKind):从内部池中借用一个样本,用于写入数据。
  • discard_loan(void*&):废弃之前借用的样本。
  • write(void*):将数据写入到Topic中。
  • write(void*, fastrtps::rtps::WriteParams&):附带写入参数,将数据写入到Topic中。
  • write(void*, const InstanceHandle_t&):将数据写入到指定的实例中。
  • write_w_timestamp(void*, const InstanceHandle_t&, const fastrtps::Time_t&):附带时间戳,将数据写入到指定的实例中。
  • register_instance(void*):注册一个新的实例,并返回实例的句柄。
  • register_instance_w_timestamp(void*, const fastrtps::Time_t&):附带时间戳,注册一个新的实例,并返回实例的句柄。
  • unregister_instance(void*, const InstanceHandle_t&, bool = false):注销指定实例。
  • unregister_instance_w_timestamp(void*, const InstanceHandle_t&, const fastrtps::Time_t&, bool = false):附带时间戳,注销指定实例。
  • guid():获取DataWriter的GUID。
  • get_instance_handle():获取DataWriter的实例句柄。
  • get_type():获取数据类型支持对象。
  • get_qos():获取DataWriter的QoS配置。
  • get_topic():获取DataWriter关联的Topic。
  • get_listener():获取DataWriter的监听器。
  • set_listener(DataWriterListener*):设置DataWriter的监听器。
  • get_publication_matched_status(PublicationMatchedStatus&):获取发布匹配状态。
  • get_offered_deadline_missed_status(OfferedDeadlineMissedStatus&):获取未满足的最后期限状态。
  • get_offered_incompatible_qos_status(OfferedIncompatibleQosStatus&):获取不兼容的QoS状态。
  • set_qos(const DataWriterQos&):设置DataWriter的QoS配置。
  • get_liveliness_lost_status(LivelinessLostStatus&):获取失去活跃性的状态。
  • get_publisher():获取关联的Publisher。
  • assert_liveliness():声明活跃性。
  • disable():禁用DataWriterImpl对象,移除所有监听器。
  • clear_history(size_t*):清除历史记录中的所有数据。
  • get_sending_locators(rtps::LocatorList&):获取DataWriter可以发送数据的定位器列表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值