RTI_DDS自定义插件开发 2 NDDS传输插件API

文档描述了使用NDDS抽象可插拔传输接口实现传输插件的方法。本文档假定对DDS标准的术语有一定的熟悉程度。

开发插件需要四个方面:

  • 方法:每个Transport-Plugin实现必须提供的方法
  • 资源:通过Transport Plugin处理发送或接收消息所需的信息
  • 信息:支持从传输插件接收的消息
  • 监听者:传输插件用于通知传输插件中动态更改的NDDS内核的API

详细说明:

该方法抽象出NDDS用来发送和接收消息的实际机制。 它是NDDS核心和“传输”层之间的API

概观

该模块的目标是提供一个通用的API,可以映射到任何所需的“物理传输”,如IP套接字,反射内存,串行,无线或其他传输。
该API旨在实现高性能,并允许NDDS利用特定传输提供的分散收集,零拷贝和其他高性能设施。

传输被建模为一种设施,提供描述消息接收者地址,发送消息和接收消息的方法。 传输将消息本身视为给定长度的不透明字节数据包。 对于NDDS,传递给传输层的消息实际上是RTPS消息,每条消息都是按照实时发布订阅在线协议格式化的。
传输插件是通过提供一组函数来创建的,这些函数定义了如何创建,销毁和使用资源来发送和接收消息(概念上说, SendResources和RecvResources )。 这些“资源”究竟取决于Transport Plugin本身的实现。 例如,对于IP套接字通信,其中一个资源将是用于发送或接收数据的套接字的句柄,通常是套接字描述符。
这些功能一起分组到方法中 。 这里实现这些方法的代码将被称为“传输插件”。

由于NDDS是DDS标准的实现,因此对Transport-Plugin设计有一些解释,这些设计将与DDS引入的概念联系起来。 

设计

以下段落解释了方法的设计,以及设计背后的一些基本原理。 首先请注意,传输插件的API涉及多个实体。
第一个是Transport Plugin的实现者。 该人员负责创建符合API规范的代码,并正确地与任何用于通信的传输硬件/软件进行交互。
另一个是NDDS本身。 NDDS核心代码将通过API使用传输插件与其他NDDS应用程序建立联系和交换数据。
最后,使用NDDS的应用程序的创建者也希望使用特定的传输插件。 这个人,也被称为“最终用户”,需要调用传输插件提供的API来实例化和配置插件,供NDDS在其应用程序中使用。

Transport-Plugin API的某些部分只能由NDDS核心使用,其他部分只能由最终用户使用。

基本要素

传输属性

Transport-Plugin实现需要为定义良好的一组通用传输独立属性提供值,以便NDDS核心代码了解插件的一些限制,例如最大消息大小。 这些属性由NDDS_Transport_Property_t结构定义。

这些属性是不可变的。 一旦传输插件已注册到NDDS内核,这些属性的值不能在插件存在时更改。

发送端的属性与使用同一个Transport-Plugin类的不同实例进行通信的接收端兼容很重要 。 例如,如果一方被配置为发送大于另一方可以接收的消息,则通信可能会通过该插件失败。

当然,这并不妨碍Transport-Plugin实现者创建插件,以确保在建立连接时它们具有兼容属性。 但是,NDDS核心本身只会使用插件实例初始注册时设置的属性值。

在传输插件中寻址

消息的目的地由地址和端口号表示。 地址用IPv6表示法中的一个16字节数表示,请参阅地址 。 运输工具将使用此地址来确定如何将消息发送到远程计算机。 另外,一些传输可以使用端口号来进一步标识消息被传送到远程机器上的哪个进程或线程。
地址将是Transport Plugin接口的地址,请参阅接口 。 具有多个接口的Transport Plugin的实例可以接收具有不同目标地址的消息。
特定的传输插件实现可能不需要也不能解决16字节地址空间中所有2 ^ 128个可能的值。 这将取决于传输插件的每个实现,以确定它需要从16字节地址空间获得多少地址,以及如何将这些地址映射到传输本身的任何寻址方案。
例子
基于IPv4的传输插件永远不会超过4个字节的目标地址。 此外,对于IPv4,将IPv4地址的4个字节映射到NDDS传输 - 插件API所需的16字节寻址方案是很简单的。
传输基于专用点对点链接(例如串行端口)的插件可能根本不需要任何地址(回想一下,它们仅用于允许传输确定它发送消息的目标接口)。 给定要发送的消息时,基于串口的插件只能将其发送到一个目的地,即串行端口的另一端。 再一次,映射到一个16字节的地址是微不足道的。
一些传输可能不会在其原生地址方案中使用数字,例如Stargen Star Star。 现在将由NDDS插件的实现者决定,以便传输创建从本地寻址到16字节数值的唯一映射,反之亦然。
因此,所有传输必须将其自己的“目标地址”内部表示映射为数字16字节表示。 传输插件应该只使用传输所需的16字节地址空间的许多位。 NDDS将使用其余位作为唯一标识具有重叠地址空间的不同传输的方式。 请参阅NDDS_Transport_Property_t :: address_bit_count 。

例如,一个IPv4-UDP传输插件有一个4字节的地址空间(0:0:0:0:0:0:xxxx:xxxx),所以它的address_bit_count是96.一个传输插件可以使用多达256个串行端口同时只需要一个1字节地址空间(0:0:0:0:0:0:0:00xx, address_bit_count为120)。 但是,如果应用程序使用两种插件,则地址0:0:0:0:0:0:0001不明确,因为它是两个插件中的有效目标地址。

因此,最终用户必须能够配置NDDS以同时使用两个传输插件,以便NDDS使用的地址在所有传输中都是唯一且不重叠的。 因此引入了网络 地址的概念。

网络地址是Transport Plugin未使用的16字节地址的一部分。 这可以从0位到128位不等。 结构NDDS_Transport_Property_t的address_bit_count用于通知NDDS核心地址的多少位对于传输是重要的。 不管剩下的是什么,128- address_bit_count都可以用作网络地址。

只要网络地址至少有1位可用,NDDS就可以使用该位来区分该传输的单个实例与其他传输。

例如,对于前面描述的UDP和串行传输插件,网络地址的UDP传输长度为12个字节,串行传输的长度为15个字节。

yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:xxxx:xxxx ,对于IPv4-UDP
yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyxx ,for Serial
地址的yy部分是网络地址, xx部分由传输器本身使用。

现在,最终用户可以配置传输插件,以便NDDS可以根据其完整的16字节地址唯一确定使用哪个传输来发送消息。 请参阅此配置API。

例如,可以将IPv4-UDP传输的网络地址设置为1000:0:0:0:0:0:xxxx:xxxx,并将串行传输的网络地址设置为2000:0:0:0:0: 0:0:00XX。 然后,目标地址以1开头的消息将通过IPv4-UDP传输发送,而以2开头的消息将通过串行传输发送。

1000 :0:0:0:0:0:xxxx:xxxx,一个IPv4目标
2000 :0:0:0:0:0:0:00xx是一个串行目标。
如果应用程序中安装了这两个传输插件实例,那么未使用的网络地址部分将用于为所有插件创建唯一的,不重叠的地址范围。

注意:
在通过相同物理传输连接的所有不同应用程序中的相同传输插件的所有实例,即通过相同“网络”上的传输进行通信,都必须配置相同的网络地址。

有关使用网络地址注册传输插件的更多信息,请参阅配置API。

在运输层面不需要可靠性

Transport Plugin使用的实际传输不需要可靠。 通过传输器发送的消息可能会丢失或丢失。 NDDS在方法之上实施可靠的协议,以支持DDS API所需的可靠消息传递功能。

但是,传输插件需要确保传递到NDDS内核的消息内容没有任何改变。 所以消息必须在没有讹误的情况下完整传递。 如果传输检测到但无法更正损坏或截断的消息,则应删除这些消息,并依赖NDDS内核根据需要重新发送消息。

多种运输

正如前面的讨论所暗示的,应用程序可能会将NDDS配置为同时使用多个传输。 默认情况下,NDDS将自动实例化,配置和注册内置传输。 这些传输使用系统共享内存(请参阅NDDS_Transport_Shmem_Plugin)以及使用IPv4-UDP套接字(请参阅NDDS_Transport_UDPv4_Plugin)跨IP网络的单播和多播通信启用进程间通信。 内置的Transport Plugins与NDDS用户创建的任何插件符合相同的API。

NDDS用户可以实例化,配置和注册自定义传输插件,并根据需要将它们与内置传输结合使用或替代内置传输。 用户可能希望实施他们自己版本的NDDS内置传输插件,以内置插件不支持的方式定制这些传输的行为。 有关更多信息,请参阅NDDSTransportUserModule。

无连接或面向连接

Transport-Plugin API不承担面向连接或无连接的传输。 一个应该能够使用面向连接的,例如TCP或无连接的(例如,UDP)传输来实现API。

网络接口

传输插件可以在插件的单个实例中“管理”多于一个网络接口。 什么是网络接口? 虽然它可以转换为用于特定类型传输的不同物理设备,但是网络接口可以被定义为同一网络上的其他接口可以用来发送消息的唯一地址(参见接口 )。

例如,对于基于IP的传输,计算机上可能安装了许多不同的接口,包括物理(实际NIC卡)和虚拟(如VPN通道)。 使用基于IP的传输的传输插件的实现者可以选择设计插件,以便单个实例可以同时在计算机上的所有IP接口上使用(发送和接收)。 或者一个不太复杂的设计可能会限制一个实例只附加到一个单一的接口。 或者更复杂的设计可能允许用户选择允许实例使用哪个网络接口(如NDDS_Transport_UDPv4_Plugin的情况)。

NDDS将调用插件get_receive_interfaces_cEA()提供的函数来获取插件表示(使用)的接口列表。 在以下关于使用传输插件发送和接收的讨论中,当动作预期会影响插件管理的所有接口或仅影响子集时( 发送多个接口并使用多个接口接收 ),将很重要。

猜你喜欢

转载自blog.csdn.net/xinqingwuji/article/details/79931720
今日推荐