基于OpenDDS的应用程序开发(1)IDL定义
(2014-07-02 17:42:03)
标签:
openddsidl定义idl编译mpcopendds之idl |
分类: DDS开发 |
基于OpenDDS的应用程序开发
(1)IDL定义
接下来的几篇博文主要介绍一个OpenDDS应用程序的示例,演示如何基于OpenDDS开发一个应用程序,将数据从发布端节点发送到订阅端节点。该示例程序基于一个简单的消息应用程序,由一个简单的发布者发布数据,订阅者订阅数据,使用默认的QoS策略和TCP/IP传输方式。
本文是第一篇,主要介绍IDL的定义及编译。
IDL定义
DDS中的每个数据类型都是通过IDL定义的。OpenDDS使用#pragma指令定义DDS传输和处理的数据类型。这些数据类型由tao_idl编译器和OpenDDS idl编译器进行处理,用于生成必要的代码去传输这些类型的数据。
下面是一个定义Demo数据类型的IDL文件:
module Demo {
#pragma DCPS_DATA_TYPE "Demo::Pos"
#pragma DCPS_DATA_KEY "Demo::Pos.pos_id"
};
使用DCPS_DATA_KEY定义了一个DCPS数据类型的键。一种数据类型可能有0个或多个键。这些键用于区分同一个主题内的不同实体。每个键应当是数值型、枚举型、字符串串或者是这些类型的typedef。DCPS_DATA_KEY限定了作用域的数据类型以及成员名,成员名标识为该类型的键。多个键由多个DCPS_DATA_KEY指定。在上面的IDL定义中,指定了pos_id作为Demo::Pos的键。每个样本发布时带有一个唯一的pos_id值,这样就可以区分同一主题中的不同实例。由于使用了默认的QoS策略,随后带有相同pos_id值的样本就会替代先前的样本。
其它类型,如结构体、序列和数组不能直接用来做key,但是当结构体的成员或数组中的元素是数值型、枚举型或者字符串型时,可以。
IDL编译
IDL文件首先由tao_idl编译,以生成数据在网络上传输时打包解包的代码,该IDL编译器位于$ACE_ROOT/bin/目录下,运行命令如下:
tao_idl Demo.idl
该命令为每个IDL文件编译生成六个个文件,这六个文件的文件名均由原IDL文件名开头,如下所示:
进而,IDL文件还需要由opendds_idl编译,以生成OpenDDS需要打包和解包信息的序列化和键支持代码,以及用于数据读者和写者类型支持代码。该IDL编译器位于$DDS_ROOT/bin/目录下,运行命令如下:
opendds_idl Demo.idl
该命令为每个IDL文件编译生成三个文件,这三个文件的文件名均由原IDL文件名开头,如下所示:
会生成DemoTypeSupport.idl、DemoTypeSupportImpl.h和DemoTypeSupportImpl.cpp三个文件。其中生成的IDL文件中包括了PosTypeSupport, PosDataWriter 和PosDataReader的接口定义。这些特定的DDS类型接口将会在稍后注册数据类型,发布数据样本和接收数据样本时使用,而生成的cpp文件实现了这些接口。生成的IDL文件还需要和原始的IDL一起,用 TAO IDL编译器编译,以便生成相应的接口框架。之后这些生成的实现文件需要和使用 Pos类型的OpenDDS应用程序源码一起编译链接。opendds_idl编译器提供了许多选项,用于生成代码。这些选项将在后续章节详细描述。
通常,我们不需要手动直接调用tao_idl或者opendds_idl来编译IDL文件,可以借助编译工具来完成,如果使用ACE的MPC(MakeProjectCreator)工具,通过继承dcps来配置,该过程将会很简单。如下是使用ACE的MPC工具来实现这个工作的步骤:
首先,需要编写一个Demo.mpc文件,在mpc文件中定义一个idl工程,内容如下:
project(*idl): dcps {
}
idl工程从父工程dcps继承,父工程dcps中定义了类型支持的编译规则。mpc中的TypeSupport_Files部分告诉MPC,使用opendds_idl编译器从Demo.idl中生成类型支持文件。
编写好mpc文件之后,就可以使用MPC命令来生成idl的编译工程了,(MPC工具可以生成很多种系统的编译工程,包括Windows的Vs系列,Linux的Makefile等),这里将Demo.idl文件和Demo.mpc文件放到Demo文件加下,使用如下命令来生成Vs2008的工程:
perl
命令执行完成后,会生成对应的Vs2008工程文件,包括vcproj和sln等,使用Vs2008打开Demo.sln就可以编译前面定义的idl文件,生成DemoC.cpp和DemoTypeSupport.idl等文件了。
关于公布端和订阅端应用程序的开发请参见后续博文。