dds + android = opensplice mobile

47
OpenSplice DDS Angelo CORSARO, Ph.D. Chief Technology Ocer OMG DDS Sig Co-Chair PrismTech [email protected] DDS + Android = OpenSplice | Mobile

Upload: angelo-corsaro

Post on 10-May-2015

1.472 views

Category:

Technology


4 download

DESCRIPTION

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!

TRANSCRIPT

Page 1: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

Angelo CORSARO, Ph.D.Chief Technology Officer OMG DDS Sig Co-Chair

[email protected]

DDS + Android = OpenSplice |Mobile

Page 2: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

What I’ll Cover Today

☐ Learn about OpenSplice Mobile

☐ Understand OpenSplice Mobile Architecture and Performance

☐ Get started with DDS programming on Android

Page 3: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

Introducing OpenSplice Mobile

Page 4: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

OpenSpliceCommunity

OpenSpliceCloud

OpenSpliceEmbedded

OpenSplice

OpenSpliceEnterprise

Page 5: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

OpenSpliceCommunity

OpenSpliceCloud

OpenSpliceEmbedded

OpenSplice

OpenSpliceEnterprise

OpenSpliceMobile

OpenSpliceGateway

Page 6: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 7: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

OpenSplice Mobile

Page 8: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

In Action...

Page 9: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

DDS ComplianceDDS 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

Page 10: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

OpenSplice Mobile Architecture

Page 11: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 12: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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]

Page 13: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 14: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 15: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Sample ConfigurationsSingle 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

Page 16: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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  $*

Page 17: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 18: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

Android and OpenSplice Mobile

Page 19: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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!

Page 20: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 21: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 22: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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.

Page 23: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Activities Lifecycle

☐ Notice that Activities are also destroyed each time there is a screen rotation (unless you don’t explicitly manage it)

Page 24: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Tasks and Back-Stack

Page 25: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

DDS-based and Android AppsConsidering 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?

Page 26: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

DDS Chat

Page 27: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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”

Page 28: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 29: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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]

Page 30: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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]

Page 31: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Applicationpublic 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); }

Page 32: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Application

public DataReader<ChatMessage> reader() { return this.dr; }

public DataWriter<ChatMessage> writer() { return this.dw; }

@Override public void onTerminate() { super.onTerminate(); this.dp.close(); }}

Page 33: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Manifest...<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="ChatApplication" > <activity android:name="org.opensplice.mobile.ddschat.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity></application>

Page 34: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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"/>

Page 35: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Activity GUI<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

<TextView android:id="@+id/chatMessages" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/chat_msgs" android:visibility="gone" android:background="#666" android:textColor="#fff" android:paddingLeft="5dp" /> <ListView android:id="@+id/messageList" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" />

Page 36: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Activity GUI <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" >

<EditText android:id="@+id/message" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="@string/edit_message" />

<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="sendChatMessage" android:text="@string/button_send" /> </LinearLayout>

</LinearLayout>

Page 37: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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 @Override13 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

Page 38: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Activity

25 26 @Override27 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 }

Page 39: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

Activity32 33 public void sendChatMessage(View view) {34 EditText editText = (EditText) findViewById(R.id.message);35 String msg = editText.getText().toString();36 editText.setText("");37 // chatMessages.add(msg);38 ChatApplication app = (ChatApplication) getApplication();39 try {40 Log.i(TAG, ">>> Sending data " + msg);41 app.writer().write(new ChatMessage(usr, msg));42 } catch (TimeoutException te) {43 }44 }45 46 }

Page 40: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 41: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 42: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

DDS Listener & Android Handler10 @Override11 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 }

Page 43: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

Putting all Together

Page 44: DDS + Android = OpenSplice Mobile

OpenSplice

DDS

Final Remarks

Page 45: DDS + Android = OpenSplice Mobile

Copyrig

ht  2011,  PrismTech  –    A

ll  Rights  Reserved.

OpenSplice

DDS

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

Page 46: DDS + Android = OpenSplice Mobile

OpenSplice

DDS