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 獲得許可。