1、Fast DDS-Gen介绍

Fast DDS-Gen是一个Java应用程序,它使用IDL(接口定义语言)文件中定义的数据类型生成Fast DDS源代码。生成的源代码可以用于任何Fast DDS应用程序中,以定义主题的数据类型,并且将用于发布或订阅。Fast DDS通过两个类定义Topic中交换的数据类型:TypeSupport和TopicDataType。TopicDataType描述发布和订阅之间交换的数据类型,即与Topic对应的数据;而TypeSupport是封装TopicDataType的一个实例,提供注册该类型以及发布和订阅交互所需的功能。

要声明结构化数据,必须使用IDL格式。IDL是一种规范语言,由OMG(对象管理组)制定,它以独立于语言的方式描述接口,允许不同开发语言的软件组件之间进行通信。Fast DDS Gen工具读取IDL文件并解析OMG IDL规范的子集,以生成数据序列化的源代码。此子集包括通过IDL定义数据类型中包含的数据类型描述。

Fast DDS Gen生成的源代码使用Fast CDR,这是一个C++11库,提供数据序列化和编码机制。因此,如RTPS标准中所述,当发送数据时,使用相应的公共数据表示(CDR)对数据进行序列化和编码。CDR传输语法是代理间传输的低级表示,从IDL数据类型映射到字节流。

Fast DDS Gen的主要功能是在不了解序列化或反序列化机制的情况下促进DDS应用程序的实现。使用Fast DDS Gen,还可以与使用Fast DDS库的发布者和订阅者一起生成DDS应用程序的源代码。

有关安装Fast DDS Gen,请参阅《Fast DDS入门二、Fast DDS在Windows平台的编译安装》或《Fast DDS入门三、Fast DDS在Linux平台的编译安装》。

2、Fast DDS-Gen用法

本节介绍Fast DDS Gen工具的用法,并简要介绍生成的文件。

首先,安装Fast DDS-Gen必须完成Fast DDS Gen Linux安装或Fast DDS Gen Windows安装中概述的步骤。根据以上安装,脚本文件夹中提供了运行Java Fast DDS Gen应用程序的Linux和Windows可执行文件。如果将脚本文件夹路径添加到path环境变量,则可以运行以下命令执行Fast DDS Gen:

  • Linux:

  • $ fastrtpsgen

  • Windows:

> fastrtpsgen.bat

注意:如果尚未修改PATH,可以在<fastrtpsgen_directory>/scripts目录中找到这些脚本。

应用程序的预期参数列表为:

fastrtpsgen [<options>] <IDL file> [<IDL file> ...]

选项包括:

选项

描述

-help

查看帮助

-version

参看Fast DDS-Gen版本

-d <directory>

设置生成文件的导出目录

-I <directory>

将目录添加到预处理包含的路径。

-t <directory>

设置临时目录

-example <platform>

生成示例和解决方案,以编译特定平台的生成源代码。help命令显示支持的平台。

-replace

生成的源代码文件并替换已存在的文件。

-ppDisable

禁用预处理器

-ppPath

设定预处理路径

-typeobject

为提供的IDL生成TypeObject文件,并修改MyType构造函数以将TypeObject表示注册到工厂中。

3、Fast DDS-Gen生成发布-订阅示例

Fast DDS Gen可用于从IDL文件构建功能齐全的发布/订阅应用程序。生成的应用程序允许创建任意数量的发布者和订阅者,它们都属于同一域,并使用同一主题进行通信。

(1)使用数据类型创建IDL文件

要构建最小的应用程序,必须通过IDL文件定义Topic。在本例中,IDL定义的Topic数据类型只是一个字符串消息。在文本编辑器中,创建具有以下内容的HelloWorld.idl文件,并将其保存在FastDDSGenHelloWorld目录中。

// HelloWorld.idl

struct HelloWorld

{

string message;

};

然后,将此文件转换为Fast DDS能够理解的内容。

(2)生成Fast DDS源代码

应用程序文件是使用以下命令生成的。-example选项创建一个示例应用程序,以及构建该应用程序所需的CMake文件。在工作区目录(FastDDSGenHelloWorld目录)中,根据所遵循的安装和操作系统执行以下命令之一。

  • On Linux:

  1. For an installation frombinaries or a colcon installation:

  • <path-to-Fast-DDS-workspace>/src/fastddsgen/scripts/fastddsgen -example CMake HelloWorld.idl

  1. For a stand-alone installation,run:

  • <path-to-Fast-DDS-Gen>/scripts/fastddsgen -example CMake HelloWorld.idl

  • On Windows:

  1. For a colcon installation:

  • <path-to-Fast-DDS-workspace>/src/fastddsgen/scripts/fastddsgen.bat -example CMake HelloWorld.idl

  1. For a stand-alone installation,run:

  • <path-to-Fast-DDS-Gen>/scripts/fastddsgen.bat -example CMake HelloWorld.idl

  1. For an installation frombinaries, run:

fastddsgen.bat -example CMake HelloWorld.idl

在项目生成结束后,应用程序工作区将具有以下结构:

.

└── workspace_DDSHelloWorld

├── build

│ ├── CMakeCache.txt

│ ├── CMakeFiles

│ ├── cmake_install.cmake

│ ├── HelloWorld

│ ├── libHelloWorld_lib.a

│ └── Makefile

├── CMakeLists.txt

├── HelloWorld.cxx

├── HelloWorld.h

├── HelloWorld.idl

├── HelloWorldPublisher.cxx

├── HelloWorldPublisher.h

├── HelloWorldPubSubMain.cxx

├── HelloWorldPubSubTypes.cxx

├── HelloWorldPubSubTypes.h

├── HelloWorldSubscriber.cxx

└── HelloWorldSubscriber.h

(3)构建Fast DDS应用程序

然后,从FastDDSGenHelloWorld目录编译执行以下命令的生成代码。

  • On Linux:

cd build

cmake ..

make

  • On Windows:

cd build

cmake -G "Visual Studio 15 2017 Win64" ..

cmake --build .

注意:CMake命令行直接生成FastDDS可执行应用程序会报错,因为需要先配置好应用程序的相关依赖,因此启动CMake-GUI界面程序,配置依赖完成后,再命令行生成二进制程序,或者通过vs开发工具生成都可以。以下是CMake界面的配置参考:

(4)运行Fast DDS-Gen生成的实力程序

  • On Linux:

./HelloWorld publisher

./HelloWorld subscriber

  • On Windows:

HelloWorld.exe publisher

HelloWorld.exe subscriber

每次在发布服务器上按下<Enter>时,都会生成一个新的数据报,由当前在线的订阅服务器通过网络和接收器接收。如果有一个以上的订户可用,则可以看到消息在所有侦听节点上被同等地接收。

注意:

网络通信中,为防止防火墙过滤处理,可能需要在防火墙中设置一个特殊规则,以便FastDDS在Windows上正常工作。

4、通过IDL定义数据类型(常用数据类型)

(1)基本数据类型

下表显示了Fast DDS Gen支持的基本IDL类型以及它们如何映射到C++11。

IDL类型

C++11类型

char

char

octet

uint8_t

short

int16_t

unsigned short

uint16_t

long

int32_t

unsigned long

uint32_t

long long

int64_t

unsigned long long

uint64_t

float

float

double

double

long double

long double

boolean

bool

string

std::string

(2)数组

Fast DDS Gen支持一维和多维阵列。数组始终映射到std::array容器。下表显示了支持的数组类型及其映射。

IDL

C++11

char a[5]

std::array<char,5> a

octet a[5]

std::array<uint8_t,5> a

short a[5]

std::array<int16_t,5> a

unsigned short a[5]

std::array<uint16_t,5> a

long a[5]

std::array<int32_t,5> a

unsigned long a[5]

std::array<uint32_t,5> a

long long a[5]

std::array<int64_t,5> a

unsigned long long a[5]

std::array<uint64_t,5> a

float a[5]

std::array<float,5> a

double a[5]

std::array<double,5> a

(3)序列

Fast DDS Gen支持映射到std::vector容器的序列。下表表示如何处理IDL和C++11之间的映射。

IDL

C++11

sequence<char>

std::vector<char>

sequence<octet>

std::vector<uint8_t>

sequence<short>

std::vector<int16_t>

sequence<unsigned short>

std::vector<uint16_t>

sequence<long>

std::vector<int32_t>

sequence<unsigned long>

std::vector<uint32_t>

sequence<long long>

std::vector<int64_t>

sequence<unsigned long long>

std::vector<uint64_t>

sequence<float>

std::vector<float>

sequence<double>

std::vector<double>

(4)maps

Fast DDS Gen支持与std::map容器等效的map。类型之间的等价性的处理方式与序列相同。

IDL

C++11

map<char, unsigned long long>

std::map<char, uint64_T>

(5)结构体

可以使用一组具有多种类型的成员定义IDL结构。它将被转换为C++类,其中通过IDL定义的结构的成员映射到该类的私有数据成员。此外,还创建了set()和get()成员函数来访问这些私有数据成员。

以下IDL结构体:

struct Structure

{

octet octet_value;

long long_value;

string string_value;

};

将转换为:

class Structure

{

public:

Structure();

~Structure();

Structure(constStructure&x);

Structure(Structure&&x);

Structure& operator=(constStructure&x);

Structure& operator=(Structure &&x);

void octet_value(uint8_t_octet_value);

uint8_t octet_value() const;

uint8_t& octet_value();

void long_value(int64_t_long_value);

int64_t long_value() const;

int64_t& long_value();

void string_value(conststd::string

&_string_value);

void string_value(std::string &&_string_value);

conststd::string&string_value()const;

std::string&string_value();

private:

uint8_tm_octet_value;

int64_tm_long_value;

std::stringm_string_value;

};

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐