Dust DDS 是 S2E Software Systems 开发的 OMG 数据分发服务 (DDS) 和实时发布者-订阅者 (RTPS) 的原生 Rust 实现。
该包的目标是提供最小 DDS 配置文件的高质量 Rust 实现。对于高质量来说,这意味着实现是使用稳定的 Rust 完成的,没有不安全的代码,并且具有大量的单元测试代码覆盖率。
DDS 是一种中间件协议和 API 标准,专为以数据为中心的连接而设计。 DDS 的核心目标是在需要的时间和地点精确地促进相关数据的无缝共享,甚至在异步操作的发布者和订阅者之间也是如此。借助 DDS,应用程序可以通过读写由用户定义的名称(主题)和键标识的数据对象来交换信息。其定义功能之一是对服务质量 (QoS) 参数提供强大的控制,包括可靠性、带宽、交付期限和资源分配。
DDS 标准“定义了应用程序接口 (API) 和通信语义(行为和服务质量),使信息能够有效地从信息生产者传递到匹配的消费者”。 DDSI-RTPS 规范是对该标准的补充,它定义了 DDS 的互操作性有线协议。其主要目标是确保基于不同供应商的 DDS 实现的应用程序可以互操作。 Dust DDS 的实施主要围绕 DDS 和 DDSI-RTPS 标准。
有关如何使用 Dust DDS 的基本示例。发布者端可以实现为:
use dust_dds :: {
domain :: domain_participant_factory :: DomainParticipantFactory ,
infrastructure :: { qos :: QosKind , status :: NO_STATUS } ,
topic_definition :: type_support :: DdsType ,
} ;
# [ derive ( DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
let domain_id = 0 ;
let participant_factory = DomainParticipantFactory :: get_instance ( ) ;
let participant = participant_factory
. create_participant ( domain_id , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let topic = participant
. create_topic :: < HelloWorldType > ( "HelloWorld" , "HelloWorldType" , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let publisher = participant
. create_publisher ( QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let writer = publisher
. create_datawriter :: < HelloWorldType > ( & topic , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let hello_world = HelloWorldType {
id : 8 ,
msg : "Hello world!" . to_string ( ) ,
} ;
writer . write ( & hello_world , None ) . unwrap ( ) ;
订阅者端可以实现为:
use dust_dds :: {
domain :: domain_participant_factory :: DomainParticipantFactory ,
infrastructure :: { qos :: QosKind , status :: NO_STATUS } ,
subscription :: sample_info :: { ANY_INSTANCE_STATE , ANY_SAMPLE_STATE , ANY_VIEW_STATE } ,
topic_definition :: type_support :: DdsType ,
} ;
# [ derive ( Debug , DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
let domain_id = 0 ;
let participant_factory = DomainParticipantFactory :: get_instance ( ) ;
let participant = participant_factory
. create_participant ( domain_id , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let topic = participant
. create_topic :: < HelloWorldType > ( "HelloWorld" , "HelloWorldType" , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let subscriber = participant
. create_subscriber ( QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let reader = subscriber
. create_datareader :: < HelloWorldType > ( & topic , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let samples = reader
. read ( 1 , ANY_SAMPLE_STATE , ANY_VIEW_STATE , ANY_INSTANCE_STATE ) ;
if let Ok ( hello_world_samples ) = samples {
println ! ( "Received: {:?}" , hello_world_samples [ 0 ] . data ( ) . unwrap ( ) ) ;
}
如果仅使用 Rust,您可以利用过程宏来启用使用 DustDDS 传输的类型。关键字段也可以定义为宏的一部分。
use dust_dds :: topic_definition :: type_support :: DdsType ;
# [ derive ( DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
如果使用不同的编程语言或供应商,则可以使用dust_dds_gen crate从OMG IDL文件生成DDS类型。
Dust DDS 提供“同步”和“异步”API,允许将 DDS 集成到最大数量的应用程序中并具有最高性能。一般来说,第一个选项应该是使用同步 API 并利用 DDS 指定的功能,例如基于事件的程序的侦听器。
当实现已经使用异步的应用程序时,必须使用异步 API。特别是,当使用 Tokio 运行时时,使用 Sync API 将因阻塞调用而导致恐慌。您可以在示例文件夹中找到示例。
如果您想使用 REST API 与 DDS 数据进行交互,您可以使用我们的 Nebula DDS WebLink 软件。 Nebula DDS WebLink 提供了一个实现对象管理组 (OMG) Web-Enabled DDS v1.0 标准的服务器。
DDS 互操作性通常使用形状演示进行测试。 Dust DDS Shapes 演示可在我们的存储库中找到,并且可以通过从根文件夹运行cargo run --package dust_dds_shapes_demo
来启动。
Dust DDS 不遵循固定的发布时间表,但我们将在新功能实现时发布版本。
该项目根据 Apache License Version 2.0 获得许可。