文章目录
团队博客: 汽车电子社区
1. 项目概述
1.1 基本信息
- 项目名称: OpenDDS
- 维护组织: Object Computing (OCI)
- 开源许可: OpenDDS License
- 主要语言: C++ (基于ACE/TAO框架)
- 构建系统: CMake 3.23+ (传统MPC)
- 基础框架: ACE (Adaptive Communication Environment)
1.2 设计理念
OpenDDS基于成熟的ACE/TAO框架构建,强调企业级特性和CORBA集成,适合复杂的企业分布式系统。
2. 整体架构设计
2.1 分层架构
┌─────────────────────────────────────┐
│ DDS用户应用程序层 │
├─────────────────────────────────────┤
│ OpenDDS C++ API层 │
├─────────────────────────────────────┤
│ DCPS核心服务层 │
├─────────────────────────────────────┤
│ 传输适配层 │
├─────────────────────────────────────┤
│ ACE框架层 │
├─────────────────────────────────────┤
│ 网络和操作系统层 │
└─────────────────────────────────────┘
2.2 目录结构分析
dds/
├── DCPS/ # 数据分发核心服务
│ ├── transport/ # 传输层实现
│ │ ├── multicast/ # 多播传输
│ │ ├── rtps_udp/ # RTPS over UDP
│ │ ├── shmem/ # 共享内存传输
│ │ └── tcp/ # TCP传输
│ ├── InfoRepo/ # 信息仓库(集中发现)
│ ├── security/ # 安全模块
│ ├── RTPS/ # RTPS协议支持
│ ├── Service_Participant.cpp # 服务参与者核心 (78.21KB)
│ ├── DataReaderImpl.cpp # 数据读取器 (110.73KB)
│ ├── DataWriterImpl.cpp # 数据写入器 (107KB)
│ ├── DomainParticipantImpl.cpp # 域参与者 (83.5KB)
│ └── StaticDiscovery.cpp # 静态发现 (103.94KB)
├── idl/ # IDL编译器
├── monitor/ # 监控模块
├── tools/ # 工具集
└── InfoRepo/ # 信息仓库服务
3. 核心模块详细分析
3.1 核心服务层 (dds/DCPS/)
服务参与者 (Service_Participant.cpp - 78.21KB)
class Service_Participant
{
public:
// 全局服务参与者
static Service_Participant* instance();
// 域管理
DomainParticipantImpl*
create_participant(
DomainId_t domain_id,
const DomainParticipantQos& qos,
DomainParticipantListener* listener);
// 实体工厂
Publisher*
create_publisher(
DomainParticipant_ptr participant,
const PublisherQos& qos,
PublisherListener* listener);
Subscriber*
create_subscriber(
DomainParticipant_ptr participant,
const SubscriberQos& qos,
SubscriberListener* listener);
// 传输管理
void add_transport_configuration(
TransportConfig* config);
private:
// 内部状态管理
typedef std::map<DomainId_t, DomainParticipantImpl*> DomainMap;
DomainMap domains_;
TransportRegistry transport_registry_;
};
数据写入器 (DataWriterImpl.cpp - 107KB)
class DataWriterImpl : public DataWriter
{
public:
// 数据写入核心接口
DDS::ReturnCode_t write(
const void* data,
const DDS::InstanceHandle_t& handle);
// 批量写入支持
DDS::ReturnCode_t write_w_timestamp(
const void* data,
const DDS::InstanceHandle_t& handle,
const DDS::Time_t& source_timestamp);
// QoS管理
DDS::ReturnCode_t set_qos(
const DataWriterQos& qos);
private:
// 内部组件
PublisherImpl* publisher_;
TopicImpl* topic_;
TransportImpl* transport_;
HistoryCache history_cache_;
};
数据读取器 (DataReaderImpl.cpp - 110.73KB)
class DataReaderImpl : public DataReader
{
public:
// 数据读取接口
DDS::ReturnCode_t read(
void* data,
DDS::SampleInfo& info);
DDS::ReturnCode_t take(
void* data,
DDS::SampleInfo& info);
// 条件读取
DDS::ReturnCode_t read_w_condition(
void* data,
DDS::SampleInfo& info,
DDS::ReadCondition_ptr condition);
// 状态查询
DDS::ReturnCode_t get_liveliness_changed_status(
DDS::LivelinessChangedStatus& status);
private:
// 内部状态
SubscriberImpl* subscriber_;
TopicImpl* topic_;
TransportImpl* transport_;
ReceivedDataSampleList received_data_;
};
域参与者 (DomainParticipantImpl.cpp - 83.5KB)
class DomainParticipantImpl : public DomainParticipant
{
public:
// 生命周期管理
DDS::ReturnCode_t enable();
DDS::ReturnCode_t disable();
// 实体创建
DDS::Publisher_ptr create_publisher(
const PublisherQos& qos,
PublisherListener* listener);
DDS::Subscriber_ptr create_subscriber(
const SubscriberQos& qos,
SubscriberListener* listener);
DDS::Topic_ptr create_topic(
const char* topic_name,
const char* type_name,
const TopicQos& qos,
TopicListener* listener);
private:
// 内部组件
Service_Participant* service_participant_;
DomainId_t domain_id_;
DomainParticipantQos qos_;
TopicMap topics_;
PublisherMap publishers_;
SubscriberMap subscribers_;
};
3.2 传输层实现 (dds/DCPS/transport/)
TCP传输实现
class TcpTransport : public TransportImpl
{
public:
// 连接管理
bool open();
bool close();
bool configure(const TransportConfiguration& config);
// 数据传输
bool send_data(
const TransportDataMessage& message);
bool receive_data(
TransportDataMessage& message);
private:
// TCP特定实现
ACE_SOCK_Connector connector_;
ACE_SOCK_Acceptor acceptor_;
std::map<RepoId, ACE_SOCK_Stream> connections_;
};
共享内存传输实现
class ShmemTransport : public TransportImpl
{
public:
// 共享内存管理
bool open();
bool close();
bool configure(const ShmemConfiguration& config);
// 高速数据传输
bool send_data(
const TransportDataMessage& message);
bool receive_data(
TransportDataMessage& message);
private:
// 共享内存组件
ACE_Shared_Memory* shared_memory_;
ACE_Mutex* memory_mutex_;
std::string segment_name_;
size_t segment_size_;
};
3.3 发现机制
静态发现 (StaticDiscovery.cpp - 103.94KB)
class StaticDiscovery
{
public:
// 静态配置加载
bool load_configuration(
const std::string& config_file);
// 端点注册
bool register_endpoint(
const RepoId& endpoint_id,
const EndpointConfig& config);
// 匹配算法
bool find_matches(
const RepoId& endpoint_id,
std::vector<RepoId>& matches);
private:
// 配置存储
std::map<RepoId, EndpointConfig> endpoints_;
std::map<std::string, DomainConfig> domains_;
};
信息仓库 (dds/InfoRepo/)
class InfoRepo
{
public:
// 集中化发现服务
bool register_participant(
const RepoId& participant_id,
const ParticipantInfo& info);
bool register_endpoint(
const RepoId& endpoint_id,
const EndpointInfo& info);
// 匹配服务
bool find_matching_endpoints(
const RepoId& endpoint_id,
std::vector<RepoId>& matches);
private:
// 持久化支持
Database* database_;
DiscoveryService* discovery_service_;
};
3.4 安全模块 (dds/DCPS/security/)
认证和授权
class SecurityManager
{
public:
// 参与者认证
bool authenticate_participant(
const ParticipantAuthData& auth_data);
// 端点授权
bool authorize_endpoint(
const RepoId& endpoint_id,
const SecurityAttributes& attributes);
// 数据加密
bool encrypt_data(
const DataSample& plain,
EncryptedData& encrypted);
bool decrypt_data(
const EncryptedData& encrypted,
DataSample& plain);
private:
// 安全组件
AuthenticationPlugin* auth_plugin_;
AccessControlPlugin* access_plugin_;
CryptographyPlugin* crypto_plugin_;
};
4. 调用流程分析
4.1 数据发布流程
应用程序调用
↓
DataWriter::write()
↓
DataWriterImpl::write()
↓
TransportImpl::send()
↓
ACE框架传输
↓
网络发送
4.2 数据订阅流程
网络接收
↓
ACE框架回调
↓
TransportImpl::receive()
↓
DataReaderImpl::receive()
↓
应用程序回调
4.3 集中发现流程
DomainParticipant创建
↓
连接InfoRepo服务
↓
注册参与者信息
↓
注册端点信息
↓
查询匹配端点
↓
建立通信连接
5. ACE框架集成
5.1 Reactor模式集成
class OpenDDS_Reactor : public ACE_Reactor
{
public:
// 事件处理注册
virtual int register_handler(
ACE_Event_Handler* handler,
ACE_Reactor_Mask mask);
// 定时器管理
virtual long schedule_timer(
ACE_Event_Handler* handler,
const void* arg,
const ACE_Time_Value& delay);
private:
// OpenDDS特定事件处理
DDS_Event_Handler* dds_handler_;
};
5.2 线程池集成
class OpenDDS_Task : public ACE_Task_Base
{
public:
// 任务执行
virtual int svc();
// 消息队列管理
virtual int put(
ACE_Message_Block* mb,
ACE_Time_Value* timeout);
private:
// 线程池配置
size_t thread_count_;
ACE_Message_Queue<ACE_MT_SYNCH> message_queue_;
};
6. 配置系统
6.1 INI配置文件
[domain/default]
domain_id=0
repository_corba_name=file://repo.ior
[transport/tcp1]
transport_type=tcp
local_address=localhost:12345
remote_address=localhost:12346
[topic/ControlTopic]
topic_name=ControlTopic
data_type_name=ControlType
qos_reliability_kind=RELIABLE
6.2 QoS配置
// QoS配置示例
DataWriterQos writer_qos;
writer_qos.reliability.kind = RELIABLE_RELIABILITY_QOS;
writer_qos.durability.kind = TRANSIENT_LOCAL_DURABILITY_QOS;
writer_qos.deadline.period = {1, 0}; // 1秒
7. 工具链分析
7.1 信息仓库工具
- InfoRepo: 集中化发现服务
- RepositoryDaemon: 后台守护进程
- RepoViewer: 可视化查看工具
7.2 监控工具
- DCPSInfoRepo: 信息库管理
- Monitor: 实时监控
- StatsCollector: 统计数据收集
7.3 测试工具
- Messenger: 经典示例程序
- perf_test: 性能测试
- compatibility_test: 兼容性测试
8. CORBA集成
8.1 IDL到IDL转换
// CORBA类型映射
class CORBA_Type_Mapper
{
public:
// 类型转换
bool map_corba_to_dds(
const CORBA::TypeCode* corba_type,
DDS::TypeCode_ptr dds_type);
// 数据转换
bool map_corba_data(
const CORBA::Any& corba_data,
DDS::Any& dds_data);
};
8.2 IIOP传输支持
class IIOP_Transport : public TransportImpl
{
public:
// IIOP连接管理
bool open_iiop_connection(const std::string& ior);
bool close_iiop_connection();
// CORBA对象调用
bool invoke_corba_object(
const std::string& object_name,
const CORBA::Any& input,
CORBA::Any& output);
private:
// CORBA运行时
CORBA::ORB_var orb_;
CORBA::Object_var object_;
};
9. 扩展性设计
9.1 传输插件
class TransportPlugin
{
public:
// 插件接口
virtual bool initialize(const TransportConfig& config) = 0;
virtual bool send(const TransportMessage& msg) = 0;
virtual bool receive(TransportMessage& msg) = 0;
virtual void shutdown() = 0;
};
9.2 QoS扩展
class CustomQosPolicy : public QosPolicy
{
public:
// 自定义QoS参数
void set_parameter(const std::string& name, const std::string& value);
std::string get_parameter(const std::string& name) const;
// 序列化支持
bool serialize(ACE_OutputCDR& cdr) const;
bool deserialize(ACE_InputCDR& cdr);
};
10. 性能优化特性
10.1 内存管理
- ACE内存池: 高效内存分配
- 对象池模式: 避免频繁创建销毁
- 零拷贝传输: 共享内存优化
10.2 网络优化
- 连接池: TCP连接复用
- 批量发送: 消息聚合优化
- 异步I/O: 基于ACE Reactor
10.3 并发优化
- 线程池: ACE Task框架
- 无锁队列: 关键路径优化
- 原子操作: 状态管理优化
11. 应用场景分析
11.1 适用场景
- 企业级系统: 需要CORBA集成
- 集中管理: 需要集中化发现
- 现有ACE系统: 基于ACE框架的应用
- 复杂QoS需求: 多层次QoS策略
11.2 技术优势
- 企业级特性: 完整的管理功能
- CORBA集成: 与现有系统集成
- 成熟框架: 基于稳定的ACE框架
- 丰富工具: 完整的管理工具链
12. 总结
OpenDDS基于成熟的ACE/TAO框架,提供了企业级的DDS实现,特别适合需要CORBA集成和集中化管理的复杂分布式系统。
关键优势
1. 企业级: 丰富的管理功能
2. CORBA集成: 与现有系统集成
3. 成熟稳定: 基于ACE框架
4. 集中管理: InfoRepo支持
注意事项
1. 复杂度高: 学习曲线陡峭
2. 资源占用: 框架开销较大
3. 依赖性强: ACE框架依赖
4. 性能影响: 框架层性能损耗

2101

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



