加载中…
个人资料
lyingbo
lyingbo
  • 博客等级:
  • 博客积分:0
  • 博客访问:178,123
  • 关注人气:62
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

基于OpenDDS的应用程序开发(1)IDL定义

(2014-07-02 17:42:03)
标签:

opendds

idl定义

idl编译

mpc

opendds之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"

    struct Pos {

        long pos_id;

        long pos_x;

        long pos_y;

    };

};

 IDL文件使用DCPS_DATA_TYPE定义一个结构体数据类型,IDL语法要求新的类型定义必须使用该编译指令。OpenDDS规定数据类型必须为一个结构体。结构体中可能包含标量类型(shortlongfloat等等)、枚举类型、字符串、队列、数组、结构体、以及它们的组合。本例中在demo模块中定义了一个结构体pos

使用DCPS_DATA_KEY定义了一个DCPS数据类型的键。一种数据类型可能有0个或多个键。这些键用于区分同一个主题内的不同实体。每个键应当是数值型、枚举型、字符串串或者是这些类型的typedefDCPS_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文件名开头,如下所示:

 filename >C.cpp

 filename >C.h

 filename >C.inl

 filename >S.cpp

 filename >S.h

 filename >S.inl

进而,IDL文件还需要由opendds_idl编译,以生成OpenDDS需要打包和解包信息的序列化和键支持代码,以及用于数据读者和写者类型支持代码。该IDL编译器位于$DDS_ROOT/bin/目录下,运行命令如下:

opendds_idl Demo.idl

该命令为每个IDL文件编译生成三个文件,这三个文件的文件名均由原IDL文件名开头,如下所示:

 filename >TypeSupport.idl

 filename >TypeSupportImpl.h

 filename >TypeSupportImpl.cpp

会生成DemoTypeSupport.idlDemoTypeSupportImpl.hDemoTypeSupportImpl.cpp三个文件。其中生成的IDL文件中包括了PosTypeSupport, PosDataWriter PosDataReader的接口定义。这些特定的DDS类型接口将会在稍后注册数据类型,发布数据样本和接收数据样本时使用,而生成的cpp文件实现了这些接口。生成的IDL文件还需要和原始的IDL一起,用 TAO IDL编译器编译,以便生成相应的接口框架。之后这些生成的实现文件需要和使用 Pos类型的OpenDDS应用程序源码一起编译链接。opendds_idl编译器提供了许多选项,用于生成代码。这些选项将在后续章节详细描述。

通常,我们不需要手动直接调用tao_idl或者opendds_idl来编译IDL文件,可以借助编译工具来完成,如果使用ACEMPC(MakeProjectCreator)工具,通过继承dcps来配置,该过程将会很简单。如下是使用ACEMPC工具来实现这个工作的步骤:

首先,需要编写一个Demo.mpc文件,在mpc文件中定义一个idl工程,内容如下:

project(*idl): dcps {

    // This project ensures the common components get built first.

    TypeSupport_Files {

        Demo.idl

    }

    custom_only = 1

}

idl工程从父工程dcps继承,父工程dcps中定义了类型支持的编译规则。mpc中的TypeSupport_Files部分告诉MPC,使用opendds_idl编译器从Demo.idl中生成类型支持文件。

编写好mpc文件之后,就可以使用MPC命令来生成idl的编译工程了,(MPC工具可以生成很多种系统的编译工程,包括WindowsVs系列,LinuxMakefile),这里将Demo.idl文件和Demo.mpc文件放到Demo文件加下,使用如下命令来生成Vs2008的工程:

perl   mwc.pl  -type  vc9

命令执行完成后,会生成对应的Vs2008工程文件,包括vcprojsln等,使用Vs2008打开Demo.sln就可以编译前面定义的idl文件,生成DemoC.cppDemoTypeSupport.idl等文件了。

 

关于公布端和订阅端应用程序的开发请参见后续博文。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有