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:
For an installation frombinaries or a colcon installation:
<path-to-Fast-DDS-workspace>/src/fastddsgen/scripts/fastddsgen -example CMake HelloWorld.idl
For a stand-alone installation,run:
<path-to-Fast-DDS-Gen>/scripts/fastddsgen -example CMake HelloWorld.idl
On Windows:
For a colcon installation:
<path-to-Fast-DDS-workspace>/src/fastddsgen/scripts/fastddsgen.bat -example CMake HelloWorld.idl
For a stand-alone installation,run:
<path-to-Fast-DDS-Gen>/scripts/fastddsgen.bat -example CMake HelloWorld.idl
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界面的配置参考:
![](https://i-blog.csdnimg.cn/blog_migrate/142af245b21a416554b7b10bb0de5a77.png)
(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;
};