文章目录
团队博客: 汽车电子社区
1. 项目概述
1.1 基本信息
- 项目名称: Fast DDS (原eProsima Fast-RTPS)
- 维护组织: eProsima
- 开源许可: Apache License 2.0
- 主要语言: C++11/14/17
- 版本: 3.4.1.0
- 构建系统: CMake 3.20+
1.2 设计理念
*Fast DDS采用现代C++设计,追求功能完整性和易用性,同时保持高性能,适合企业级和通用DDS应用。
2. 整体架构设计
2.1 分层架构
┌─────────────────────────────────────┐
│ DDS用户应用程序层 │
├─────────────────────────────────────┤
│ Fast DDS C++ API层 │
├─────────────────────────────────────┤
│ DDS核心服务层 │
├─────────────────────────────────────┤
│ RTPS协议层 │
├─────────────────────────────────────┤
│ 传输层 │
├─────────────────────────────────────┤
│ 网络和操作系统层 │
└─────────────────────────────────────┘
2.2 目录结构分析
src/cpp/
├── fastdds/ # DDS层实现
│ ├── builtin/ # 内置主题支持
│ ├── core/ # 核心实体管理
│ ├── domain/ # 域管理 (83.38KB)
│ ├── log/ # 日志系统
│ ├── publisher/ # 发布者实现
│ ├── subscriber/ # 订阅者实现
│ ├── topic/ # 主题管理
│ └── xtypes/ # 动态类型支持
├── rtps/ # RTPS协议实现
│ ├── builtin/ # 内置协议
│ ├── history/ # 历史缓存
│ ├── messages/ # 消息处理
│ ├── participant/ # RTPS参与者 (115.42KB)
│ ├── reader/ # 读取器实现 (56.99KB)
│ ├── transport/ # 传输层 (74.94KB)
│ └── writer/ # 写入器实现 (83.36KB)
├── security/ # 安全模块 (167.72KB)
├── statistics/ # 统计模块
├── utils/ # 工具类
└── xmlparser/ # XML配置解析
3. 核心模块详细分析
3.1 域管理层 (fastdds/domain/)
* 域参与者实现 (DomainParticipantImpl.cpp - 83.38KB)
class DomainParticipantImpl : public DomainParticipant
{
public:
// 参与者创建和初始化
DomainParticipantImpl(
DomainParticipantFactory* factory,
const DomainParticipantQos& qos,
DomainParticipantListener* listener,
const StatusMask& mask);
// 核心生命周期管理
ReturnCode_t enable() override;
ReturnCode_t disable() override;
// 实体创建工厂
Publisher* create_publisher(
const PublisherQos& qos,
PublisherListener* listener,
const StatusMask& mask) override;
Subscriber* create_subscriber(
const SubscriberQos& qos,
SubscriberListener* listener,
const StatusMask& mask) override;
private:
// 内部状态管理
ParticipantAttributes attributes_;
std::unique_ptr<RTPSParticipantImpl> rtps_participant_;
};
*域工厂实现 (DomainParticipantFactory.cpp - 20.55KB)
class DomainParticipantFactory
{
public:
// 全局单例模式
static DomainParticipantFactory* get_instance();
// 域参与者创建
DomainParticipant* create_participant(
DomainId_t domain_id,
const DomainParticipantQos& qos,
DomainParticipantListener* listener,
const StatusMask& mask);
// QoS管理
ReturnCode_t set_default_participant_qos(const DomainParticipantQos& qos);
ReturnCode_t get_default_participant_qos(DomainParticipantQos& qos);
private:
// 工厂配置
DomainParticipantFactoryQos factory_qos_;
};
3.2 RTPS协议层 (rtps/)
*RTPS参与者实现 (participant/RTPSParticipantImpl.cpp - 115.42KB)
class RTPSParticipantImpl
{
public:
// RTPS参与者创建
RTPSParticipantImpl(
const ParticipantAttributes& att,
GuidPrefix_t guid_prefix);
// 端点管理
Reader* create_reader(
ReaderAttributes& att,
const GUID_t& guid,
TopicAttributes& topic_att,
ReaderListener* listen);
Writer* create_writer(
WriterAttributes& att,
const GUID_t& guid,
TopicAttributes& topic_att,
WriterListener* listen);
// 状态机管理
void assert_remote_participant_liveliness(
const GuidPrefix_t& guid_prefix);
private:
// 内部组件
std::unique_ptr<MessageReceiver> message_receiver_;
std::unique_ptr<ResourceManager> resource_manager_;
BuiltinProtocols builtin_protocols_;
};
有状态写入器 (writer/StatefulWriter.cpp - 83.36KB)
class StatefulWriter : public Writer
{
public:
// 数据写入核心逻辑
bool write_sample(
const Change_t& change);
// 可靠性管理
void perform_send_heartbeat();
void perform_ack_nack_management();
// 匹配管理
void matched_reader_add(const ReaderProxyData& data);
void matched_reader_remove(const GUID_t& reader_guid);
private:
// 状态管理
std::vector<ReaderProxy> matched_readers_;
std::unique_ptr<HistoryCache> history_cache_;
};
有状态读取器 (reader/StatefulReader.cpp - 56.99KB)
class StatefulReader : public Reader
{
public:
// 数据接收处理
bool read_next_data(
void* data,
SampleInfo_t* info);
// 可靠性处理
void send_ack_nack(const SequenceNumberSet_t& missing);
void process_heartbeat(const GUID_t& writer_guid);
private:
// 匹配写入器管理
std::vector<WriterProxy> matched_writers_;
std::unique_ptr<HistoryCache> history_cache_;
};
3.3 传输层实现 (rtps/transport/)
TCP传输接口 (TCPTransportInterface.cpp - 74.94KB)
class TCPTransportInterface : public TransportInterface
{
public:
// 连接管理
virtual bool open_input_channel(
const Locator_t& locator,
uint32_t max_msg_size) override;
virtual bool open_output_channel(
const Locator_t& locator) override;
// 数据传输
virtual bool send(
const octet* data,
uint32_t size,
const Locator_t& destination) override;
virtual bool receive(
octet* data,
uint32_t& size,
const Locator_t& source) override;
private:
// TCP特定实现
std::map<Locator_t, TCPChannel*> channels_;
std::unique_ptr<TCPAcceptor> acceptor_;
};
3.4 安全模块 (security/)
安全管理器 (SecurityManager.cpp - 167.72KB)
class SecurityManager
{
public:
// 认证管理
bool authenticate_remote_participant(
const ParticipantAuthMessage& msg,
const GUID_t& remote_guid);
// 访问控制
bool check_permissions(
const GUID_t& local_guid,
const GUID_t& remote_guid,
const DataTagQos& data_tag);
// 加密解密
bool encrypt_message(
const CryptoContent& plain,
CryptoContent& encrypted);
bool decrypt_message(
const CryptoContent& encrypted,
CryptoContent& plain);
private:
// 安全组件
std::unique_ptr<Authentication> authentication_;
std::unique_ptr<AccessControl> access_control_;
std::unique_ptr<Cryptography> cryptography_;
};
4. 调用流程分析
4.1 数据发布流程
应用程序调用
↓
DataWriter::write()
↓
StatefulWriter::write_sample()
↓
HistoryCache::add_change()
↓
RTPSMessageSender::send_change()
↓
TransportInterface::send()
↓
网络发送
4.2 数据订阅流程
网络接收
↓
MessageReceiver::process_message()
↓
StatefulReader::process_data()
↓
HistoryCache::add_received_change()
↓
DataReader::take_next_sample()
↓
应用程序回调
4.3 发现流程
DomainParticipant创建
↓
BuiltinProtocols::init()
↓
PDPServer::init()
↓
ParticipantDiscovery::announce()
↓
EndpointDiscovery::discovery()
↓
匹配建立
↓
数据通信
5. 关键算法实现
5.1 发现算法
- PDP (Participant Discovery Protocol): 基于XML配置的发现
- EDP (Endpoint Discovery Protocol): 端点匹配算法
- 实现位置: rtps/builtin/discovery/
5.2 流控制算法
// 流控制实现
void StatefulWriter::perform_flow_control()
{
// 速率限制
if (data_rate_exceeded())
{
apply_throttling();
}
// 背压管理
if (receiver_buffer_full())
{
apply_backpressure();
}
}
5.3 内存管理算法
// 定制内存分配器
template<typename T>
class FastDDSAllocator
{
public:
T* allocate(size_t n)
{
return memory_pool_->allocate(n * sizeof(T));
}
void deallocate(T* ptr, size_t n)
{
memory_pool_->deallocate(ptr);
}
};
6. 设计模式应用
6.1 工厂模式
- DomainParticipantFactory: 创建域参与者
- PublisherFactory: 创建发布者
- TopicFactory: 创建主题
6.2 观察者模式
- Listener机制: 状态变化通知
- EventHandler: 异步事件处理
6.3 策略模式
- QoS策略: 可配置的QoS实现
- Transport策略: 多种传输方式
6.4 单例模式
- DomainParticipantFactory: 全局工厂
- LogConsumer: 日志管理
7. 配置系统
7.1 XML配置解析
<!-- Fast DDS配置示例 -->
<profiles>
<participant profile_name="default_profile">
<rtps>
<builtin>
<discovery_config>
<discoveryProtocol>SERVER</discoveryProtocol>
<serverId>0</serverId>
</discovery_config>
</builtin>
</rtps>
</participant>
</profiles>
7.2 动态QoS配置
// QoS动态配置
PublisherQos pub_qos;
publisher->get_qos(pub_qos);
pub_qos.deadline().period = Duration_t(1, 0);
publisher->set_qos(pub_qos);
8. 扩展性设计
8.1 插件架构
// 传输插件接口
class TransportPlugin
{
public:
virtual bool init() = 0;
virtual bool send(const Message& msg) = 0;
virtual bool receive(Message& msg) = 0;
};
8.2 自定义序列化
// 序列化插件
class SerializationPlugin
{
public:
virtual bool serialize(const void* data, size_t size, SerializedData& output) = 0;
virtual bool deserialize(const SerializedData& input, void*& data, size_t& size) = 0;
};
9. 工具链分析
9.1 快捷工具
- shapes-demo: 可视化DDS演示
- monitor: 实时监控工具
- performance-test: 性能测试套件
9.2 调试支持
- 详细日志: 分级日志系统
- 统计监控: 实时性能统计
- 调试工具: 内存泄漏检测
10. 性能优化特性
10.1 内存优化
- 对象池: 预分配对象避免new/delete
- 内存对齐: 缓存行对齐优化
- 零拷贝: 关键路径避免拷贝
10.2 网络优化
- 批量发送: 消息聚合减少系统调用
- UDP优化: 自定义UDP缓冲区管理
- 共享内存: 本地通信优化
10.3 并发优化
- 无锁队列: 线程间消息传递
- 原子操作: 状态更新优化
- 线程池: 专用处理线程
11. 应用场景分析
11.1 适用场景
- 企业级应用: 需要完整DDS功能
- 复杂系统: 多层次QoS需求
- 原型开发: 快速开发和迭代
- 教学研究: 丰富的文档和示例
11.2 技术优势
- 功能完整: 最全面的DDS实现
- 易用性强: 现代C++设计
- 工具丰富: 完整的工具链
- 社区活跃: 持续更新维护
12. 总结
Fast DDS以其现代C++设计、完整功能实现和丰富工具链成为最受欢迎的DDS实现之一。其优秀的架构设计和扩展性,特别适合需要完整功能和易用性的企业级应用。
关键优势
1. 功能最全: 完整的DDS规范实现
2. 设计现代: 现代C++最佳实践
3. 工具丰富: 完整的开发工具链
4. 扩展性强: 插件化架构设计
注意事项
1. 学习成本: C++复杂度较高
2. 资源占用: 相对C实现较大
3. 编译时间: 模板化设计增加编译时间

1619

被折叠的 条评论
为什么被折叠?



