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

news2024/12/26 11:21:52

目录

  • 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.coloradmin.cn/o/1995636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试八股文】软件测试面试题汇总

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有…

bug: 配置flyway.locations多个脚本位置不生效

文章目录 业务场景场景一场景二 业务场景 随着项目版本迭代&#xff0c;数据库结构也会变动。如果一个项目引用其他项目的jar包&#xff0c;并且需要执行对应jar包的flyway脚本&#xff0c;就需要配置flyway.locations 场景一 正常情况下&#xff0c;在一个项目中可以在yml文件…

【亲测有效!】ubuntu20.04和Centos7离线安装docker及nvidia-container-toolkit

【亲测有效&#xff01;】ubuntu20.04和Centos7离线安装docker及nvidia-container-toolkit 一、Ubuntu20.04安装docker&#xff08;1&#xff09;查看当前系统版本号和名称&#xff08;2&#xff09;在镜像源进行源文件下载&#xff08;3&#xff09;命令行进行安装&#xff08…

Mindspore框架利用扩散模型DDPM生成高分辨率图像|(三)模型训练与推理实践

利用扩散模型DDPM生成高分辨率图像&#xff08;生成高保真图像项目实践&#xff09; Mindspore框架利用扩散模型DDPM生成高分辨率图像|&#xff08;一&#xff09;关于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;模型 Mindspore框架利用扩散模型DD…

告别杂音,从 AI 音频降噪开始

生活中&#xff0c;音频无处不在。无论是聆听动人的音乐&#xff0c;还是参与重要的电话会议&#xff0c;又或是沉浸于精彩的网课学习&#xff0c;清晰、纯净的音频质量都至关重要。然而&#xff0c;音频中的噪声却像不速之客&#xff0c;扰乱着这份美好。 音频中的噪声形式多样…

封装一个给 .NET Framework 用的内存缓存帮助类

前言 .NET Core 中已经内置了内存缓存相关的类和操作方法&#xff0c;直接就能使用&#xff0c;非常方便。但在 .NET Framework 中&#xff0c;如果想要使用内存缓存&#xff0c;需要自己进行封装。本文分享一个我自己项目中封装的内存缓存帮助类&#xff0c;有需要的童鞋可以…

前端已经学会vue,做粒子效果

目录 1. Canvas API 2. WebGL 3. 粒子系统 4. 动画与性能优化 5. 现有库和框架 6. Vue 组件和状态管理 实践项目建议 案例1 案例2雪花 已经熟悉了 Vue、TypeScript 和 JavaScript&#xff0c;下面是一些你可以学习的内容&#xff0c;以帮助你实现粒子效果的界面&#…

深度学习基础 - 梯度垂直于等高线的切线

深度学习基础 - 梯度垂直于等高线的切线 flyfish 梯度 给定一个标量函数 f ( x , y ) f(x, y) f(x,y)&#xff0c;它的梯度&#xff08;gradient&#xff09;是一个向量&#xff0c;表示为 ∇ f ( x , y ) \nabla f(x, y) ∇f(x,y)&#xff0c;定义为&#xff1a; ∇ f ( x…

单片机GPIO模式和应用

Push pull 推挽输出 定义&#xff1a;推挽输出是一种输出模式&#xff0c;其中引脚可以输出高电平或低电平&#xff0c;且两种电平状态下都具有较强的驱动能力。 特点&#xff1a; 无论输出高电平还是低电平&#xff0c;都有较强的电流驱动能力。 适用于驱动外部数字电路…

宝塔面板启用 QUIC 与 Brotli 的完整教程

环境 系统&#xff1a;Ubuntu 22.04.4 LTS x86_64 宝塔版本&#xff1a;7.7.0 (可使用本博客提供的一键安装优化脚本) nginx版本&#xff1a;1.26.1 开放UDP端口 注意&#xff1a;在你的服务器商家那里也要开放443 udp端口 sudo ufw allow 443/udp然后重新加载 UFW 以使新…

【漏洞复现】maxView Storage Manager 远程代码执行漏洞

maxView Storage Manager使查看、监控和配置系统中基于Microsemi RAID适配器构建的所有存储变得简单。⽅便的图形⽤户界⾯&#xff08;GUI&#xff09;在Microsemi产品线和⽀持的操作系统&#xff08;包括 Windows、Linux、VMWare和Solaris&#xff09;中的外观和操作都相同。使…

多线程编译

多线程与多进程一样&#xff0c;为了能同时执行多个任务 区别 多进程 创建子进程&#xff0c;子进程会拷贝父进程的数据段的所有内存 进程是资源的获取单位 每个进程完全独立运行 更加关注两个进程之间的通信问题 多线程 线程是进程的最小组成单位&#xff0c;每个进程…

代码随想录算法训练营Day32 | 56. 合并区间 | 738.单调递增的数字 | 968.监控二叉树

今日任务 56. 合并区间 题目链接&#xff1a; https://leetcode.cn/problems/merge-intervals/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {ranges::sort(intervals, [&…

Spring:springboot集成jetcache循环依赖问题

springboot版本&#xff1a;2.6.14 jetcache版本&#xff1a;2.6.2 启动项目报错如下&#xff1a; 解决方案&#xff1a; jetcache版本升级到2.6.4 https://github.com/alibaba/jetcache/issues/624

IT运维岗适用的6本证书

作为IT从业人员&#xff0c;不断提升自身的专业技能和知识是提升职场竞争力、助力升职加薪的重要途径。特别是在运维领域&#xff0c;虽然工作看似简单&#xff0c;但实际上需要掌握的技术知识却相当全面。为了全面提升自己的技术能力&#xff0c;并证明自己的专业能力&#xf…

每周心赏|七夕这样玩也太超前了吧,速来AI一下!

明天就是七夕节了&#xff0c;是时候给七夕节来点大震撼了&#xff0c;AI带你玩点不一样的&#xff01; 给大家挖掘了几个有梗又有爱的智能体。信我&#xff0c;快来试玩&#xff01; 不知道大家是什么人&#xff1f;反正&#xff0c;我是一个很爱测评的人&#x1f92d;&#…

【GaussDB(DWS)】数仓部署架构与物理结构分析

数仓架构与物理结构分析 一、部署架构二、物理结构三、测试验证 一、部署架构 华为数据仓库服务DWS&#xff0c;集群版本8.1.3.x 集群拓扑结构&#xff1a; 上述拓扑结构为DWS单AZ高可靠部署架构&#xff0c;为减少硬件故障对系统可用性的影响&#xff0c;建议集群部署方案遵…

制造企业技术图纸不受控的影响与规避方法

在制造企业中&#xff0c;技术图纸是产品设计、制造与检验的核心依据。若技术图纸不受控&#xff0c;将对企业造成诸多不利影响。 首先&#xff0c;产品质量无法得到保障。不受控的图纸可能存在设计缺陷、尺寸误差或工艺不合理等问题&#xff0c;导致生产出的产品不合格&#…

独辟蹊径:用Python打造你的副业帝国,迈向财富自由

在当今这个数字化时代&#xff0c;掌握一门编程语言如同拥有了一把开启无限可能的钥匙。Python&#xff0c;以其简洁的语法、强大的库支持和广泛的应用领域&#xff0c;成为了许多人实现副业收入乃至财富自由的首选工具。本文将探讨如何利用Python技能开启副业&#xff0c;并逐…

mysql中的表查询操作

performance_schema 系统数据库用于收集Mysql服务器的性能参数&#xff0c;以便数据库管理员了解产生性能瓶颈的原因。information_schema 系统数据库定义了所有数据库对象的元数据信息。 表的常规操作&#xff08;增删改查&#xff09; 我们经常对表进行以下操作 插入&#x…