DDS-Mid 中间件

1. DDS 中间件介绍

DDS(Data Distribution Service,数据分发服务)是由对象管理组织(OMG)制定的通信中间件标准,专为实时分布式系统设计,广泛应用于需要高可靠性和实时性的场景。

核心特性

  • 发布-订阅模型:采用解耦的通信模式,发布者和订阅者无需直接连接
  • 以数据为中心:关注数据的类型、内容和质量,而非数据的生产者和消费者
  • 实时性保证:支持多种 QoS 策略,满足不同场景的实时性需求
  • 可扩展性:支持大规模分布式系统,节点数量可动态增减

技术优势

  • 高效性:提供低延迟、高吞吐量的数据分发机制
  • 可靠性:支持多种可靠性策略,确保数据传输的可靠到达
  • 灵活性:丰富的 QoS 配置选项,适应不同应用场景
  • 跨平台:支持多种编程语言和操作系统平台

应用领域

DDS 技术在以下领域得到广泛应用:

  • 物联网:设备间的数据采集与控制
  • 工业自动化:工业控制系统的实时通信
  • 航空航天:飞行控制系统、卫星通信等
  • 机器人:多机器人协同控制与感知
  • 智能交通:车联网、交通管理系统
  • 医疗设备:医疗设备间的数据交换

常用 DDS 实现库

目前业界主流的 DDS 实现库包括:

  • OpenDDS:开源实现,由 OCI 公司维护,具有良好的社区支持
  • FastDDS:由 eProsima 开发,性能优异,支持丰富的 QoS 策略
  • Cyclone DDS:Eclipse 基金会项目,轻量级且高性能
  • Tiny-DDS:专为嵌入式环境设计的轻量级实现

提示:各 DDS 实现库在特定领域具有独特优势,开发者可根据项目需求、资源约束和应用场景选择合适的实现方案。


2. DDS-Mid 中间件说明

DDS-Mid 是一款专为无 Linux 系统的嵌入式场景设计的轻量级数据分发服务中间件,采用 C++ 语言实现,完美支持 RTOS(默认 FreeRTOS)和裸机系统。

核心特性

  • 轻量化设计:针对嵌入式资源受限环境优化,内存占用小,启动快速
  • 跨平台支持:支持 ZYNQ、STM32 等主流嵌入式平台,易于移植到其他硬件平台
  • 灵活传输:支持 UDP 传输(基于 LWIP 协议栈)和共享内存传输两种方式
  • 易于集成:提供简洁的 API 接口,简化用户开发流程

当前实现功能

  1. 发布者/订阅者模型

    • 基于话题的数据发布与订阅
    • 支持多订阅者同时接收同一话题数据
    • 提供回调函数机制,实现数据实时处理
  2. 参数机制

    • 支持动态参数设置与获取
    • 参数修改回调通知功能
    • 类型安全的参数管理
  3. 服务机制

    • 服务端与客户端通信模型
    • 仅支持同步调用方式(异步调用暂未支持)
    • 请求-响应模式的数据交互

未来扩展计划

  • QoS 管理策略:完善服务质量配置,支持可靠性、持久性等 QoS 策略
  • 动作机制:实现长时间运行的任务管理,支持目标反馈和取消操作
  • 基于串口的可视化调试页面:提供串口通信的调试工具,实时监控 DDS 通信状态

文件结构

/-
├── examples/          # 示例工程
├── include/           # 头文件
└── src/               # 源码目录
    ├── api/           # 用户公共接口
    ├── config/        # 自定义消息接口(JSON 序列化/反序列化)
    ├── core/          # DDS 核心实现
    ├── thirty/        # 第三方库
    │   ├── cjson/     # CJSON 库
    │   ├── crc/       # CRC 校验
    │   └── mutex/     # 互斥锁实现
    └── transport/     # 传输层硬件接口实现

3. 使用指南

环境要求与配置

DDS-Mid 中间件专为嵌入式环境设计,使用前请确保满足以下条件:

支持的开发环境
  • RTOS 环境:支持 FreeRTOS 实时操作系统,使用 FreeRTOS 的 API 接口
  • 裸机环境:支持无操作系统的裸机系统
数据传输方式

DDS-Mid 提供两种数据传输方式,可根据实际需求选择:

  1. UDP 传输

    • 基于 LWIP 协议栈的 Socket 接口实现
    • 适用于跨设备或跨网络的数据通信
    • 支持广播和本地回环模式
  2. 共享内存传输

    • 通过对相同话题的共享内存进行读写操作
    • 适用于同一设备内的进程间通信
    • 传输效率高,延迟低
平台支持
  • 默认支持平台:Xilinx ZYNQ 系列
  • 平台集成要求:在 ZYNQ 平台使用时,需先完成 FreeRTOS 实时系统的集成
  • 其他平台:可根据实际硬件进行移植适配
配置说明

使用前需根据开发环境修改配置文件 ./include/config.h 中的相关配置项:

  • 操作系统类型(RTOS 或裸机)
  • 传输方式(UDP 或共享内存)
  • 平台相关配置(如 ZYNQ 平台的 IP 地址、端口等)

重要提示:DDS-Mid 中间件不包含 LWIP 协议栈的移植和 FreeRTOS 实时系统的移植,用户需自行完成相关移植工作。

基础操作流程

使用 DDS-Mid 中间件进行开发,请按照以下步骤进行:

步骤 1:环境准备

根据实际开发环境确定以下配置:

  • 操作系统类型:RTOS(FreeRTOS)或裸机系统
  • 数据传输方式:共享内存传输或 UDP 传输
    • 如选择 UDP 传输,需确保已完成 LWIP 协议栈的移植
步骤 2:导入头文件

在项目中包含 DDS-Mid 的核心头文件:

#include "ddsNode.h"
步骤 3:创建 Node 实例

初始化 DDS 节点,指定域 ID、节点名称和传输类型:

auto node = std::make_shared<dds_mid::api::Node>(
    0,                          // 域 ID
    "my_node",                 // 节点名称
    TransportType::UDP         // 传输类型(UDP 或 MEMORY)
);
步骤 4:创建发布者并发布数据
  • 创建发布者:node->PublisherCreate(topic_name, type_name)
  • 获取数据写入器实例
  • 调用写入方法发布数据
步骤 5:创建订阅者并接收数据
  • 创建订阅者:node->SubscriberCreate(topic_name, type_name, callback)
  • 注册回调函数处理接收到的数据

工程构建

ZYNQ 平台构建指南

对于 Xilinx ZYNQ 平台,请参考 src/bord/zynq 目录下的 ReadMe.txt 文件进行工程构建和配置。

其他平台

如需在其他平台使用 DDS-Mid,请参考使用指南章节,根据实际硬件平台进行相应的适配工作。


4. 版本迭代记录

版本号 日期 修改内容
V1.0.2 2026/1/16 解决裸机环境下的订阅者周期调度问题,并实现了多种 QOS 管理策略
V1.0.2 2025/10/14 1.实现参数机制 2.实现服务机制的服务端和客户端
V1.0.1 2025/8/27 新增订阅者对环形buffer的初始化
V1.0.0 2025/7/16 1. 完成 UDP 广播+本地回环传输调试 ✅ 2. 完成共享内存传输调试 ✅
V1.0.0 2025/7/10 实现 DDS 中间件基础框架

5. 开发团队

DDS-Mid 中间件由小右个人独立开发。作为一名长期从事嵌入式开发的工程师,我对 Linux 系统、FreeRTOS 实时操作系统以及裸机环境下的开发具有深入的理解和丰富的实践经验。

这款中间件并非商业化产品,而是我结合自身在嵌入式实时通信场景中的实际需求,参考 Tiny-DDS 的设计思路自主实现的"实用型工具"。核心目标是为无 Linux 系统的 RTOS 或裸机环境,提供"开箱即用"的数据分发解决方案,同时也希望能为有类似需求的开发者提供参考和借鉴。

6.问题反馈与联系

若你在使用过程中遇到问题(如工程编译报错、功能调用异常、适配场景疑问等),或有优化建议,可随时通过以下方式联系我交流:
  • 联系邮箱:875910867@qq.com

  • 微信::D875910867(添加时建议备注 “DDS-Mid 交流”,方便快速对接)

    我会尽量协助解决问题,也期待和同领域开发者一起完善这款工具,让它更贴合嵌入式场景的实际需求。

7.仓库链接

各位看官,觉得以后有用就给个star吧
gitee:https://gitee.com/myplease514/embedded-dds

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐