15个版本 (9个破坏性更新)
0.10.1 | 2024年7月4日 |
---|---|
0.9.0 | 2024年6月7日 |
0.8.2 | 2024年3月27日 |
0.6.0 | 2023年12月7日 |
0.1.0 | 2022年11月21日 |
#3 in #udp
每月145次下载
用于 rtps-parser
1.5MB
27K SLoC
Dust DDS
Dust DDS是OMG(对象管理组)数据分发服务(DDS)和实时发布-订阅(RTPS)的本地Rust实现,由S2E软件系统开发。
此包的目标是提供一个高质量的DDS最小配置的Rust实现。这里的“高质量”意味着实现使用稳定的Rust进行,不使用不安全代码,并具有大范围的单元测试覆盖率。
DDS简介
DDS是一个面向数据连接性的中间件协议和API标准。在其核心,DDS旨在促进相关数据的无缝共享,无论是在需要时还是在需要的地方,即使是在异步操作的时间跨域的发布者和订阅者之间。通过DDS,应用程序可以通过读写用户定义名称(主题)和键的数据对象来交换信息。其一个显著特征是它对服务质量(QoS)参数的强大控制,包括可靠性、带宽、交付截止日期和资源分配。
DDS标准 "定义了应用程序接口(API)和通信语义(行为和服务质量),以实现从信息生产者到匹配消费者的有效信息传递"。补充此标准的是DDSI-RTPS规范,它定义了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,
}
fn main() {
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,
}
fn main() {
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());
}
}
IDL类型生成
如果只使用 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 类型。
同步和异步库 API
Dust DDS 提供了同步和异步 API,以允许将 DDS 集成到最大数量的应用程序中,并实现最佳性能。通常,首选的选项是使用同步 API 并利用 DDS 规范的功能,例如事件驱动程序的事件监听器。
当实现已使用异步的应用程序时,必须使用异步 API。特别是,当使用 Tokio 运行时,使用同步 API 将导致阻塞调用而引发 panic。您可以在示例文件夹中找到一个示例。
DDS REST API
如果您想使用 REST API 与您的 DDS 数据交互,可以使用我们的 Nebula DDS WebLink 软件。Nebula DDS WebLink 提供了一个实现对象管理组 (OMG) Web-Enabled DDS v1.0 标准的服务器。
形状演示
通常使用形状演示来测试 DDS 互操作性。Dust DDS 形状演示可在我们的仓库中找到,可以通过在根目录中运行 cargo run --package dust_dds_shapes_demo
来启动。
发布计划
Dust DDS 不遵循固定的发布计划,但将在实现新功能时发布。
许可证
本项目采用 Apache 许可证 2.0 版本授权。
依赖关系
~4–13MB
~134K SLoC