分布式系统--数据分发服务(DDS)
1. 简介
DDS是基于发布/订阅模式的通信模型。发布/订阅中间件提供一种简单、直观的方式分发数据,它将创建和发送数据(数据发布者(Publisher))的软件与接收和使用数据(数据订阅者(Subscriber))的软件分离开。Publihser简单声明其发送意图并发布数据。Subscriber声明其接收意图,然后中间件自动传送数据
2. 实现过程
应用程序使用API建立实体(对象),以此建立彼此间的发布/订阅通信。需要建立的主要实体包含:
– 域(Domain)
– 域参与者(DomainParticipant)
– 数据写入者(DataWriter)
– 发布者(Publisher)
– 数据读取者(DataReader)
– 订阅者(Subscriber)
– 主题(Topic)
发送方使用的对象被称为Publisher和DataWriter,接收方使用的对象被称为Subscriber和DataReader。
应用程序使用DataWriter发送数据。DataWriter与单独主题相关联,用户可以在单独应用程序中拥有多个DataWriter和主题。另外,在单独应用程序中,用户可以为一个特定的主题拥有超过一个DataWriter。
Publisher是一个负责实际数据发送的DCPS对象。Publisher拥有和管理DataWriter。一个DataWriter仅可由一个Publisher拥有,而一个Publisher可以拥有多个DataWriter,因此,相同的Publisher可以为不同数据类型的很多不同主题发送数据,当用户代码在DataWriter上调用writer()方法时,数据样本被传送至网络上执行数据实际分发的Publisher对象。
应用程序使用DataReader访问DCPS上接收的数据。一个DataReader关联一个单独主题,用户可以在一个应用程序中拥有多个DataReader和主题。另外,在单独的应用程序中,用户可以为一个特定的主题拥有超过一个DataReader。
Subscriber是负责发布数据实际接收的DCPS对象。Subscriber拥有和管理DataReader。一个DataReader只能由一个单独Subscriber拥有,而一个Subscriber可以拥有很多DataReader。因此,相同的Subscriber可以为不同数据类型的很多不同主题接收数据。当数据被发送至应用程序时,它首先由Subscriber处理,数据样本随后被储存在适当的DataReader中。用户代码注册一个可在新数据到达时调用的监听器,或使用read()和take()方法积极轮询DataReader的新数据。
3. RTI DDS主要接口
1)DDS初始化,创建域参与者
DDS_ReturnCode_t rti_dds_init(intdomainId);
2)数据写入者初始化
DDS_StringDataWriter* rti_dds_create_datawriter(const char *topicName, const struct DDS_DataWriterListener* listener = NULL);
3)数据读取者初始化
DDS_StringDataReader * rti_dds_create_datareader(const char *topicName, const struct DDS_DataReaderListener* listener = NULL);
4)字符流数据读取者句柄获取
DDS_StringDataReader * rti_dds_stringdatareader_narrow(DDS_DataReader *);
5)数据发布
DDS_ReturnCode_t rti_dds_stringdata_publish(DDS_StringDataWriter* self, const char*instance_data);
6)数据订阅
DDS_ReturnCode_t rti_dds_stringdata_subscribe(DDS_StringDataReader*self, char* instance_data);
7)DDS域参与者实体释放
DDS_ReturnCode_t rti_dds_dispose();
4. VC工程配置
打开VC工程属性->配置属性。
1) C/C++ ->常规->附加包含目录:
Ø $(NDDSHOME)\include
Ø $(NDDSHOME)\include\ndds
2) C/C++ ->预处理器->预处理器定义:
Debug模式:
Ø WIN32
Ø RTI_WIN32
Ø _DEBUG
Ø _CONSOLE
Release模式:
Ø WIN32
Ø RTI_WIN32
Ø _CONSOLE
3) 链接器->常规->附加库目录:
Ø $(NDDSHOME)\lib\i86Win32VS2010
4) 链接器->输入->附加依赖项:
Debug模式:
Ø nddsczd.lib
Ø nddscorezd.lib
Ø netapi32.lib
Ø advapi32.lib
Ø user32.lib
Ø WS2_32.lib
Release模式:
Ø nddscz.lib
Ø nddscorez.lib
Ø netapi32.lib
Ø advapi32.lib
Ø user32.lib
Ø WS2_32.lib
5) 链接器->输入->忽略特定默认库
libcmtd