Dust DDS هو تطبيق أصلي لـ Rust لخدمات توزيع بيانات OMG (DDS) والناشر المشترك في الوقت الحقيقي (RTPS) الذي طورته S2E Software Systems.
الهدف من هذا الصندوق هو توفير تطبيق Rust عالي الجودة للحد الأدنى من ملف تعريف DDS. بالنسبة للجودة العالية، من المفترض أن يتم التنفيذ باستخدام Rust مستقر وبدون تعليمات برمجية غير آمنة ومع تغطية كود اختبار الوحدة الكبيرة.
DDS هو بروتوكول وسيط ومعيار API مصمم للاتصال المرتكز على البيانات. يهدف DDS في جوهره إلى تسهيل المشاركة السلسة للبيانات ذات الصلة بدقة أينما ومتى تكون هناك حاجة إليها، حتى عبر الناشرين والمشتركين الذين يعملون بشكل غير متزامن في الوقت المناسب. باستخدام DDS، يمكن للتطبيقات تبادل المعلومات من خلال قراءة وكتابة كائنات البيانات المحددة بواسطة الأسماء والمفاتيح المحددة من قبل المستخدم. إحدى ميزاته المميزة هي التحكم القوي الذي يقدمه في معلمات جودة الخدمة (QoS)، بما في ذلك الموثوقية وعرض النطاق الترددي والمواعيد النهائية للتسليم وتخصيص الموارد.
يحدد معيار DDS "كلاً من واجهات التطبيقات (APIs) ودلالات الاتصال (السلوك وجودة الخدمة) التي تمكن من توصيل المعلومات بكفاءة من منتجي المعلومات إلى المستهلك المطابق". تكملة هذا المعيار هي مواصفات 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 واجهة برمجة تطبيقات "متزامنة" و"غير متزامنة" للسماح بدمج DDS في أكبر عدد من التطبيقات بأقصى قدر من الأداء. بشكل عام، يجب أن يكون الخيار الأول هو استخدام واجهة برمجة تطبيقات المزامنة والاستفادة من وظائف DDS المحددة مثل المستمعين للبرامج القائمة على الأحداث.
عند تنفيذ التطبيقات التي تستخدم بالفعل عدم المزامنة، يجب استخدام واجهة برمجة التطبيقات غير المتزامنة. على وجه الخصوص، عند استخدام وقت تشغيل Tokio، سيؤدي استخدام Sync API إلى حالة من الذعر بسبب حظر المكالمات. يمكنك العثور على مثال في مجلد الأمثلة.
إذا كنت تريد التفاعل مع بيانات DDS الخاصة بك باستخدام REST API، فيمكنك استخدام برنامج Nebula DDS WebLink الخاص بنا. يوفر Nebula DDS WebLink خادمًا يطبق معيار DDS v1.0 الذي يدعم الويب لمجموعة إدارة الكائنات (OMG).
عادةً ما يتم اختبار إمكانية التشغيل التفاعلي لـ DDS باستخدام العرض التوضيحي للأشكال. يتوفر العرض التوضيحي لأشكال Dust DDS في مستودعنا ويمكن بدء تشغيله عن طريق تشغيل cargo run --package dust_dds_shapes_demo
من المجلد الجذر.
لا يتبع Dust DDS جدول إصدار ثابت ولكننا سنصدر إصدارات عند تنفيذ الميزات الجديدة.
تم ترخيص هذا المشروع بموجب ترخيص Apache الإصدار 2.0.