Dust DDS เป็นการใช้งาน Rust แบบเนทีฟของ OMG Data Distribution Services (DDS) และผู้เผยแพร่แบบเรียลไทม์ (RTPS) ที่พัฒนาโดย S2E Software Systems
เป้าหมายของลังนี้คือเพื่อให้การใช้งาน Rust คุณภาพสูงตามโปรไฟล์ DDS ขั้นต่ำ สำหรับคุณภาพสูง หมายความว่าการใช้งานเสร็จสิ้นโดยใช้ Rust ที่เสถียร และไม่มีโค้ดที่ไม่ปลอดภัย และมีการครอบคลุมโค้ดทดสอบหน่วยขนาดใหญ่
DDS คือโปรโตคอลมิดเดิลแวร์และมาตรฐาน API ที่ออกแบบมาเพื่อการเชื่อมต่อที่เน้นข้อมูลเป็นศูนย์กลาง โดยหัวใจหลัก DDS มุ่งหวังที่จะอำนวยความสะดวกในการแบ่งปันข้อมูลที่เกี่ยวข้องอย่างราบรื่นแม่นยำทุกที่และทุกเวลาที่จำเป็น แม้แต่กับผู้เผยแพร่และสมาชิกที่ทำงานไม่พร้อมกันในเวลาก็ตาม ด้วย DDS แอปพลิเคชันสามารถแลกเปลี่ยนข้อมูลผ่านการอ่านและการเขียนออบเจ็กต์ข้อมูลที่ระบุโดยชื่อ (หัวข้อ) และคีย์ที่ผู้ใช้กำหนด หนึ่งในคุณสมบัติที่กำหนดคือการควบคุมที่แข็งแกร่งซึ่งนำเสนอผ่านพารามิเตอร์คุณภาพการบริการ (QoS) ซึ่งครอบคลุมความน่าเชื่อถือ แบนด์วิดท์ กำหนดเวลาการส่งมอบ และการจัดสรรทรัพยากร
มาตรฐาน DDS "กำหนดทั้ง Application Interfaces (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 ,
}
หากใช้ภาษาการเขียนโปรแกรมหรือผู้จำหน่ายที่แตกต่างกัน สามารถสร้างประเภท DDS จากไฟล์ OMG IDL โดยใช้ลัง dust_dds_gen
Dust DDS มีทั้ง API "ซิงค์" และ "async" เพื่อให้สามารถรวม DDS เข้ากับแอปพลิเคชันจำนวนมากที่สุดและมีประสิทธิภาพสูงสุด โดยทั่วไป ตัวเลือกแรกควรใช้ API การซิงค์และใช้ประโยชน์จากฟังก์ชันการทำงานที่ระบุของ DDS เช่น Listener สำหรับโปรแกรมตามเหตุการณ์
เมื่อใช้งานแอปพลิเคชันที่ใช้ async อยู่แล้ว จะต้องใช้ async API โดยเฉพาะอย่างยิ่ง เมื่อใช้รันไทม์ของ Tokio การใช้ Sync API จะส่งผลให้เกิดความตื่นตระหนกเนื่องจากการบล็อกการโทร คุณสามารถดูตัวอย่างได้ในโฟลเดอร์ตัวอย่าง
หากคุณต้องการโต้ตอบกับข้อมูล DDS ของคุณโดยใช้ REST API คุณสามารถใช้ซอฟต์แวร์ Nebula DDS WebLink ของเราได้ Nebula DDS WebLink จัดเตรียมเซิร์ฟเวอร์ที่ใช้มาตรฐาน Object Management Group (OMG) Web-Enabled DDS v1.0
โดยทั่วไปแล้วการทำงานร่วมกันของ DDS จะได้รับการทดสอบโดยใช้การสาธิตรูปร่าง การสาธิต Dust DDS Shapes มีอยู่ในพื้นที่เก็บข้อมูลของเรา และสามารถเริ่มต้นได้ด้วยการเรียกใช้ cargo run --package dust_dds_shapes_demo
จากโฟลเดอร์รูท
Dust DDS ไม่เป็นไปตามกำหนดการเผยแพร่ที่ตายตัว แต่เราจะเปิดตัวเมื่อมีการนำฟีเจอร์ใหม่ๆ มาใช้
โครงการนี้ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2.0