Dust DDS adalah implementasi Rust asli dari OMG Data Distribution Services (DDS) dan Real-time Publisher-Subscriber (RTPS) yang dikembangkan oleh S2E Software Systems.
Tujuan dari peti ini adalah untuk menyediakan implementasi Rust berkualitas tinggi dari profil DDS minimum. Untuk kualitas tinggi maksudnya implementasi dilakukan dengan menggunakan Rust yang stabil dan tanpa kode yang tidak aman serta dengan cakupan kode pengujian unit yang besar.
DDS adalah protokol middleware dan standar API yang dirancang untuk konektivitas data-sentris. Pada intinya, DDS bertujuan untuk memfasilitasi pembagian data terkait secara tepat di mana dan kapan diperlukan, bahkan antar penerbit dan pelanggan yang beroperasi secara asinkron dalam waktu. Dengan DDS, aplikasi dapat bertukar informasi melalui pembacaan dan penulisan objek data yang diidentifikasi dengan nama (Topik) dan kunci yang ditentukan pengguna. Salah satu fitur utamanya adalah kontrol kuat yang ditawarkan terhadap parameter Kualitas Layanan (QoS), yang mencakup keandalan, bandwidth, tenggat waktu pengiriman, dan alokasi sumber daya.
Standar DDS "mendefinisikan Antarmuka Aplikasi (API) dan Semantik Komunikasi (perilaku dan kualitas layanan) yang memungkinkan penyampaian informasi secara efisien dari produsen informasi ke konsumen yang cocok". Melengkapi standar ini adalah spesifikasi DDSI-RTPS, yang mendefinisikan protokol kabel interoperabilitas untuk DDS. Tujuan utamanya adalah untuk memastikan bahwa aplikasi berdasarkan implementasi DDS dari vendor yang berbeda dapat saling beroperasi. Penerapan Dust DDS terutama berpusat pada standar DDS dan DDSI-RTPS.
Contoh dasar tentang cara menggunakan Dust DDS. Sisi penerbit dapat diimplementasikan sebagai:
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 ( ) ;
Sisi pelanggan dapat diimplementasikan sebagai:
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 ( ) ) ;
}
Jika hanya menggunakan Rust, Anda dapat menggunakan makro prosedural untuk mengaktifkan tipe yang akan ditransmisikan menggunakan DustDDS. Bidang kunci juga dapat didefinisikan sebagai bagian dari makro.
use dust_dds :: topic_definition :: type_support :: DdsType ;
# [ derive ( DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
Jika menggunakan bahasa pemrograman atau vendor yang berbeda, tipe DDS dapat dihasilkan dari file OMG IDL menggunakan peti dust_dds_gen.
Dust DDS menyediakan API "sinkronisasi" dan "asinkron" untuk memungkinkan pengintegrasian DDS dalam jumlah terbesar aplikasi dengan kinerja maksimum. Secara umum, opsi pertama adalah menggunakan API sinkronisasi dan memanfaatkan fungsionalitas yang ditentukan DDS seperti pendengar untuk program berbasis peristiwa.
Saat mengimplementasikan aplikasi yang sudah menggunakan async, maka async API harus digunakan. Khususnya, saat menggunakan runtime Tokio, penggunaan Sync API akan mengakibatkan kepanikan karena pemblokiran panggilan. Anda dapat melihat contohnya di folder contoh.
Jika Anda ingin berinteraksi dengan data DDS Anda menggunakan REST API, Anda dapat menggunakan perangkat lunak Nebula DDS WebLink kami. Nebula DDS WebLink menyediakan server yang mengimplementasikan standar DDS v1.0 yang Diaktifkan Web Object Management Group (OMG).
Interoperabilitas DDS biasanya diuji menggunakan demo bentuk. Demo Bentuk DDS Debu tersedia di repositori kami dan dapat dimulai dengan menjalankan cargo run --package dust_dds_shapes_demo
dari folder root.
Dust DDS tidak mengikuti jadwal rilis tetap tetapi kami akan merilisnya seiring penerapan fitur baru.
Proyek ini dilisensikan di bawah Lisensi Apache Versi 2.0.