当前位置: 首页 > news >正文

Windows下,C# 通过FastDDS高效通信

目录

  • 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)

我们可以借鉴 HelloWorldPublisherHelloWorldSubscriber的写法定义自己的数据处理, 也可以写成兼具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的样例可参见代码示例

代码示例

仅向相关人员提供,生人勿扰。

http://www.lryc.cn/news/424759.html

相关文章:

  • 【模型】ResNet
  • Objective-C中NSExpression与NSPredicate的协同艺术
  • Apache-JMeter压测工具教程
  • Spring Boot集成selenium实现自动化测试
  • 基于phpstudy对cmseasy5.5进行漏洞复现
  • 【c++】 C语言的输入与输出C++的IO流STL空间配置器
  • 基于Faster-RCNN的停车场空位检测,支持图像和视频检测(pytorch框架)【python源码+UI界面+功能源码详解】
  • Vue3从零开始——带你轻松掌握组件的基本操作
  • 【MySQL 03】库的操作 (带思维导图)
  • SpringBoot-读取配置文件内容
  • springboot整合springmvc
  • el-cascader多选的父子关联和父子不关联功能
  • #Datawhale AI夏令营第4期#多模态大模型Task2
  • LeetCode 热题100-1
  • 表现良好的最长时间段(LeetCode)
  • 【性能优化】DNS解析优化
  • 【剑指 offer】合并链表
  • 红酒与节日装饰:打造节日氛围的需备品
  • Element Plus的el-carousel走马灯平铺多张图片
  • 【promise】Promise的几个关键问题 (三)
  • 利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)
  • IP代理如何增强网络安全性?
  • NDP(Neighbor Discovery Protocol)简介
  • 为何要隐藏源 IP 地址?
  • 目前最流行的前端构建工具,你知道几个?
  • C++函数模板温习总结
  • 【网络】套接字(socket)编程——TCP版
  • 水凝胶生物打印是什么?如何指导Organoids培养?有啥好处?
  • 从springBoot框架服务器上下载文件 自定义一个启动器
  • 某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]