fastdds:idl

1使用网络收发数据的最简单方式

在学习idl之前,先来看一下我们在开发中,通过网络收发数据时,常常怎么实现。 

struct Student {char name[32];int  age;char sex;// f 男,m 女
};//发送侧
struct Student s1 = {"xiaoming", 7, 'f'};
send(fd, (void *)(&s), sizeof(struct Student))//接收侧
struct Student s2;
recv(fd, (void *)(&s2), sizeof(struct Studen));

上边是一个c语言中经常使用的通过网络收发数据的例子,包括两个步骤:

(1)定义一个结构体来表示用户的数据

(2)收发的时候直接使用结构体的地址和大小

这种方式,有以下三点需要注意:

(1)适用于字节序相同的机器,如果发送端和接收端所在的机器字节序不同,那么可能会有问题。

(2)适用于相同语言之间的收发,不能跨语言。

(3)直接发送结构体大小的数据,没有进行显式的序列化和反序列化。序列化即将结构化的数据转化成字节流,反序列化则反之。结构体的每个成员的大小之和为32+4+1=37个字节,而sizeof(struct Student)的大小是40。不做显式的序列化和反序列化,只能适用于这种简单的场景,如果数据结构复杂度增大,比如在c++中,使用了std::string、std::vector等,那么就不适用了,因为对于std::string、std::vector这样的数据,不管sizeof返回的是对象的大小,并不是实际数据的大小,也就是说,不管std::string的字符串多长,sd::vector中的元素个数是1个还是100个,sizeof的返回值是不变的。

2idl

2.1idl支持的数据类型

fasdds idl官方文档:5. Defining a data type via IDL — Fast DDS 3.1.1 documentation

idl的全称是Interface Definition Language,接口定义语言。接口这个词真的在很多场景下都会使用,并且有不同的含义:一个函数可以叫做一个接口;在c++中,一个抽象类可以叫做接口;在使用uml画图的时候,一个类也可以叫做一个接口,接口表示一个软件组件给另一个软件组件提供的可以调用的函数。在idl中,接口说的就是通信的双方使用的通信数据的格式。

如下是fasdds例子hello world中的idl。定义一个idl,使用struct来定义。作为通信数据格式的定义,idl与我们使用结构体比较类似,但也有很大的区别,idl和c/c++中的结构体明显的区别有以下三点:

(1)支持注解,比如下边的@extensibility(APPENDABLE)就是一个注解

(2)支持sring,vector,sequence等数据类型,序列化和反序列化不需要用户关心

(3)idl支持跨语言,使用同一个idl,可以生成c++或者python的文件,使用c++开发的应用和使用python开发的应用之间可以通过同一个idl进行通信

idl支持的数据类型在官方文档有说明,有如下几类:

基本数据类型常见的基本数据类型都支持:整数、复现数、布尔类型、字符、字符串
数组和序列数组的大小在定义的时候就需要指定,序列的大小不需要指定,序列的大小不固定。数组对应c++中的std::array,序列对应c++中的std::vector
mapmap是<key, value>类型的数据,只支持key和value是基本数据类型的map。
结构体结构体是经常使用的。

上表是常用的数据类型,idl另外还支持联合体、枚举、bit集等。 

2.2注解:@id

id用来注解结构体中成员的序号,常常和@extensibility(MUTABLE)一起出现。如果没哟使用id进行注解,那么默认的id是从0开始。

如下两个结构体,index的id都是是0,message的id都是1,两者都是MUTABLE类型的。理论上来说,两者是可以互通的,但是在fastdds上实际测试,两者是不通的。

@extensibility(MUTABLE)
struct HelloWorld {
        unsigned long index;
        string message;
};

@extensibility(MUTABLE)
struct HelloWorld
{
    @id(1) string message;
    @id(0) unsigned long index;
};
 

2.3注解:@extensibility

如果系统已经上线稳定运行,这个时候系统需要新增功能,需要在idl中新增字段,同时只需要新增的代码使用新的字段,已经运行的软件不使用新字段,新旧软件使用同一个idl。@extensibility就是为了满足这样的需求。

APPENDABLE:

APPENDABLE的意思是可以在后边追加数据。如下例子,一开始HelloWorld中只有两个数据成员,分别是index和message,如果我们想要新增一个数据name,那么可以新定义一个结构体HelloWorld1,这样,使用HelloWorld1的软件可以和HelloWorld的软件通信。

新:

@extensibility(APPENDABLE)
struct HelloWorld {
        unsigned long index;
        string message;
};

@extensibility(APPENDABLE)
struct HelloWorld1
{
        HelloWorld hello;
        string name;
};

旧:

@extensibility(APPENDABLE)
struct HelloWorld {
        unsigned long index;
        string message;
};

APPENDABLE追加,不是在原来的结构体中追加,比如下边两个idl是不能通信的。

@extensibility(APPENDABLE)
struct HelloWorld
{
        unsigned long index;
        string message;
};
 

@extensibility(APPENDABLE)
struct HelloWorld
{
        unsigned long index;
        string message;

        string name;
};

2、如下使用继承的方式,也是可以通信的

旧:

@extensibility(APPENDABLE)
struct HelloWorld
{unsigned long index;string message;
};

新:

@extensibility(APPENDABLE)
struct HelloWorld {unsigned long index;string message;
};@extensibility(APPENDABLE)
struct HelloWorld1 : HelloWorld
{string name;
};

自己在测试中发下,如下两种使用FINAL进行注解的情况,新idl和旧idl也是可以通信的,这一点与FINAL的语义是不符合的。并且新idl做为publisher,旧idl作为subscriber,以及返过来,均可以通信。

1、组合方式,新idl和旧idl都使用FINAL类注解

新:

@extensibility(FINAL)
struct HelloWorld {
        unsigned long index;
        string message;
};

@extensibility(FINAL)
struct HelloWorld1
{
        HelloWorld hello;
        string name;
};
 

旧:

@extensibility(FINAL)
struct HelloWorld {
        unsigned long index;
        string message;
};

2、使用继承的方式,新idl和旧idl都使用FINAL类注解

新:

@extensibility(APPENDABLE)
struct HelloWorld {
        unsigned long index;
        string message;
};

@extensibility(APPENDABLE)
struct HelloWorld1 : HelloWorld
{
        string name;
};
旧:

@extensibility(APPENDABLE)
struct HelloWorld
{
        unsigned long index;
        string message;
};

两个struct,数据成员完全一样,一个是FINAL,一个是APPENDABLE,两者不能通信。

@extensibility(FINAL)
struct HelloWorld
{
        unsigned long index;
        string message;
};
 

@extensibility(APPENDABLE)
struct HelloWorld
{
        unsigned long index;
        string message;
};
 

MUTABLE:

参考2.1

2.4fastddsgen

fastddsgen是用java开发的工具,使用idl定义的数据结构,要使用fastddsgen来将idl生成对应的.h和.cpp文件。命令格式是./fastddsgen xxx.idl。

3. Linux installation from sources — Fast DDS 3.1.1 documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络之多路转接epoll

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之多路转接epoll 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

Windows server 服务器网络安全管理之防火墙出站规则设置

Windows server 服务器网络安全管理之防火墙出站规则设置 创建一条出站规则 这条出站规则针对IE浏览器设置&#xff0c;指定路径 TCP协议和指定端口&#xff08;多个端口的写法要注意&#xff09; 所有IP&#xff0c;所有应用&#xff0c;都采用阻止 给这条规则进行命名…

jmeter 接口性能测试 学习笔记

目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1&#xff1a;测试接口接口准备线程组添加线程组配置线程组值线程数&#xff08;Number of Threads&#xff09;Ramp-Up 时间&#xff08;Ramp-Up Period&#xff09;循环次数&#xff08;Loop Count&…

Pytorch | 从零构建ResNet对CIFAR10进行分类

Pytorch | 从零构建ResNet对CIFAR10进行分类 CIFAR10数据集ResNet核心思想网络结构创新点优点应用 ResNet结构代码详解结构代码代码详解BasicBlock 类ResNet 类ResNet18、ResNet34、ResNet50、ResNet101、ResNet152函数 训练过程和测试结果代码汇总resnet.pytrain.pytest.py 前…

gpu硬件架构

1.简介 NVIDIA在视觉计算和人工智能&#xff08;AI&#xff09;领域处于领先地位&#xff1b;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论&#xff0c;但很难掌握各种组件的清晰完整的图景。 这些GPU的高性…

Java中的方法重写:深入解析与最佳实践

在Java编程中&#xff0c;方法重写&#xff08;Method Overriding&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念之一。它允许子类提供一个与父类中同名方法的具体实现&#xff0c;从而实现多态性&#xff08;Polymorphism&#xff09;。本文将深入探讨Java…

使用vcpkg安装opencv>=4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效

使用vcpkg安装opencv>4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效\无法查找或打开 至少从2024年开始&#xff0c;发布的vcpkg默认安装的opencv版本都是4.x版。4.8版本及以前&#xff0c;vcpkg编译后的opencv头文件目录是*/vcpkg/x64-win…

基于java web在线商城购物系统源码+论文

一、环境信息 开发语言&#xff1a;JAVA JDK版本&#xff1a;JDK8及以上 数据库&#xff1a;MySql5.6及以上 Maven版本&#xff1a;任意版本 操作系统&#xff1a;Windows、macOS 开发工具&#xff1a;Idea、Eclipse、MyEclipse 开发框架&#xff1a;SpringbootHTMLjQueryMysq…

基于字节大模型的论文翻译(含免费源码)

基于字节大模型的论文翻译 源代码&#xff1a; &#x1f44f; star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型&#xff08;Large Language Model, LLM&#xff09;的论文阅读与翻译辅助工具。它通过用户界面&#xff08…

centos7下docker 容器实现redis主从同步

1.下载redis 镜像 docker pull bitnami/redis2. 文件夹授权 此文件夹是 你自己映射到宿主机上的挂载目录 chmod 777 /app/rd13.创建docker网络 docker network create mynet4.运行docker 镜像 安装redis的master -e 是设置环境变量值 docker run -d -p 6379:6379 \ -v /a…

实现 WebSocket 接入文心一言

目录 什么是 WebSocket&#xff1f; 为什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的优势 总结&#xff1a;HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …

机动车油耗计算API集成指南

机动车油耗计算API集成指南 引言 在当今社会&#xff0c;随着机动车数量的持续增长和环保意识的不断增强&#xff0c;如何有效管理和降低车辆油耗成为了车主、车队管理者以及交通政策制定者共同关注的问题。为了帮助这些群体更好地理解和优化燃油消耗情况&#xff0c;本接口能…

前端yarn工具打包时网络连接问题排查与解决

最近线上前端打包时提示 “There appears to be trouble with your network connection”&#xff0c;以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包&#xff0c;命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…

IIC I2C子协议 SMBus协议 通信协议原理 时序 SMBus深度剖析

引言&#xff1a;系统管理总线&#xff08;SMBus&#xff09;是一种双线接口&#xff0c;通过该接口&#xff0c;各种系统组件芯片和设备可以相互以及与系统其他部分通信。它基于IC总线的操作原理。附录B提供了一些SMBus特性与IC总线不同的方式的描述。 SMBus为系统和电源管理相…

【Lua热更新】上篇

Lua 热更新 - 上篇 下篇链接&#xff1a;【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…

React图标库: 使用React Icons实现定制化图标效果

React图标库: 使用React Icons实现定制化图标效果 图标库介绍 是一个专门为React应用设计的图标库&#xff0c;它包含了丰富的图标集合&#xff0c;覆盖了常用的图标类型&#xff0c;如FontAwesome、Material Design等。React Icons可以让开发者在React应用中轻松地添加、定制各…

如何使用 WebAssembly 扩展后端应用

1. WebAssembly 简介 随着互联网的发展&#xff0c;越来越多的应用借助 Javascript 转到了 Web 端&#xff0c;但人们也发现&#xff0c;随着移动互联网的兴起&#xff0c;需要把大量的应用迁移到手机端&#xff0c;随着手端的应用逻辑越来越复杂&#xff0c;Javascript 的解析…

Fastdfs V6.12.1集群部署(arm/x86均可用)

文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统&#xff0c;特别适合用于存…

maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException

Maven生产环境中遇到java.lang.IndexOutOfBoundsException的问题&#xff0c;尝试了重启电脑、重启IDEA等常规方法无效&#xff0c;最终通过直接重建工程解决了问题。 Rebuild Project 再启动OK