Mobile platforms such as Android/iOS based smart phones, phablets , and tablets are swiftly establishing as the target client platform for a large class of consumer as well as enterprise and mission/business critical applications. OpenSplice Mobile is a pure Java DDS implementation optimized for Android and the JVM that provides effective and efficient DDS connectivity to Android based devices – as well as any JVM enabled device.
OpenSplice Mobile is the first peer-to-peer middleware infrastructure designed for Android that allow seamless interoperability with existing DDS systems and provides a powerful infrastructure for next generation peer-to-peer Android applications.
This presentation introduces OpenSplice Mobile, provides and overview of its architecture and performances and gets you started writing DDS applications for Android!
2. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
What I’ll Cover Today
☐ Learn about OpenSplice Mobile
☐ Understand OpenSplice Mobile Architecture and
Performance
☐ Get started with DDS programming on Android
4. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
DDS Everywhere Platform
☐ A DDS-based, interoperable
product family addressing
systems needs from Embedded
and Mobile to Enterprise and
Cloud
☐ An Open Source core providing
free access to the OpenSplice
Ecosystem, security of supply and
a vibrant, innovative community
OpenSplice
Community
OpenSplice
Cloud
OpenSplice
Embedded
OpenSplice
OpenSplice
Enterprise
5. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Key Highlights
☐ Brings DDS on mobile
devices powered by
Android/iOS
☐ Enables DDS-based
Cloud Messaging for
higher scalability,
throughout and minimal
cost per message
OpenSplice
Community
OpenSplice
Cloud
OpenSplice
Embedded
OpenSplice
OpenSplice
Enterprise
OpenSplice
Mobile
OpenSplice
Gateway
6. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
OpenSplice Mobile
☐ Pure Java version of
OpenSplice targeting the JVM
☐ DDSI Protocol Stack optimized
for mobility and Android OS
☐ Only DDS on the market
designed and Engineered for
Android and the JVM
DCPS Java 5 / Scala API
DDSI
(Optimized for Mobility)
OpenSplice Mobile brings Peer-2-Peer, infrastructure-less communication
to the Android platform
9. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
DDS Compliance
DDS Profiles
☐ Minimum
☐ Ownership
☐ Durability (only Transient Local)
API
☐ Java 5 DDS PSM (i.e. latest Java 5 API for DDS)
DDSI
☐ Full implementation of DDSI v2.1 with support for large data (i.e.
fragmentation)
☐ Interoperability demonstrated with other vendors at the DDS Info Day
in March 2013
11. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
A Staged Event Driven Architecture
☐ OpenSplice Mobile has a Staged Event Driven Architecture (SEDA)
that allows it to be easily configured to trade off between
throughput and latency
12. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
SEDA
☐ Aims at decomposing a complex, event-driven application into a set of stages
connected by queues
☐ Avoids the high overhead associated with thread-based concurrency models,
and decouples event and thread scheduling from application logic.
☐ Through admission control on each event queue, SEDAs can be well-conditioned
to load, preventing resources from being overcommitted when demand
exceeds service capacity
[Matt Welsh, David Culler, and Eric Brewer, SEDA:An Architecture for Well-Conditioned, Scalable Internet Services]
13. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
OpenSplice Mobile Architecture
The OpenSplice Mobile architecture is
organize around three stages
☐ Packet Processing
☐ Message Processing
☐ Data Processing
The channel that connect each stage
can be configured to be active or passive
Packet
Processor
Message
Processor
Data
Processor
Network Packet
DDSI Messages
Cache Changes
14. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Configurability
☐ Channels can be active or passive (and zero-
copy). That means that channels can be
configured with threading resources, or not
☐ Messages posted in a passive channel are
executed in the context of the posting thread
☐ This allows to configure OpenSplice Mobile to
optimize the use case at hand
Processor
Channel
15. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Sample Configurations
Single Thread per Message
Packet
Processor
Message
Processor
Data
Processor
Network Packet
DDSI Messages
Cache Changes
Fully Asynchronous
Packet
Processor
Message
Processor
Data
Processor
Network Packet
DDSI Messages
Cache Changes
16. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Configuration in Practice
☐ OpenSplice Mobile is SEDA architecture as well as all the protocol
parameters can be configured through configuration file or via
command line properties , i.e. providing -D options to the JVM
☐ Configuration parameters are listed on the user manual
☐ Example:
java
-‐server
-‐cp
.:./target/jmobile-‐demo-‐assembly-‐2.0.jar
-‐Ddds.listeners.useTransportThread=true
-‐Dddsi.writers.heartbeatPeriod=0.001
-‐Dddsi.writers.nackResponseDelay=0
-‐Dddsi.readers.heartbeatResponseDelay=0
-‐Dddsi.timer.threadPool.size=1
-‐Dddsi.receiver.threadPool.size=0
-‐Dddsi.dataProcessor.threadPool.size=0
-‐Dddsi.acknackProcessor.threadPool.size=0
-‐Dddsi.writers.reliabilityQueue.size=128
org.opensplice.jmobile.demo.perf.RoundTripDemoReader
$*
17. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Performance
☐ OpenSplice Mobile v1.0
beta features already
very good performance
☐ Latency is low and pretty
stable ~3usec of
difference from 32 to 1024
bytes
19. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Android Fundamentals
☐ Android applications are written in the Java programming
language
☐ Support for native code is available, but this often leads to worse
performance (due to the JNI layer) and worse battery utilization
☐ Thus unless you have very good reasons not to, you are strongly
encouraged to write android applications in Java and to leverage
on Java libraries!
20. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Android Application in a Nutshell
☐ An Android application runs in its own JVM and (by default) on its own
linux process
☐ An application may be composed of the following elements:
☐ Activities: a single screen with a user interface
☐ Services: a component that runs in the background to perform long-running
operations or to perform work for remote processes.
☐ Content Providers: a component that manages shared data for a set of
applications
☐ Broadcast Receivers: a component that responds to system-wide broadcast
announcements
☐ Android allows any applications to start any other application
component and potentially consume the data it produces
21. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Component Activation
☐ Activities, Services and Broadcast Receivers are activated through
an asynchronous message, called Intent
☐ For Activities and Services the intent specifies the action to perform
☐ For Broadcast Receivers it specifies the event being broadcasted,
e.g. battery-low
22. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Application Manifest
☐ The manifest is an XML file containing several important information
about the application
☐ Among, other things, the manifest includes the authorization
necessary for your application -- for instance, it is in this file that you
have to mention that your application requires access to the
network, etc.
23. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Activities Lifecycle
☐ Notice that Activities are also
destroyed each time there is a
screen rotation (unless you
don’t explicitly manage it)
25. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
DDS-based and Android Apps
Considering the Android application lifecycle, we should ask
ourselves a few questions:
☐ When should we create DDS entities and who should hold a
reference to them?
☐ What happens when an application is no more visible?
☐ Can I control when my application exits?
☐ How do I deal with multi-threading?
27. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
DDS Chat for Android
☐ To learn how to write an
Android Application that
uses OpenSplice Mobile
we’ll develop a very
simple Chat
☐ To keep things simple this
chat will have a single
“chat room”
28. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Step 1: Architecture
☐ Our Chat application will have a very simple architecture with a
single just a single Activity that will take care of:
☐ Posting Chat Messages into the ChatRoom
☐ Displaying the Chat Messages Posted in the room since when we joined
☐ In terms of information modeling, we’ll have a single topic
representing the user post
struct ChatMessage {
string user;
string msg;
};
#pragma keylist ChatMessage user
29. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Step 2: Lifecycle Management
☐ Creating DDS entities, such as
DomainParticipants, DataReaders
and DataWriters involves network
communication, such as discovery
information
☐ In addition when an a DDS entity is
destroyed it looses its state
☐ As such, tying the life-cycle of DDS
entities to activities should be done
with great care
[1/2]
30. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Step 2: Lifecycle Management
☐ In general, it is a better idea to tie the
life-cycle of DDS entities to the
Application as opposed to Activities
☐ In some cases, it may make sense to
tie the life-cycle of DataReaders/
DataWriters to that of the activity
that relies on them -- Usually this
makes sense for activities that are
“one-off”
[2/2]
31. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Application
public class ChatApplication extends Application {
DataReader<ChatMessage> dr;
DataWriter <ChatMessage> dw;
DomainParticipant dp;
@Override
public void onCreate() {
super.onCreate();
// This should be defined via a resource -- but for a small
// demo that’s OK.
System.setProperty(ServiceEnvironment.IMPLEMENTATION_CLASS_NAME_PROPERTY,
"org.opensplice.mobile.core.ServiceEnvironmentImpl");
ServiceEnvironment env = ServiceEnvironment.createInstance(
ChatApplication.class.getClassLoader());
DomainParticipantFactory dpf =
DomainParticipantFactory.getInstance(env);
dp = dpf.createParticipant(0);
Topic<ChatMessage> topic = dp.createTopic("TChatMessage",ChatMessage.class);
Publisher pub = dp.createPublisher();
Subscriber sub = dp.createSubscriber();
dw = pub.createDataWriter(topic);
dr = sub.createDataReader(topic);
}
32. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Application
public DataReader<ChatMessage> reader() {
return this.dr;
}
public DataWriter<ChatMessage> writer() {
return this.dw;
}
@Override
public void onTerminate() {
super.onTerminate();
this.dp.close();
}
}
34. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
More Manifest...
☐ When using OpenSplice Mobile you need to grant the proper
permissions for networking:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
37. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Activity
1
2 public class MainActivity extends Activity {
3
4 private static final String TAG = "ChatMainActivity";
5 private final Handler handler = new Handler();
6 private ArrayAdapter<String> chatMessages;
7
8 public class ChatMessageListener extends ChatMessageDataListener {
9 // ...
10 }
11
12 @Override
13 protected void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.activity_main);
16 chatMessages = new ArrayAdapter<String>(this, R.layout.messages);
17 chatMessages.add("Welcome to the DDS Chat Room");
18 ListView mview = (ListView) findViewById(R.id.messageList);
19 mview.setAdapter(chatMessages);
20 ChatApplication app = (ChatApplication) getApplication();
21
22 app.reader().setListener(new ChatMessageListener());
23
24 }
25
38. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Activity
25
26 @Override
27 public boolean onCreateOptionsMenu(Menu menu) {
28 // Inflate the menu; this adds items to the action bar if it is present.
29 getMenuInflater().inflate(R.menu.main, menu);
30 return true;
31 }
40. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Receiving Data
☐ Receiving data is a bit trickier since in Android only the thread that
runs an activity has the right to change the UI
☐ This means, that from a DDS listener it is not possible to change an
the UI directly!
☐ The solution in to use an Android Handler
to which we can post
Runnable to be executed by the activity thread
☐ Let’s see how this works
41. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
DDS Listener & Android Handler
1 public class ChatMessageListener extends ChatMessageDataListener {
2
3 private DataReader<ChatMessage> dr;
4
5 public ChatMessageListener() {
6 ChatApplication app = (ChatApplication) getApplication();
7 dr = app.reader();
8 }
9
42. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
DDS Listener & Android Handler
10 @Override
11 public void onDataAvailable(DataAvailableEvent<ChatMessage> dae) {
12 final Iterator<ChatMessage> i = dr.read();
13
14 Log.i(TAG, ">>> DataReaderListener.onDataAvailable");
15 if (i.hasNext()) {
16 Runnable dispatcher = new Runnable() {
17 public void run() {
18 while (i.hasNext()) {
19 Sample<ChatMessage> s = i.next();
20
21 if (s.getSampleState() == SampleState.NOT_READ) {
22 ChatMessage cm = s.getData();
23 chatMessages.add(cm.user + " > " + cm.msg);
24 }
25 }
26 }
27 };
28 handler.post(dispatcher);
29 }
30 }
31 }
45. Copyright
2011,
PrismTech
–
All
Rights
Reserved.
OpenSpliceDDS
Concluding Remarks
☐ OpenSplice Mobile is the only pure Java DDS implementation
available on the market. This means that it is the best choice for
Java-Based DDS applications as well as Android Applications
☐ Its performance are very close to native C/C++ DDS
implementations
☐ OpenSplice Mobile architecture is very flexible and can be easily
configured to deliver extremely low latency as well as extremely
high throughput