当前位置: 首页 > news >正文

发送与接收

在Fast DDS中,消息的发送与接收确实会经过RTPS层、DDS层,最终到达应用层。这一流程体现了Fast DDS作为DDS(Data Distribution Service)标准实现的核心架构设计。以下是详细的分层解释:

一、Fast DDS层次架构

Fast DDS的架构自顶向下分为三层:

  1. 应用层(Application Layer)
    • 开发者通过DDS API(如DataWriter/DataReader)发布或订阅数据。
    • 定义数据类型(通过IDL文件)、QoS策略、监听器等。
  2. DDS层(DDS Domain Layer)
    • 实现DDS规范的核心逻辑,包括:
      • 主题(Topic)管理
      • QoS策略处理(可靠性、持久性、历史记录等)
      • 数据匹配(发布者/订阅者发现)
      • 类型系统(动态类型支持)
  3. RTPS层(RTPS Protocol Layer)
    • 实现RTPS(Real-Time Publish-Subscribe)协议,负责:
      • 消息序列化/反序列化
      • 网络传输(UDP/TCP/共享内存)
      • 消息路由与发现
      • 可靠性传输(ACK/NACK机制)

二、消息发送流程(从应用层到网络)

1. 应用层调用
 

cpp

// 应用层代码示例
DataWriter* writer = publisher->create_datawriter(topic, QoS);
writer->write(sample_data); // 触发数据发送
2. DDS层处理
  • 数据封装:将应用数据包装为DDS格式的CacheChange
  • QoS策略应用:根据QoS配置(如可靠性、持久性)决定是否需要存储历史数据。
  • 类型处理:通过TypeSupport进行类型擦除或动态类型序列化。
3. RTPS层处理
  • 消息序列化:将CacheChange序列化为RTPS协议格式(CDR流)。
  • 网络传输
    • 添加RTPS消息头(包括Writer GUID、序列号等元数据)。
    • 通过选定的传输协议(UDP/TCP/SHM)发送数据包。
4. 底层网络传输
  • 数据包通过网络接口卡(NIC)或共享内存传输到接收端。

三、消息接收流程(从网络到应用层)

1. RTPS层接收
  • 网络接收:通过传输层接收原始数据包。
  • 消息反序列化:解析RTPS消息头,提取序列化数据。
  • 可靠性处理
    • 如果是可靠传输,处理ACK/NACK重传逻辑。
    • 维护序列号状态机(确保消息按顺序接收)。
2. DDS层处理
  • 数据匹配
    • 根据主题哈希、QoS兼容性过滤消息。
    • 检查实例状态(如存活状态、数据有效性)。
  • 历史缓存
    • 如果是持久化或历史记录QoS,将数据存入历史缓存。
    • 触发DataReader的监听器或条件变量。
3. 应用层回调
 

cpp

// 应用层监听器示例
class MyListener : public DataReaderListener {
void on_data_available(DataReader* reader) override {
SampleInfo info;
MyType data;
if (reader->take_next_sample(data, info) == ReturnCode_t::RETCODE_OK) {
// 处理接收到的数据
}
}
};
  • 数据交付
    • 通过take_next_sample()或监听器回调(on_data_available)将数据传递给应用层。
    • 应用层处理业务逻辑(如解析数据、更新UI等)。

四、关键交互点

  1. DDS-RTPS接口
    • CacheChange对象:DDS层与RTPS层之间的数据载体,封装序列化后的数据和元数据。
    • HistoryCache:DDS层管理历史数据的模块,与RTPS层的可靠性机制紧密集成。
  2. QoS策略穿透
    • 可靠性(Reliability):通过RTPS层的ACK/NACK机制实现。
    • 持久性(Durability):DDS层的历史缓存与RTPS层的持久化传输协同工作。
  3. 线程模型
    • 发送和接收通常在不同线程执行(如RTPS接收线程、DDS处理线程、应用回调线程)。
    • 通过无锁队列或条件变量实现跨线程通信。

五、调试与验证

  1. 日志跟踪
    • 启用RTPS层日志:
       

      cpp

      Log::SetVerbosity(Log::Kind::All); // 启用所有日志
    • 观察RTPS消息的序列化/反序列化过程。
  2. Wireshark抓包
    • 过滤rtps协议,分析RTPS消息结构(如Submessage类型、序列号)。
  3. 性能分析
    • 使用Fast DDS的统计模块(StatisticsModule)监控各层延迟。

六、总结

消息在Fast DDS中的流动路径为:
应用层(发布)→ DDS层(封装/QoS)→ RTPS层(序列化/传输)→ 网络 → RTPS层(反序列化/可靠性)→ DDS层(匹配/过滤)→ 应用层(订阅)

这一分层设计实现了:

  • 协议标准化:通过RTPS层保证跨厂商互操作性。
  • 功能解耦:DDS层专注数据分发逻辑,RTPS层专注高效传输。
  • 性能优化:各层可独立优化(如DDS层的QoS处理、RTPS层的零拷贝传输)。

相关文章:

  • 写一下自己对于“李建忠对话KK凯文.凯利《AI的进化和颠覆》实录”一些问题的理解
  • 群晖如何开启及使用ssh:小白用户上手指南-家庭云计算专家
  • Rabbitmq集成springboot 使用死信队列
  • [计算机网络] 局域网内的网络传输
  • 【Android】初识 Activity
  • 【人工智能基础】初识神经网络
  • docker私有仓库部署配置学习
  • 冯·诺依曼体系、哈佛架构以及现代计算机架构中的关键优化技术(多级缓存、流水线)
  • 网络资源模板--基于Android Studio 实现的咖啡点餐App
  • 为什么用Qwen3 embedding和rerank
  • 大模型MetaGPT面试题汇总及参考答案
  • WebRTC(七):媒体能力协商
  • Linux系统之grub-mkstandalone详解
  • C#Halcon从零开发_Day14_AOI缺陷检测策略1_Bolb分析+特征分析
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N2阶段(3):单词2018年12月2024年7月
  • 【机器学习四大核心任务类型详解】分类、回归、聚类、降维智能决策指南
  • 案例:塔能科技以“数字光网”重塑某市照明绿色生态
  • rknn优化教程(三)
  • DAY 39 图像数据与显存
  • unity版本控制PlasticSCM转git
  • 建设网站自学/昆明排名优化
  • 济南软件网站建设/谷歌推广效果怎么样
  • 电子网站建设公司/中国最权威的网站排名
  • 惠阳市网站建设/网站推广app软件
  • 网站建设价格如何/南宁优化网站网络服务
  • 北京专业网站设计制作/百度seo服务