Angelo Corsaro, Ph.D. Chief Technology Officer PrismTech OMG DDS SIG Co-Chair [email protected] OpenSplice DDS OpenSplice DDS OpenSplice DDS OpenSplice DDS OpenSplice DDS Getting Started with DDS For C++ and Java Programmers 1
Apr 30, 2015
Angelo Corsaro, Ph.D.Chief Technology OfficerPrismTechOMG DDS SIG [email protected]
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Getting Started with DDS For C++ and Java Programmers
1
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./background-info
2
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
The OMG DDS
The OMG DDS Standard‣ Introduced in 2004 to address the Data
distribution challenges typical of Defense and Aerospace Mission Critical Applications
‣ Key requirements for the standard were high performance and scalability from embedded to ultra-large-scale deployments
‣ Today recommended by key administrations worldwide and widely adopted well beyond Aerospace and Defense in domains, such as, Automated Trading, Simulations, SCADA, Telemetry, etc.
3
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS RecommendationsIncreasingly Mandated/Recommended by Administrations
‣ US Navy: Open Architecture
‣ DISR/DISA: Net-centric Systems
‣ EuroControl: Air Traffic Control Center Operational Interoperability
‣ QinetiQ & MILVA: Recommending DDS for Vehicles Electronic Architecture
A Great Time for DDS!
! The infrastructure evolution cycle is churning…– New -> Emerging -> Standard -> Commodity
– Middleware is emerging as OS declines
! …DDS is maturing…– OMG focus
– Wire spec
– Tools
– Enterprise integration
– Multiple products fielded
– Deployed applications!
! …and adoption is on the rise– Navy
– DISR
– FCS/SoSCOE
– Many significant applications 4
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
The OMG Data Distribution Service
DDS v1.2 API Standard
‣ Language Independent, OS and HW architecture independent
‣ DCPS. Standard API for Data-Centric, Topic-Based, Real-Time Publish/Subscribe
‣ DLRL. Standard API for creating Object Views out of collection of Topics
Object/Relational Mapping
Ownership DurabilityContent
Subscription
Minimum Profile
Data Centric Publish/Subscribe (DCPS)
Data Local Reconstruction Layer (DLRL)
DDS Interoperability Wire Protocol
Application
UDP/IP
Real-Time Publish/Subscribe Protocol
5
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
The OMG Data Distribution Service
DDS v1.2 API Standard
‣ Language Independent, OS and HW architecture independent
‣ DCPS. Standard API for Data-Centric, Topic-Based, Real-Time Publish/Subscribe
‣ DLRL. Standard API for creating Object Views out of collection of Topics
Object/Relational Mapping
Ownership DurabilityContent
Subscription
Minimum Profile
Data Centric Publish/Subscribe (DCPS)
Data Local Reconstruction Layer (DLRL)
DDS Interoperability Wire Protocol
Application
UDP/IP
Real-Time Publish/Subscribe Protocol
5
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
The OMG Data Distribution Service
DDS-RTPS v2.1 Wire Protocol Standard
‣ Standard wire protocol allowing interoperability between different implementations of the DDS standard
‣ Interoperability demonstrated among key DDS vendors in March 2009
Object/Relational Mapping
Ownership DurabilityContent
Subscription
Minimum Profile
Data Centric Publish/Subscribe (DCPS)
Data Local Reconstruction Layer (DLRL)
DDS Interoperability Wire Protocol
Application
UDP/IP
Real-Time Publish/Subscribe Protocol
6
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./dds-foundations
7
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
What is Data Distribution?‣ Data distribution is about
making application defined data available where needed and when needed
‣ Data is a first class concept, it can be created, updated, read and eventually disposed
‣ The last value (or last N-values) of a Data is available
VehicleSpeedVehicleSpeedVehicleSpeed
plate
“A123”
“B456”
“C789”
dx dy
50 0
0 45
10 30
VehiclePositionVehiclePositionVehiclePosition
plate
“A123”
“B456”
“C789”
x y
101 202
303 404
505 606
[1/2]
TrakCo.VehiclePosition
struct VehiclePosition { string plate; long x, y; }
TrakCo.VehicleSpeed
struct VehicleSpeed { string plate; long dx, dy; }
Brokers
8
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
What is Data Distribution?
‣ Producer, Consumers as well as Topics are dynamically discovered
‣ A rich set of QoS is used to control the non-functional properties of data (e.g. durability, availability, etc.)
[2/2]
TrakCo.VehiclePosition
struct VehiclePosition { string plate; long x, y; }
TrakCo.VehicleSpeed
struct VehicleSpeed { string plate; long dx, dy; }
VehicleSpeedVehicleSpeedVehicleSpeed
plate
“A123”
“B456”
“C789”
dx dy
50 0
0 45
10 30
VehiclePositionVehiclePositionVehiclePosition
plate
“A123”
“B456”
“C789”
x y
101 202
303 404
505 606
Brokers
9
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./dds-topics
10
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data in DDS
‣ The definition of Data in DDS is tied to the definition of a Topic
‣ A Topic is the association between: ‣ Unique Name‣ Type‣ QoS
‣ A Topic can have associated a key in order to express data instances identities
VehiclePosition
TrackCo.VehiclePosition
{ Reliability Deadline, Priority Transient, ...}
TopicType QoS
Name
[1/2]
Topics
11
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data in DDS
‣ A Topic key can be made of an arbitrary number of Topic Type attributes
‣ Each unique key value identify a Topic Instance
‣ Topic Instance, can be Created, Read, Updated, and Disposed (CRUD)
[2/2]
VehiclePositionVehiclePositionVehiclePosition
plate
“A123”
“B456”
“C789”
x y
101 202
303 202
101 606
TrakCo.VehiclePositionTopic
Topic Type
Topic Instances
Topic Key
Topic Instances
12
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./qos
13
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS QoS Model
Publisher
DataWriter
Topic
Type
QoS
Name
writes
QoS
DataWriter
Topic
Typewrites
Subscriber
DataReaderreads
DataReaderreads
...
QoS
Name
QoS
QoS QoS
QoS matching
......
QoS QoS
Type Matching
DomainParticipant DomainParticipant
QoS QoS
‣ QoS-Policies provide control over local and end-to-end properties of DDS entities
‣ Local properties controlled by QoS are related resource usage
‣ End-to-end properties controlled by QoS are related to temporal and spatial aspects of data distribution
‣ Some QoS-Policies are matched based on a Request vs. Offered Model thus QoS-enforcement
14
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
QoS Policy Applicability
RxO Modifiable
DURABILITY
DURABILITY SERVICE
LIFESPAN
HISTORY
PRESENTATION
RELIABILITY
PARTITION
DESTINATION ORDER
OWNERSHIP
OWNERSHIP STRENGTH
DEADLINE
LATENCY BUDGET
TRANSPORT PRIORITY
T, DR, DW Y N
Data Availability
T, DW N NData Availability
T, DW N/A Y
Data Availability
T, DR, DW N N
Data Availability
P, S Y N
Data Delivery
T, DR, DW Y N
Data Delivery
P, S N YData DeliveryT, DR, DW Y NData Delivery
T, DR, DW Y N
Data Delivery
DW N/A Y
Data Delivery
T, DR, DW Y Y
Data Timeliness
T, DR, DW Y YData Timeliness
T, DW N/A Y
Data Timeliness
TIME BASED FILTER
RESOURCE LIMITS
ENTITY FACTORY
USER DATA
TOPIC DATA
GROUP DATA
LIVELINESS
WRITER DATA LIFECYCLE
READER DATA LIFECYCLE
DR N/A Y
ResourcesT, DR, DW N N
Resources
Configuration
DP, DR, DW N Y ConfigurationT N YConfiguration
P, S N Y
Configuration
T, DR, DW Y N
Configuration
DW N/A Y
LifecycleDR N/A Y
Lifecycle
QoS Policy Applicability RxO Modifiable
QoS Policies
15
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./dds-in-action
16
Brokers
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
17
Brokers
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
17
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehiclePositionVehiclePositionVehiclePosition
plate x y
18
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202
“A123” 101 202
“A123” 101 202
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehiclePositionVehiclePositionVehiclePosition
plate x y
18
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202
“A123” 101 202
“A123” 101 202
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehiclePositionVehiclePositionVehiclePosition
plate x y
“B456” 303 404
“B456” 303 404
“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
18
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202“A123” 101 202VehiclePositionVehiclePositionVehiclePosition
plate x y“B456” 303 404“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
19
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202“A123” 101 202VehiclePositionVehiclePositionVehiclePosition
plate x y“B456” 303 404“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
“C789” 505 606
“C789” 505 606
“C789” 505 606
“A123” 101 202
“B456” 303 404
19
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202“A123” 101 202VehiclePositionVehiclePositionVehiclePosition
plate x y“B456” 303 404“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
“C789” 505 606“C789” 505 606
“A123” 101 202
“B456” 303 404
“C789” 505 606
“C789” 505 606
20
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202“A123” 101 202VehiclePositionVehiclePositionVehiclePosition
plate x y“B456” 303 404“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
“C789” 505 606“C789” 505 606
“A123” 101 202
“B456” 303 404
“C789” 505 606
“C789” 505 606
“A123” 50 0
20
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202“A123” 101 202VehiclePositionVehiclePositionVehiclePosition
plate x y“B456” 303 404“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
“C789” 505 606“C789” 505 606
“A123” 101 202
“B456” 303 404
“C789” 505 606
“C789” 505 606
“A123” 50 0
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
21
VehiclePositionVehiclePositionVehiclePosition
plate x y
“A123” 101 202
“B456” 303 404
Brokers
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
VehiclePositionVehiclePositionVehiclePosition
plate x y
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Data Distribution in Action
VehiclePositionVehiclePositionVehiclePosition
plate x y
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
“A123” 101 202“A123” 101 202VehiclePositionVehiclePositionVehiclePosition
plate x y“B456” 303 404“B456” 303 404
VehiclePositionVehiclePositionVehiclePosition
plate x y
“C789” 505 606“C789” 505 606
“A123” 101 202
“B456” 303 404
“C789” 505 606
“C789” 505 606
“A123” 50 0
“A123” 50 0
VehicleSpeedVehicleSpeedVehicleSpeed
plate dx dy
21
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./cxx-java-psm
22
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS PIM/PSM Approach
‣ The DDS standard is composed by a PIM specified in UML and A PSM specified in IDL
‣ Language specific APIs are derived via IDL-based mappings (e.g. IDL2C++, etc.)
PIM (UML)
PSM (IDL)
C JavaC++
IDL2CIDL2C++ IDL2Java
23
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
What is the problem?
‣ IDL is very good for describing DDS Topic Types, yet...
‣ IDL’s biggest strength, namely (programming) language independence, becomes its biggest weakness when trying to define APIs that are well integrated with a programming language
‣ For some programming languages (e.g. C++) the IDL2C++ mapping is “seasoned”
24
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Why is this a problem?
‣ Resulting DDS APIs are more complicated than they should
‣ API don’t feel natural or ergonomic to programmers
‣ API (esp. for C++) don’t integrate well with standard libraries nor implements common idioms/patterns.
25
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Native C++/Java PSMs‣ The new C++/Java PSM are derived
starting directly from the PIM
‣ The new C++/Java PSM take advantage of all the features available in C++/Java to provide a natural, productive, efficient, safe and portable API
PIM (UML)
ISO C++ PSM
The new PSM simplify DDS programming w/o limiting the expensiveness or introducing limitations in what possible
Java 5 PSM
26
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
ISO C++ PSM in a Nutshell‣ Provides transparent, safe, precise and real-time automatic
memory management
‣ Takes advantage of C++ Template Meta-programming to automate tasks such as type registration and provide a strongly typed API (no downcast ever!)
‣ Provides a DDS API that exploits Iterators and containers as well as other C++ Standard Types
‣ API is extensible, efficient and portable
27
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Java 5 PSM in a Nutshell
‣ Takes advantage of Java Generics to simplify the API and facilitate tasks such as type registration
‣ Provides a DDS API that exploits Iterators and containers
‣ API is extensible, efficient and portable
28
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Anatomy of a DDS Application
‣ Tree-like dependency between DP->(P,S)->(DR, DW) in creation and life-cycle management
‣ Example: DW alive requires the parent P to be alive
‣ This tree-like dependency allows precise GC of DDS Entities via reference counting
DomainParticipant
Publisher Subscriber
DataWriter DataReader
Topic
Partition
Domain
DP: DomainParticipant DR: DataReaderP: Publisher DW: DataWriterS: Subscribe
29
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model1
30
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
1
2
31
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
3. Create Topic
1
2
3
32
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
3. Create Topic
4. Create DataWriter
1
2
3
4
33
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
3. Create Topic
4. Create DataWriter
5. Create DataReader
1
2
3
4
4
34
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model1
35
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./cxx
36
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Topics in C++
‣ Topic are associated to a C++ template class parametrized in the topic type, e.g. Topic<VehiclePosition>, Topic<VehicleSpeed>
‣ Topic types can be described in IDL, XML, UML, and Java
‣ Topic types are mapped to C++ classes having one set of accessors per Topic attribute
37
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Types Mapping
‣ DDS primitive types are mapped to C99/C++ standard types
‣ DDS container types are mapped to standard C++ containers, namely std::vector and std::map
38
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Topic Type Mapping
struct VehiclePosition {! string plate;! long x;! long y;};#pragma keylist VehiclePosition plate
IDL Topic Type Definition
class VehiclePosition {
! VehiclePosition();! VehiclePosition(const std::string& plate,! ! ! int32_t x, int32_t y);
! virtual ~VehiclePosition();
! const std::string& plate() const;! void plate(const std::string& s);
! const int32_t x() const;! void x(int32_t i);
! const int32_t y() const;! void y(int32_t i);
private:! // Encapsulated state representation};
C++ Topic Type Mapping
39
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./java
40
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Topics in Java‣ Topic are associated to a Java Generic class parametrized in
the topic type, e.g. Topic<VehiclePosition>, Topic<VehicleSpeed>
‣ Topic types can be described in IDL, XML, UML, and Java
‣ Topic types are mapped to Java classes having one set of accessors per Topic attribute
‣ Properly annotated, user provided Java classes, can be used as topic types w/o the need of code generation
41
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Types Mapping
‣ DDS primitive types are mapped to Java primitive types
‣ DDS container types are mapped to standard Java containers
DDS Type Java Type
Boolean boolean
Char8 char
Char32 int
Byte byte
Int16 short
UInt16 short
Int32 int
Uint32 int
Int64 long
Uint64 long
Float64 double
Float32 float
string<Char8> String
string<Char32> String
sequence<T> Collection
map<K,T> java.util.Map
T[] T[]
42
Java Topic Type Mapping
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Topic Type Mappingclass VehiclePosition {
public VehiclePosition() { /* impl */ } public VehiclePosition(String plate, ! ! ! int x, int y) { /* impl */}
String getPlate() { /* impl */ } void setPlate(String plate) { /* impl */ }
int getX() { /* impl */ } void setX(int x) { /* impl */ }
int getY() { /* impl */ } void setY(int y) { /* impl */ } // Private state implementation }
struct VehiclePosition {! string plate;! long x;! long y;};#pragma keylist VehiclePosition plate
IDL Topic Type Definition
43
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Java Topic Type Definitionclass VehiclePosition { @key private string plate; private int x; private int y;
public VehiclePosition() { } public VehiclePosition(String plate, ! ! ! int x, int y) {
this.plate = plate;! this.x = x;! this.y = y;
}
String getPlate() { return this.plate; } void setPlate(String plate) {
this.plate = plate; }
int getX() { return this.x; } void setX(int x) { this.x = x; }
int getY() { return this.y; } void setY(int y) { this.y = y; } }
44
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
1
2
45
Domain
‣ A Domain is one instance of the DDS Global Data Space
‣ DDS entities always belong to a specific domain
Partition
‣ A partition is a scoping mechanism provided by DDS organize a partition
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DomainId = 0
VechicleTelemetry
Domain and Partitions
46
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./cxx
47
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Joining Domain/Partition
Note:
‣ Reference types are always created via factory methods on the parent entity
‣ Policies can be “streamed” into QoS objects
// Create Domain Participant in the Domain “0”DomainId id = 0;DomainParticipant dp =
TheParticipantFactory().create_participant(id);
// Set the Publisher QoS with the proper partitionpub::qos::PublisherQos pqos;pqos << policy::Partition("VehicleTelemetry");
// Create the Publisherpub::Publisher pub =
dp.create_publisher(pqos);
using namespace dds::core;using namespace dds;using namespace dds::domain;
48
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./java
49
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Joining Domain/Partition
Note:
‣ The Boostrap class allows to run multiple DDS instances, even from different vendors on the same application
// Create Domain Participant in the Domain “0”DomainId id = 0;DomainParticipantFactory factory =! ! DomainParticipantFactory.getInstance(Bootstrap.createInstance());
DomainParticipant dp = factory.createParticipant(id);
// Create the Publisherpub::Publisher pub =
dp.create_publisher(pqos);
import org.omg.dds.core.Bootstrap;import org.omg.dds.domain.DomainParticipant;import org.omg.dds.domain.DomainParticipantFactory;
50
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
3. Create Topic
1
2
3
51
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./cxx
52
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Topic CreationNote:
‣ QoS setting is optional and only required to override defaults
‣ QoS override shown to highlight how effective is the new QoS API
// Create and set TopicQos (if different from // default) topic::qos::TopicQos tqos;tqos << policy::Reliability::Reliable() << policy::Durability::Transient() << policy::History::KeepLast(10) << policy::TransportPriority(14);
// Create the Topic with specific Qostopic::Topic<VehiclePosition> topic = dp.create_topic<VehiclePosition>("VPosTopic", tqos);
using namespace dds;
// Create the Topic with default Qostopic::Topic<VehiclePosition> topic = dp.create_topic<VehiclePosition>("VPosTopic");
53
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./java
54
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Topic Creation
Note:
‣ The TopicType class is passed to work-around Java Generics type-erasure
import org.omg.dds.topic.Topic;
// Create the Topic with default QosTopic<VehiclePosition> topic = dp.createTopic("VPosTopic", VehiclePosition.class);
55
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
3. Create Topic
4. Create DataWriter
1
2
3
4
56
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./cxx
57
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Writing DataNote:
‣ The DataWriter is parametrized on the Topic Type
‣ The stream operator can be used to write sample as well as override Qos, policies and to do coherent updates
// Create and set DataWriterQos from TopicQospub::qos::DataWriterQos dwqos(tqos);
// Create DataWriterpub::DataWriter<VehiclePosition> dw =
pub.create_datawriter(topic, dwqos);
// Create SampleVehiclePosition vpos("A123", 100, 200);
// Writedw.write(vpos);
// Stream-like Writedw << vpos;
// Stream-like Write + Policy overridedw << policy::TransportPriority(55) << vpos;
using namespace dds::core;using namespace dds;
58
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./java
59
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Writing Data
Note:
‣ No need to pass the class type since it is maintained by the Topic
import org.omg.dds.pub.DataWriter;
// Create the Topic with default QosDataWriter<VehiclePosition> dw = pub.createDataWriter(topic);
// Create SampleVehiclePosition vp = new VehiclePosition("A123", 100, 200);
// Write Sampledw.write(vp);
60
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
DDS App Steps
1. Define the Information Model
2. Connect to proper Domain/Partition
3. Create Topic
4. Create DataWriter
5. Create DataReader
1
2
3
4
4
61
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./cxx
62
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Reading DataNote:
‣ The read API is heavily based on iterators
‣ The stream operator can also be used read samples and a mutator is used to control the read/take behaviour
‣ Back-inserting iterators and zero-copy API also supported
// (1) Create and set DataReaderQos from TopicQossub::qos::DataReaderQos drqos(tqos);
// (2) Create DataReadersub::DataReader<VehiclePosition> dr =
sub.create_datareader(topic, drqos);
// (3) Read with using Forward Iterators on std::vectorstd::vector<VehiclePosition> data(N);std::vector<SampleInfo> info(N);dr.read(data.begin(), info.begin(), N);
// (3) Read with using Forward Iterators on arraysVehiclePosition adata[N];SampleInfo ainfo[N];dr.read(&adata[0], &ainfo[0], N);
using namespace dds::core;using namespace dds;
63
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./java
64
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Reading Data
Note:
‣ No need to pass the class type since it is maintained by the Topic
import org.omg.dds.pub.DataReader;
// Create the Topic with default QosDataReader <VehiclePosition> dr = sub.createDataReader(topic);
List<Sample<VehiclePosition>> data = new Vector<Sample<VehiclePosition>>();
dr.read(data);
65
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Putting all togetherint main(int, char**) { // -- Create Domain Participant DomainParticipant dp = ! ! TheParticipantFactory().create_participant();
// -- Create Publisher pub::Publisher pub = dp.create_publisher();
// -- Create Topic dds::topic::Topic<VehiclePosition> topic = ! ! dp.create_topic<VehiclePosition>("VSPosTopic");
// -- Create DataWriter pub::DataWriter<VehiclePosition> dw =! ! ! pub.create_datawriter(topic);
// -- Write Sample dw << VehiclePosition("A123", 100, 200);}
‣ Writing a DDS can take as 5 lines of code
‣ Default domain‣ Default Qos
66
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./summ-up
67
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
Concluding Remarks
‣ DDS provide a powerful abstraction for building high available, scalable and high performance distributed systems
‣ The new C++ and Java API make DDS very simple to use while improving safety, performances and portability
‣ These new API are now finalized and planned for adoption during the December 2010 OMG meeting
68
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
./references
69
Ope
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
SOpe
nSpl
ice
DD
S
References‣ Working incubator from which most of
the ISO C++ PSM was derived
‣ Available at:
‣ http://code.google.com/p/simd-cxx
The Simple DDS API
SimD
‣ OMG submission for C++/Java PSM are also available as Open Source project at the following URL
‣ http://code.google.com/p/dds-psm-cxx/‣ http://code.google.com/p/datadistrib4j/
70
http://www.opensplice.com/
http://www.opensplice.org/
emailto:[email protected]
http://www.youtube.com/OpenSpliceTube http://opensplice.blogspot.com
http://bit.ly/1Sreg
http://www.slideshare.net/angelo.corsaro
http://twitter.com/acorsaro/
D e l i v e r i n g P e r f o r m a n c e , O p e n n e s s , a n d F r e e d o m
OpenSplice DDSReferences
71