目录
- 1、安装FastDDS 库
- 2、使用IDL定义自己的数据格式
- 3、生成DLL
- 3.1 托管 (Managed)模式
- 3.2 非托管 (Unmanaged)模式 -- 可用于Unity
- 代码示例
eprosima Fast DDS is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group).
这里讲讲怎么在C#中也能用上这一能高效通讯的工具
1、安装FastDDS 库
主要参考 Fast DDS documentation ,到官网下载界面下载编译好的版本。 (也可以下载源代码编译,太麻烦,没成功,这里掠过)
填完表格选择
我下载的是2.14.2版本
找到windows安装包
安装完成后会看到\eProsima\fastrtps 2.14.2
文件夹下有这些东西:
里面有一些example
,你可以自己cmake编译测试一下。
2、使用IDL定义自己的数据格式
创建在一个空文件夹里创建一个*.idl文件
下面是一个示例 HelloWorld.idl
:
struct HelloWorld
{unsigned long long timestamp;octet det_valid[2];float joints[21][3];
};
上面分别对应C++11的数据格式:
uint64_t timestamp;
std::array<uint8_t,2> det_valid;
std::array<std::array<float, 3>, 21> joints;
更多数据格式的对应关系参考: Defining a data type via IDL
现在我们使用Fast DDS-Gen工具基于 HandMessage.idl
生成为项目的源代码,这是一个十分优雅的设计。
在该文件夹下,用VS的命令行窗口(系统自带的powershell不一定好使)运行如下命令:
fastddsgen.bat -example CMake .\HelloWorld.idl
理论上fastddsgen.bat已经在你的环境变量里了,如果没有,将
~\eProsima\fastrtps 2.14.2\bin
添加到你的环境变量里即可。
现在你会发现多了好多文件:
这里利用CMakeLists.txt 编译时,有可能出现找不到openssl的情况。
可以参考博客安装 win版的OpenSSL,然后在find_package(fastcdr REQUIRED)
前添加你的OpenSSL include目录,如set(OPENSSL_INCLUDE_DIR "C:/Program Files/OpenSSL-Win64/include")
其实CMakeLists.txt 中还会有一些诸如库文件路径等的小问题,稍微有点功底都能解决,这里不再赘述。
编译完成后分别运行
.\HelloWorld.exe subscriber
和
.\HelloWorld.exe publisher
看到类似下列输出即为成功:
其实基于idl生成的核心内容是
HelloWorld.h, HelloWorld.cxx, HelloWorldPubSubTypes.h, HelloWorldPubSubTypes.cxx
其他如xPublisher, xSubscriber以及PubSubMain无论用什么idl文件生成的都是类似的内容
根据你的任务需求修改Publisher和Subscriber的数据处理
Publisher修改
void HelloWorldPublisher::run()
Subscriber修改
void HelloWorldSubscriber::SubListener::on_data_available(DataReader* reader)
我们可以借鉴
HelloWorldPublisher
和HelloWorldSubscriber
的写法定义自己的数据处理, 也可以写成兼具Publisher和Subscriber的Sever-Client形式,就看你的具体任务需求了。
一些参考:
关于FastDDS在C#中使用的简单实例
Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)
3、生成DLL
以上,C++部分就讲完了,数据处理怎么样大家各不相同,现在讲C++数据处理部分搞定后怎么让C#调用
仅提供一些参考链接,涉及非个人权力内容,非相关人员不能提供太多东西。
托管DLL和非托管DLL的区别
C#与C++代码的互操作方式
这个博客写的很好:
vs2019 实现C#调用c++的dll两种方法
注意编译形式
Release/Debug
和 平台x64/x86
的统一
3.1 托管 (Managed)模式
利用C++/CLI项目编译
CLI不会默认勾选,需要自行勾选
安装后,新建项目即可选择
剩下的可以参考
C#调用C++类,托管C++方式实现(创建C++ CLR dll项目)
C# 调用 C++ DLL(4) 托管方式:需要使用c++类
C#如何调用C++(进阶篇)
如何用轻松用C#(.NET)调用自己编写C++的CLR(DLL)类库(Visual Studio)
3.2 非托管 (Unmanaged)模式 – 可用于Unity
这部分的简单实现可以参考
C++生成dll与C#调用
C# 调用 dll 文件
如何在C#代码中调用C++函数 (一)
适用于FastDDS的样例可参见代码示例
代码示例
仅向相关人员提供,生人勿扰。