SlideShare a Scribd company logo
Desktop, Embedded and
Mobile Distributed Apps
with
Angelo	
  Corsaro,	
  PhD	
  
Chief	
  Technology	
  Officer	
  
angelo.corsaro@prismtech.com
Café
Vortex
CopyrightPrismTech,2014
Vortex enable seamless,
ubiquitous, efficient and
timely data sharing across
mobile, embedded,
desktop, cloud and web
applications
The Vortex Platform
CopyrightPrismTech,2014
One Standard, One set of Tools, One Goal — Ubiquitous Data Sharing
The Vortex Platform
VORTEX
Web
VORTEX
Lite
VORTEX
Gateway
VORTEX
Cloud
Private
Clouds
VORTEX
Tools
• Insight	
  
• Record/Replay	
  
• Tuner	
  
• Tester	
  
• Configurator
OpenSplice
Enterprise
VORTEX
Café
Vortex Café
CopyrightPrismTech,2014
Pure Java version of Vortex targeting JVM
and embedded JVMs
DDSI Protocol Stack optimised for mobility
and Android OS
Only DDS on the market designed and
Engineered for Android
Vortex Café
J2SE
DDSI$$
(Optimised*for*Mobility)*
DDS$API Java Scala JavaScript
CopyrightPrismTech,2014
Vortex Café has a Staged Event Driven Architecture (SEDA) that allows it to be
easily configured to trade off between throughput and latency
A Staged Event Driven Architecture
CopyrightPrismTech,2014
Decomposes 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
SEDA
[Matt Welsh, David Culler, and Eric Brewer, SEDA:An Architecture for Well-Conditioned, Scalable Internet Services]
CopyrightPrismTech,2014
The Vortex Café architecture is organized
around three stages
Packet Processing
Message Processing
Data Processing
The channel that connect each stage can
be configured to be active or passive
Vortex Café Architecture
Packet
Processor
Message
Processor
Data
Processor
Network Packet
DDSI Messages
Cache Changes
CopyrightPrismTech,2014
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 Vortex Café to optimize the
use case at hand
Configurability
Processor
Channel
CopyrightPrismTech,2014
Single Thread per Message
Sample Configurations
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
CopyrightPrismTech,2014
Vortex Café 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:
Configuration in Practice
java	
  -­‐server	
  	
  -­‐cp	
  .:./target/vortex-­‐cafe-­‐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	
  	
  	
  
com.prismtech.cafe.demo.perf.RoundTripDemoReader	
  $*
Anatomy of a
Vortex-Cafe App
CopyrightPrismTech,2014
• DomainParticipant: Provides access to a data cloud -- called a domain in DDS
• Topic: Domain-wide definition of a kind of Information
• Publisher/Subscriber: Provide scope to data sharing through the concept of partitions	

• DataReader/DataWriter: Allow to read/write data for a given topic in the partitions their Subscriber/Publisher are
associated with.
DDS Entities
CopyrightPrismTech,2014
Brewing Vortex-Cafe
int	
  domain_id	
  =	
  18;	
  
DomainParticipantFactory	
  dpf	
  =	
  	
  	
  	
  
	
  	
  	
  	
  DomainParticipantFactory.getInstance(env)	
  
!
DomainParticipant	
  dp	
  =	
  	
  
	
  	
  	
  	
  dpf.createParticipant(domainId);	
  
Topic<Post>	
  topic	
  =	
  	
  
	
  	
  	
  	
  dp.createTopic(“Post”,	
  Post.class);
struct	
  Post	
  {	
  
	
  	
  string	
  name;	
  
	
  	
  string	
  msg;	
  
};	
  	
  	
  	
  	
  	
  	
  	
  	
  
#pragma	
  keylist	
  Post	
  name	
  
Publisher	
  pub	
  =	
  dp.createPublisher();	
  
DataWriter<Post>	
  dw	
  =	
  	
  
	
  	
  	
  pub.createDataWriter<Post>(topic);	
  
dw.write(new	
  Post(“Barman”,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  “Would	
  you	
  like	
  an	
  espresso?”);
Subscriber	
  sub	
  =	
  dp.createSubscriber();	
  
DataReader<Post>	
  dr	
  =	
  
	
  	
  	
  	
  	
  sub.createDataReader<Post>(topic);	
  
LoanedSamples<Post>	
  samples	
  =	
  dw.read();
CopyrightPrismTech,2014
Escalating Vortex-Cafe
val	
  topic	
  =	
  Topic[Post](“Post”) struct	
  Post	
  {	
  
	
  	
  string	
  name;	
  
	
  	
  string	
  msg;	
  
};	
  	
  	
  	
  	
  	
  	
  	
  	
  
#pragma	
  keylist	
  Post	
  name	
  
val	
  dw	
  =	
  DataWriter[Post](topic)	
  	
  
dw	
  write(new	
  Post(“Barman”,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  “Would	
  you	
  like	
  an	
  espresso?”)
val	
  dr	
  =	
  DataReader[Post](topic)	
  
dr.listen	
  {	
  
	
  	
  	
  case	
  DataAvailable(_)	
  =>	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  dr.read.foreach(println(_.getData())	
  
}
Android
CopyrightPrismTech,2014
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 utilisation
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!
Android Fundamentals
CopyrightPrismTech,2014
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
Android Application in a Nutshell
CopyrightPrismTech,2014
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
Component Activation
CopyrightPrismTech,2014
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.
Application Manifest
CopyrightPrismTech,2014
Notice that Activities are also
destroyed each time there is a screen
rotation (unless you don’t explicitly
manage it)
Activities Life-Cycle
CopyrightPrismTech,2014
Tasks and Back Tasks
CopyrightPrismTech,2014
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?
DDS Considerations for Android
DDS Chat
CopyrightPrismTech,2014
To learn how to write an Android
Application that uses Vortex Café
we’ll develop a very simple Chat
To keep things simple this chat will
have a single “chat room”
DDS Chat for Android
CopyrightPrismTech,2014
Our Chat application will have a very simple architecture with simply one
Activity that will take care of:
- Sending Posts into the ChatRoom
- Displaying Posts in the room since when we joined
In terms of information modelling, we’ll have a single topic representing the user
post
Step 1: Architecture
struct	
  Post	
  {	
  
	
  	
  string	
  name;	
  
	
  	
  string	
  msg;	
  
};	
  	
  	
  	
  	
  	
  	
  	
  	
  
#pragma	
  keylist	
  Post	
  name	
  
CopyrightPrismTech,2014
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
Step 2: Lifecycle Management[1/2]
CopyrightPrismTech,2014
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”
Step 2: Lifecycle Management[2/2]
CopyrightPrismTech,2014
Application
public class ChatApplication extends Application {!
!
DataReader<Post> dr;!
DataWriter <Post> 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,!
"com.prismtech.cafe.core.ServiceEnvironmentImpl");!
ServiceEnvironment env = ServiceEnvironment.createInstance(!
ChatApplication.class.getClassLoader());!
DomainParticipantFactory dpf =!
DomainParticipantFactory.getInstance(env);!
!
dp = dpf.createParticipant(0);!
Topic<Post> topic = dp.createTopic("Post",Post.class);!
Publisher pub = dp.createPublisher();!
Subscriber sub = dp.createSubscriber();!
!
dw = pub.createDataWriter(topic);!
dr = sub.createDataReader(topic);!
}!
!
CopyrightPrismTech,2014
Application
!
public DataReader<Post> reader() {!
return this.dr;!
}!
!
public DataWriter<Post> writer() {!
return this.dw;!
}!
!
!
@Override!
public void onTerminate() {!
super.onTerminate();!
this.dp.close();!
}!
}!
CopyrightPrismTech,2014
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=“com.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>!
CopyrightPrismTech,2014
When using Vortex Café you need to grant the proper permissions for
networking:
More Manifest...
<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"/>!
CopyrightPrismTech,2014
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"!
/>!
!
CopyrightPrismTech,2014
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>!
CopyrightPrismTech,2014
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
CopyrightPrismTech,2014
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 }!
CopyrightPrismTech,2014
Activity
32 !
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 Post(usr, msg));!
42 } catch (TimeoutException te) {!
43 }!
44 }!
45 !
46 }!
CopyrightPrismTech,2014
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 is to use an Android Handler	
  to which we can post Runnable to
be executed by the activity thread
Let’s see how this works...
Receiving Data
CopyrightPrismTech,2014
DDS Listener & Android Handler
1 public class ChatMessageListener extends ChatMessageDataListener {!
2 !
3 private DataReader<Post> dr;!
4 !
5 public ChatMessageListener() {!
6 ChatApplication app = (ChatApplication) getApplication();!
7 dr = app.reader();!
8 }!
9 !
CopyrightPrismTech,2014
DDS Listener & Android Handler
10 @Override!
11 public void onDataAvailable(DataAvailableEvent<Post> dae) {!
12 final Iterator<Post> 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<Post> s = i.next();!
20 !
21 if (s.getSampleState() == SampleState.NOT_READ) {!
22 Post cm = s.getData();!
23 chatMessages.add(cm.name + " > " + cm.msg);!
24 }!
25 }!
26 }!
27 };!
28 handler.post(dispatcher);!
29 }!
30 }!
31 }!
Raspberry Pi
CopyrightPrismTech,2014
The Raspberry Pi is a low cost, credit-card
sized computer that plugs into a computer
monitor or TV, and uses a standard keyboard
and mouse
Raspberry Pi can interact with the outside
world, and is used in a wide array of digital
maker projects, from music machines and
parent detectors to weather stations and
tweeting birdhouses with infra-red cameras,
etc.
Raspberry Pi
CopyrightPrismTech,2014
Several Images are available nowadays, I tend to use Raspbian
To get started get the image from: http://www.raspberrypi.org/downloads/
Then copy the image on an SD card following instruct ructions available at http://
www.raspberrypi.org/documentation/installation/installing-images/
For MacOS X:
-­‐ diskutil	
  list	
  [to	
  check	
  the	
  SD	
  card	
  /dev/diskN]	
  
-­‐ diskutil	
  unmontDisk	
  /dev/diskN	
  
-­‐ sudo	
  dd	
  bs=1m	
  if=2014-­‐01-­‐07-­‐wheezy-­‐raspbian.img	
  of=/dev/diskN	
  
-­‐ sudo	
  diskutil	
  eject	
  /dev/diskN
Raspberry Pi Image
CopyrightPrismTech,2014
Getting the Java JDK on raspberry is as easy as executing the following
command:
- sudo apt-get update
- sudo apt-get install oracle-java7-jdk [jdk8 is also available]
Getting Java on Raspberry
CopyrightPrismTech,2014
You can get Scala and SBT using curl:
- curl -O http://downloads.typesafe.com/scala/2.11.1/scala-2.11.1.tgz
- http://dl.bintray.com/sbt/native-packages/sbt/0.13.5/sbt-0.13.5.tgz
Then simply extract and properly set the PATH environment variable
Getting Scala and SBT
CopyrightPrismTech,2014
Chat App
CopyrightPrismTech,2014
Chat App
Let’s get Action!
CopyrightPrismTech,2014
Vortex enable seamless, ubiquitous, efficient and timely data sharing across
mobile, embedded, desktop, cloud and web applications
It is the first platform to address the data-sharing needs of Business Critical IoT,
and Industrial Internet Systems
Vortex is fully interoperable with DDS compliant implementations
Concluding Remarks
CopyrightPrismTech,2014
Vortex v1.0 will be available in June 2014
Starting from May will be providing a series of webcasts to get you
started in building IoT and I2 applications with Vortex
What’s Next?

More Related Content

PDF
Desktop, Embedded and Mobile Apps with Vortex Café
PDF
Building and Scaling Internet of Things Applications with Vortex Cloud
PDF
Building Real-Time Web Applications with Vortex-Web
PPT
RTI Data-Distribution Service (DDS) Master Class 2011
PDF
Standardizing the Data Distribution Service (DDS) API for Modern C++
PDF
OpenSplice DDS Tutorial -- Part II
PDF
Connected Mobile and Web Applications with Vortex
PDF
Component Based DDS with C++11 and R2DDS
Desktop, Embedded and Mobile Apps with Vortex Café
Building and Scaling Internet of Things Applications with Vortex Cloud
Building Real-Time Web Applications with Vortex-Web
RTI Data-Distribution Service (DDS) Master Class 2011
Standardizing the Data Distribution Service (DDS) API for Modern C++
OpenSplice DDS Tutorial -- Part II
Connected Mobile and Web Applications with Vortex
Component Based DDS with C++11 and R2DDS

What's hot (20)

PDF
The Data Distribution Service Tutorial
PDF
Vortex Tutorial Part 2
PDF
RTI Data-Distribution Service (DDS) Master Class - 2010
PDF
Vortex Tutorial -- Part I
PDF
BranchOffice Szenarios
PDF
Communication Patterns Using Data-Centric Publish/Subscribe
PDF
The DDS Tutorial Part II
PDF
OMG DDS: The Data Distribution Service for Real-Time Systems
PDF
Getting Started in DDS with C++ and Java
PDF
High Performance Distributed Computing with DDS and Scala
PDF
Vortex Cloud Beyond Cloud Messaging
PDF
9/28/11 Slides - Introduction to DuraCloud, Slides
PDF
Getting Started with DDS in C++, Java and Scala
PDF
Architecting IoT Systems with Vortex
PDF
Advanced OpenSplice Programming - Part I
PDF
Micro services Architecture with Vortex -- Part I
PDF
Reactive Data Centric Architectures with Vortex, Spark and ReactiveX
PDF
The DDS Tutorial - Part I
PPTX
Patterns of Data Distribution
PDF
The Data Distribution Service
The Data Distribution Service Tutorial
Vortex Tutorial Part 2
RTI Data-Distribution Service (DDS) Master Class - 2010
Vortex Tutorial -- Part I
BranchOffice Szenarios
Communication Patterns Using Data-Centric Publish/Subscribe
The DDS Tutorial Part II
OMG DDS: The Data Distribution Service for Real-Time Systems
Getting Started in DDS with C++ and Java
High Performance Distributed Computing with DDS and Scala
Vortex Cloud Beyond Cloud Messaging
9/28/11 Slides - Introduction to DuraCloud, Slides
Getting Started with DDS in C++, Java and Scala
Architecting IoT Systems with Vortex
Advanced OpenSplice Programming - Part I
Micro services Architecture with Vortex -- Part I
Reactive Data Centric Architectures with Vortex, Spark and ReactiveX
The DDS Tutorial - Part I
Patterns of Data Distribution
The Data Distribution Service
Ad

Similar to Desktop, Embedded and Mobile Apps with PrismTech Vortex Cafe (20)

PPT
Android overview
PDF
Android Development in a Nutshell
PDF
Real-Time Web Programming with PrismTech Vortex Web
PDF
Android Workshop Part 1
PPTX
architecture of android.pptx
PDF
Android : Revolutionizing Mobile Devices
PDF
Google Android @ AlphaCSP's JavaEdge
PPT
Module - Programming with android course.ppt
PPT
Introduction to android
PPSX
Android Introduction
PPT
Practical Considerations for Deploying a Java Active Networking Platform
PDF
IBM MobileFirst Reference Architecture 1512 v3 2015
PPT
My androidpresentation
PPTX
Intro to Mobile app development Android.pptx
PPT
265.ppt
PDF
20IT601PE - Mobile Application Development PPT.pdf
PPT
Android Basics
PPT
Synapseindia android apps overview
PDF
Vert.x introduction
PDF
Ch1 hello, android
Android overview
Android Development in a Nutshell
Real-Time Web Programming with PrismTech Vortex Web
Android Workshop Part 1
architecture of android.pptx
Android : Revolutionizing Mobile Devices
Google Android @ AlphaCSP's JavaEdge
Module - Programming with android course.ppt
Introduction to android
Android Introduction
Practical Considerations for Deploying a Java Active Networking Platform
IBM MobileFirst Reference Architecture 1512 v3 2015
My androidpresentation
Intro to Mobile app development Android.pptx
265.ppt
20IT601PE - Mobile Application Development PPT.pdf
Android Basics
Synapseindia android apps overview
Vert.x introduction
Ch1 hello, android
Ad

More from ADLINK Technology IoT (20)

PDF
Connected Mobile and Web Applications with PrismTech Vortex Data Sharing Plat...
PDF
Introducing Vortex Lite
PDF
Harnessing DDS in Next Generation Healthcare Systems
PDF
PrismTech Vortex Tutorial Part 1
PDF
Building and Scaling Internet of Things Applications with Vortex Cloud
PDF
Introduction to PrismTech's Vortex Intelligent Data Sharing Platform for the ...
PPTX
PrismTech Integrated Communications Systems Modeling
PPTX
PrismTech Reflective Language for Communication Systems
PDF
Model_Driven_Development_SDR
PDF
SCA_4_adoption_may2013
PDF
Using Model Driven Development to Easily Manage Variations in Software Define...
PDF
Sca 4 0 _may16_2012_final
PDF
Spectra dtp4700h march2012_final
PDF
Spectra CX 3.4 Launch Webcast
PDF
Spectra DTP4700 Linux Based Development for Software Defined Radio (SDR) Soft...
PPTX
Migrating Legacy Waveforms to the Software Communications Architecture (SCA)
PDF
Rapid Software Communications Architecture (SCA) Development for DSPs with Sp...
PPT
Spectra IP Core ORB - high-performance, low-latency solution for FPGA-GPP com...
PPT
Automating Software Communications Architecture (SCA) Testing with Spectra CX
PPT
SCA Next Part 1 - Software Defined Radio (SDR) Webcast Slides
Connected Mobile and Web Applications with PrismTech Vortex Data Sharing Plat...
Introducing Vortex Lite
Harnessing DDS in Next Generation Healthcare Systems
PrismTech Vortex Tutorial Part 1
Building and Scaling Internet of Things Applications with Vortex Cloud
Introduction to PrismTech's Vortex Intelligent Data Sharing Platform for the ...
PrismTech Integrated Communications Systems Modeling
PrismTech Reflective Language for Communication Systems
Model_Driven_Development_SDR
SCA_4_adoption_may2013
Using Model Driven Development to Easily Manage Variations in Software Define...
Sca 4 0 _may16_2012_final
Spectra dtp4700h march2012_final
Spectra CX 3.4 Launch Webcast
Spectra DTP4700 Linux Based Development for Software Defined Radio (SDR) Soft...
Migrating Legacy Waveforms to the Software Communications Architecture (SCA)
Rapid Software Communications Architecture (SCA) Development for DSPs with Sp...
Spectra IP Core ORB - high-performance, low-latency solution for FPGA-GPP com...
Automating Software Communications Architecture (SCA) Testing with Spectra CX
SCA Next Part 1 - Software Defined Radio (SDR) Webcast Slides

Recently uploaded (20)

PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Introduction to Artificial Intelligence
PPTX
ai tools demonstartion for schools and inter college
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Understanding Forklifts - TECH EHS Solution
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
top salesforce developer skills in 2025.pdf
PDF
medical staffing services at VALiNTRY
PPTX
ISO 45001 Occupational Health and Safety Management System
PPTX
Materi_Pemrograman_Komputer-Looping.pptx
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
System and Network Administration Chapter 2
PDF
AI in Product Development-omnex systems
PDF
Digital Strategies for Manufacturing Companies
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Introduction to Artificial Intelligence
ai tools demonstartion for schools and inter college
2025 Textile ERP Trends: SAP, Odoo & Oracle
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Adobe Illustrator 28.6 Crack My Vision of Vector Design
How to Choose the Right IT Partner for Your Business in Malaysia
Understanding Forklifts - TECH EHS Solution
Design an Analysis of Algorithms I-SECS-1021-03
top salesforce developer skills in 2025.pdf
medical staffing services at VALiNTRY
ISO 45001 Occupational Health and Safety Management System
Materi_Pemrograman_Komputer-Looping.pptx
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
VVF-Customer-Presentation2025-Ver1.9.pptx
System and Network Administration Chapter 2
AI in Product Development-omnex systems
Digital Strategies for Manufacturing Companies
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...

Desktop, Embedded and Mobile Apps with PrismTech Vortex Cafe

  • 1. Desktop, Embedded and Mobile Distributed Apps with Angelo  Corsaro,  PhD   Chief  Technology  Officer   angelo.corsaro@prismtech.com Café
  • 3. CopyrightPrismTech,2014 Vortex enable seamless, ubiquitous, efficient and timely data sharing across mobile, embedded, desktop, cloud and web applications The Vortex Platform
  • 4. CopyrightPrismTech,2014 One Standard, One set of Tools, One Goal — Ubiquitous Data Sharing The Vortex Platform VORTEX Web VORTEX Lite VORTEX Gateway VORTEX Cloud Private Clouds VORTEX Tools • Insight   • Record/Replay   • Tuner   • Tester   • Configurator OpenSplice Enterprise VORTEX Café
  • 6. CopyrightPrismTech,2014 Pure Java version of Vortex targeting JVM and embedded JVMs DDSI Protocol Stack optimised for mobility and Android OS Only DDS on the market designed and Engineered for Android Vortex Café J2SE DDSI$$ (Optimised*for*Mobility)* DDS$API Java Scala JavaScript
  • 7. CopyrightPrismTech,2014 Vortex Café has a Staged Event Driven Architecture (SEDA) that allows it to be easily configured to trade off between throughput and latency A Staged Event Driven Architecture
  • 8. CopyrightPrismTech,2014 Decomposes 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 SEDA [Matt Welsh, David Culler, and Eric Brewer, SEDA:An Architecture for Well-Conditioned, Scalable Internet Services]
  • 9. CopyrightPrismTech,2014 The Vortex Café architecture is organized around three stages Packet Processing Message Processing Data Processing The channel that connect each stage can be configured to be active or passive Vortex Café Architecture Packet Processor Message Processor Data Processor Network Packet DDSI Messages Cache Changes
  • 10. CopyrightPrismTech,2014 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 Vortex Café to optimize the use case at hand Configurability Processor Channel
  • 11. CopyrightPrismTech,2014 Single Thread per Message Sample Configurations 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
  • 12. CopyrightPrismTech,2014 Vortex Café 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: Configuration in Practice java  -­‐server    -­‐cp  .:./target/vortex-­‐cafe-­‐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       com.prismtech.cafe.demo.perf.RoundTripDemoReader  $*
  • 14. CopyrightPrismTech,2014 • DomainParticipant: Provides access to a data cloud -- called a domain in DDS • Topic: Domain-wide definition of a kind of Information • Publisher/Subscriber: Provide scope to data sharing through the concept of partitions • DataReader/DataWriter: Allow to read/write data for a given topic in the partitions their Subscriber/Publisher are associated with. DDS Entities
  • 15. CopyrightPrismTech,2014 Brewing Vortex-Cafe int  domain_id  =  18;   DomainParticipantFactory  dpf  =                DomainParticipantFactory.getInstance(env)   ! DomainParticipant  dp  =            dpf.createParticipant(domainId);   Topic<Post>  topic  =            dp.createTopic(“Post”,  Post.class); struct  Post  {      string  name;      string  msg;   };                   #pragma  keylist  Post  name   Publisher  pub  =  dp.createPublisher();   DataWriter<Post>  dw  =          pub.createDataWriter<Post>(topic);   dw.write(new  Post(“Barman”,                                        “Would  you  like  an  espresso?”); Subscriber  sub  =  dp.createSubscriber();   DataReader<Post>  dr  =            sub.createDataReader<Post>(topic);   LoanedSamples<Post>  samples  =  dw.read();
  • 16. CopyrightPrismTech,2014 Escalating Vortex-Cafe val  topic  =  Topic[Post](“Post”) struct  Post  {      string  name;      string  msg;   };                   #pragma  keylist  Post  name   val  dw  =  DataWriter[Post](topic)     dw  write(new  Post(“Barman”,                                        “Would  you  like  an  espresso?”) val  dr  =  DataReader[Post](topic)   dr.listen  {        case  DataAvailable(_)  =>                          dr.read.foreach(println(_.getData())   }
  • 18. CopyrightPrismTech,2014 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 utilisation 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! Android Fundamentals
  • 19. CopyrightPrismTech,2014 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 Android Application in a Nutshell
  • 20. CopyrightPrismTech,2014 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 Component Activation
  • 21. CopyrightPrismTech,2014 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. Application Manifest
  • 22. CopyrightPrismTech,2014 Notice that Activities are also destroyed each time there is a screen rotation (unless you don’t explicitly manage it) Activities Life-Cycle
  • 24. CopyrightPrismTech,2014 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? DDS Considerations for Android
  • 26. CopyrightPrismTech,2014 To learn how to write an Android Application that uses Vortex Café we’ll develop a very simple Chat To keep things simple this chat will have a single “chat room” DDS Chat for Android
  • 27. CopyrightPrismTech,2014 Our Chat application will have a very simple architecture with simply one Activity that will take care of: - Sending Posts into the ChatRoom - Displaying Posts in the room since when we joined In terms of information modelling, we’ll have a single topic representing the user post Step 1: Architecture struct  Post  {      string  name;      string  msg;   };                   #pragma  keylist  Post  name  
  • 28. CopyrightPrismTech,2014 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 Step 2: Lifecycle Management[1/2]
  • 29. CopyrightPrismTech,2014 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” Step 2: Lifecycle Management[2/2]
  • 30. CopyrightPrismTech,2014 Application public class ChatApplication extends Application {! ! DataReader<Post> dr;! DataWriter <Post> 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,! "com.prismtech.cafe.core.ServiceEnvironmentImpl");! ServiceEnvironment env = ServiceEnvironment.createInstance(! ChatApplication.class.getClassLoader());! DomainParticipantFactory dpf =! DomainParticipantFactory.getInstance(env);! ! dp = dpf.createParticipant(0);! Topic<Post> topic = dp.createTopic("Post",Post.class);! Publisher pub = dp.createPublisher();! Subscriber sub = dp.createSubscriber();! ! dw = pub.createDataWriter(topic);! dr = sub.createDataReader(topic);! }! !
  • 31. CopyrightPrismTech,2014 Application ! public DataReader<Post> reader() {! return this.dr;! }! ! public DataWriter<Post> writer() {! return this.dw;! }! ! ! @Override! public void onTerminate() {! super.onTerminate();! this.dp.close();! }! }!
  • 33. CopyrightPrismTech,2014 When using Vortex Café you need to grant the proper permissions for networking: More Manifest... <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"/>!
  • 34. CopyrightPrismTech,2014 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"! />! !
  • 36. CopyrightPrismTech,2014 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
  • 37. CopyrightPrismTech,2014 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 }!
  • 38. CopyrightPrismTech,2014 Activity 32 ! 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 Post(usr, msg));! 42 } catch (TimeoutException te) {! 43 }! 44 }! 45 ! 46 }!
  • 39. CopyrightPrismTech,2014 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 is to use an Android Handler  to which we can post Runnable to be executed by the activity thread Let’s see how this works... Receiving Data
  • 40. CopyrightPrismTech,2014 DDS Listener & Android Handler 1 public class ChatMessageListener extends ChatMessageDataListener {! 2 ! 3 private DataReader<Post> dr;! 4 ! 5 public ChatMessageListener() {! 6 ChatApplication app = (ChatApplication) getApplication();! 7 dr = app.reader();! 8 }! 9 !
  • 41. CopyrightPrismTech,2014 DDS Listener & Android Handler 10 @Override! 11 public void onDataAvailable(DataAvailableEvent<Post> dae) {! 12 final Iterator<Post> 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<Post> s = i.next();! 20 ! 21 if (s.getSampleState() == SampleState.NOT_READ) {! 22 Post cm = s.getData();! 23 chatMessages.add(cm.name + " > " + cm.msg);! 24 }! 25 }! 26 }! 27 };! 28 handler.post(dispatcher);! 29 }! 30 }! 31 }!
  • 43. CopyrightPrismTech,2014 The Raspberry Pi is a low cost, credit-card sized computer that plugs into a computer monitor or TV, and uses a standard keyboard and mouse Raspberry Pi can interact with the outside world, and is used in a wide array of digital maker projects, from music machines and parent detectors to weather stations and tweeting birdhouses with infra-red cameras, etc. Raspberry Pi
  • 44. CopyrightPrismTech,2014 Several Images are available nowadays, I tend to use Raspbian To get started get the image from: http://www.raspberrypi.org/downloads/ Then copy the image on an SD card following instruct ructions available at http:// www.raspberrypi.org/documentation/installation/installing-images/ For MacOS X: -­‐ diskutil  list  [to  check  the  SD  card  /dev/diskN]   -­‐ diskutil  unmontDisk  /dev/diskN   -­‐ sudo  dd  bs=1m  if=2014-­‐01-­‐07-­‐wheezy-­‐raspbian.img  of=/dev/diskN   -­‐ sudo  diskutil  eject  /dev/diskN Raspberry Pi Image
  • 45. CopyrightPrismTech,2014 Getting the Java JDK on raspberry is as easy as executing the following command: - sudo apt-get update - sudo apt-get install oracle-java7-jdk [jdk8 is also available] Getting Java on Raspberry
  • 46. CopyrightPrismTech,2014 You can get Scala and SBT using curl: - curl -O http://downloads.typesafe.com/scala/2.11.1/scala-2.11.1.tgz - http://dl.bintray.com/sbt/native-packages/sbt/0.13.5/sbt-0.13.5.tgz Then simply extract and properly set the PATH environment variable Getting Scala and SBT
  • 50. CopyrightPrismTech,2014 Vortex enable seamless, ubiquitous, efficient and timely data sharing across mobile, embedded, desktop, cloud and web applications It is the first platform to address the data-sharing needs of Business Critical IoT, and Industrial Internet Systems Vortex is fully interoperable with DDS compliant implementations Concluding Remarks
  • 51. CopyrightPrismTech,2014 Vortex v1.0 will be available in June 2014 Starting from May will be providing a series of webcasts to get you started in building IoT and I2 applications with Vortex What’s Next?