summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@mecka.net>2014-02-18 23:29:58 +0100
committerManuel Traut <manut@mecka.net>2014-02-18 23:29:58 +0100
commit6200bc8389548831e6fc345ceb9867b0d0c1b1ab (patch)
tree0eb6c0ba974bf07c7743121c99c33be4485915c0
parentddf662b88e0e04dd6af3bba47b4a58e4d284e7d1 (diff)
update middleware presentation
- give an introduction to the topic, what is a middleware, why do we need it - mention some xml based middlewares - update the dbus section, no we don't have HAL anymore :)) - mention the idl workflow in the corba section Signed-off-by: Manuel Traut <manut@mecka.net>
-rw-r--r--frameworks/middleware/pres_middleware.tex571
1 files changed, 546 insertions, 25 deletions
diff --git a/frameworks/middleware/pres_middleware.tex b/frameworks/middleware/pres_middleware.tex
index 2f4c462..d147ceb 100644
--- a/frameworks/middleware/pres_middleware.tex
+++ b/frameworks/middleware/pres_middleware.tex
@@ -3,23 +3,473 @@
\title{\lq Middleware\rq}
\maketitle
-\subsection{DBUS}
\begin{frame}
-\frametitle{DBUS Communication Framework}
+\frametitle{Agenda}
+\begin{itemize}
+\item Overview
+\item XML based Middleware
+\item Celery
+\item DDS
+\item D-Bus
+\item CORBA
+\end{itemize}
+GOAL: get an idea about:
+
+the amount of available middleware solutions
+
+and for what they can be used.
+\end{frame}
+
+\subsection{Overview}
+
+\begin{frame}
+\frametitle{Use-case}
+\begin{center}
+\includegraphics[width=0.8\textheight]{images/714px-Middleware_Schema.png}
+\end{center}
+\tiny Source: http://commons.wikimedia.org/wiki/File:Middleware\_Schema.svg
+\end{frame}
+
+\begin{frame}
+\frametitle{Why should we use a middleware?}
+\begin{itemize}
+\item IPC
+\item scalability
+\item os abstraction
+\item reusability of sw components
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Kinds of Middleware}
+\begin{itemize}
+\item Message Oriented Middleware (MOM)
+\item Remote Procedure Calls (RPC)
+\item Webapplications?
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Requirements}
+\begin{block}{Abstraction Layers}
+\begin{itemize}
+\item operating system
+\item programing language
+\item localization
+\item transport
+\item concurrent access
+\end{itemize}
+\end{block}
+\end{frame}
+
+\begin{frame}
+\frametitle{Requirements}
+\begin{block}{Technical, product specific}
+\begin{itemize}
+\item os / language support
+\item performance
+\item requirement coverage
+\item commerical, open-source, (long-time) support
+\end{itemize}
+\end{block}
+\end{frame}
+
+\begin{frame}
+\frametitle{Standards, Protocols}
+\begin{itemize}
+\item XML based Middleware
+\item Celery - Job Queue Protocol
+\item DDS - Data Distribution Service
+\item D-Bus - MOM
+\item CORBA - Common Object Request Broker
+\end{itemize}
+\end{frame}
+
+\subsection{XML based Middleware}
+\begin{frame}
+\frametitle{popular protocols}
+\begin{description}
+\item[XML-RPC] Extensible Markup Language Remote Procedure Call
+\item[SOAP/WSDL] many webservices are based on SOAP
+\item[XMPP] Extensible Messaging and Presence Protocol
+\end{description}
+\end{frame}
+
+\begin{frame}
+\frametitle{XML-RPC}
+\begin{itemize}
+\item native supported by Python (see example)
+\item C/C++ Implementation: http://xmlrpc-c.sourceforge.net/
+\item Client- / Serverarchitecture
+\item uses http as transport
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+server.py\#p1
+\begin{lstlisting}[language=python]
+from datetime import datetime
+from SimpleXMLRPCServer import SimpleXMLRPCServer
+import xmlrpclib
+
+def today ():
+ today = datetime.today ()
+ return xmlrpclib.DateTime (today)
+
+def load ():
+ fd = open ("/proc/loadavg", "r")
+ loadavg = fd.read ()
+ sysload = loadavg.split ()
+ return xmlrpclib.FloatType (sysload[0])
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+server.py\#p2
+\begin{lstlisting}[language=python]
+server = SimpleXMLRPCServer (("localhost",
+ 8000))
+
+server.register_function (today, "today")
+server.register_function (load, "load")
+
+print "Listening on port 8000..."
+server.serve_forever ()
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+client.py\#p1
+\begin{lstlisting}[language=python]
+import xmlrpclib
+from datetime import datetime
+
+proxy = xmlrpclib.ServerProxy (
+ "http://localhost:8000/")
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+client.py\#p2
+\begin{lstlisting}[language=python]
+today = proxy.today ()
+# today = 20140218T14:23:45
+
+conv = datetime.strptime (today.value,
+ "%Y%m%dT%H:%M:%S")
+
+print "Today:", conv.strftime (
+ "%d.%m.%Y, %H:%M")
+
+load = proxy.load ()
+print "system load:", load
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+output:
+\begin{lstlisting}[language=bash]
+ % python client.py
+Today: 18.02.2014, 14:26
+system load: 0.45
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+http payload of today rpc call seen in wireshark:
+\begin{lstlisting}[language=XML]
+<?xml version='1.0'?>
+<methodCall>
+ <methodName>today</methodName>
+ <params></params>
+</methodCall>
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XML-RPC example in Python}
+http payload of today rpc response seen in wireshark:
+\begin{lstlisting}[language=XML]
+<?xml version='1.0'?>
+<methodResponse>
+ <params>
+ <param>
+ <value>
+ <dateTime.iso8601>
+ 20140218T14:26:25
+ </dateTime.iso8601>
+ </value>
+ </param>
+ </params>
+</methodResponse>
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+\frametitle{SOAP/WSDL}
+\begin{block}{Overview}
+\begin{itemize}
+\item WSDL (Web Services Description Language)
+
+describes the interface and spcecial datatypes
+\item the SOAP protocol is used for communication
+\item SOAP can be used with various transports:
+
+FTP, SMTP, HTTP(S), JMS
+\item hopping is supported, with different transports
+\item Client- / Serverarchitecture
+\end{itemize}
+\end{block}
+\end{frame}
+
+\begin{frame}
+\frametitle{SOAP/WSDL}
+\begin{block}{Implementations}
+\begin{itemize}
+\item ZSI: Python
+\item KDSOAP: Qt4/5 native Library (commercial)
+\item gSOAP: C/C++
+\item Apache Axis2: C++, JAVA
+\item Apache CXF: JAVA (+ other middleware protocols)
+\item SOAP::WSDL: Perl
+\item SOAP4R: Ruby
+\item wsdl2objc: Objective C
+\item .NET, mono
+\end{itemize}
+\end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{SOAP example in Python/ZSI}
+server.py
+\begin{lstlisting}[language=python]
+from datetime import datetime
+from ZSI import dispatch
+
+def today (arg):
+ print "today arg:", arg
+ today = datetime.today ()
+ return str (today)
+def load (arg):
+ print "load arg:", arg
+ fd = open ("/proc/loadavg", "r")
+ loadavg = fd.read ()
+ sysload = loadavg.split ()
+ return sysload[0]
+
+dispatch.AsServer (port=8000, rpc=True)
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{SOAP example in Python/ZSI}
+client.py
+\begin{lstlisting}[language=python]
+from datetime import datetime
+from ZSI.client import Binding
+
+b = Binding (url='http://localhost:8000/')
+t = b.today (5)
+# t = 2014-02-18 15:59:50.571927
+c = datetime.strptime (t,
+ "%Y-%m-%d %H:%M:%S.%f")
+print "Today:", c.strftime ("%d.%m.%Y, %H:%M")
+print b.load ("string")
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{XMPP - Extensible Messaging and Presence Protocol}
+\begin{block}{Overview}
+\begin{itemize}
+\item protocol for MOM based on XML
+\item originally named Jabber
+\item used for
+\begin{itemize}
+ \item real-time Instant Messaging
+ \item publishing Presence Informations
+ \item Contactlist maintenance
+\end{itemize}
+\end{itemize}
+\end{block}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Extensible Messaging and Presence Protocol}
+\begin{block}{IM for Industry??}
+\begin{itemize}
+\item free and open standard (IETF RFC 6120, 6121)
+\item XMPP servers can be isolated, security is implemented (SASL, TLS)
+\item TCP and HTTP(S) transports are supported
+\item Priority support: multiple logins from same account,
+
+login with highest pority gets message
+\item not just used for IM:
+\begin{itemize}
+ \item smart grid
+ \item publish-subscribe systems
+ \item games
+ \item signalling for VoIP
+\end{itemize}
+\end{itemize}
+\end{block}
+\end{frame}
+
+\begin{frame}
+\frametitle{Extensible Messaging and Presence Protocol}
+\begin{block}{Extensible\dots}
+\begin{itemize}
+\item network management
+\item collaboration tools
+\item file sharing, gaming
+\item remote systems control and monitoring
+\item geolocation
+\end{itemize}
+\end{block}
+\end{frame}
+
+\begin{frame}
+\frametitle{Extensible Messaging and Presence Protocol}
+\begin{block}{Implemmentations}
+\dots too many to mention, have a look at
+
+http://xmpp.org/xmpp-software/
+
+for libraries, clients and servers
+\end{block}
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{XMPP Client Example}
+xmpp\_client.cpp
+\begin{lstlisting}[language=C++]
+#include <QtCore/QCoreApplication>
+#include "myclient.h"
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication app(argc, argv);
+
+ MyClient client;
+ client.connectToServer("qtapp@localhost",
+ "test");
+
+ return app.exec();
+}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XMPP Client Example}
+myclient.h
+\begin{lstlisting}[language=C++]
+#include <qxmpp/QXmppClient.h>
+
+class MyClient : public QXmppClient
+{
+ Q_OBJECT
+
+ public:
+ MyClient();
+ ~MyClient();
+
+ public slots:
+ void message_rx(const QXmppMessage&);
+};
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XMPP Client Example}
+myclient.cpp\#p1
+\begin{lstlisting}[language=C++]
+#include <qxmpp/QXmppMessage.h>
+#include <iostream>
+
+#include "myclient.h"
+
+MyClient::MyClient() : QXmppClient()
+{
+ bool check = connect(this,
+ SIGNAL(messageReceived(QXmppMessage)),
+ SLOT(message_rx(QXmppMessage)));
+
+ Q_ASSERT(check);
+ Q_UNUSED(check);
+}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{XMPP Client Example}
+myclient.cpp\#p2
+\begin{lstlisting}[language=C++]
+MyClient::~MyClient() { ; }
+
+void
+MyClient::message_rx(const QXmppMessage& msg)
+{
+ QString from = msg.from();
+ QString body = msg.body();
+
+ std::cout<<from.toStdString()<<": ";
+ std::cout<<body.toStdString()<<std::endl;
+
+ sendPacket(QXmppMessage("",from,body+"??"));
+}
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{XMPP Client Example}
+\begin{itemize}
+\item start ejabberd
+\item start psi
+\item start QT XMPP Client
+\item in psi: write a message to qtapp
+\item with wireshark can be seen that the connection is encrypted
+\end{itemize}
+\end{frame}
+
+
+\subsection{Celery}
+
+
+
+\subsection{DDS}
+
+
+
+\subsection{D-Bus}
+
+\begin{frame}
+\frametitle{D-Bus Communication Framework}
\begin{block}{Facts}
\begin{itemize}
-\item used by GNOME, KDE4, E17, XFCE4, HAL, \dots
+\item used by GNOME, KDE4, E17, XFCE4 and many applications
\item for message based local IPC
\item provides 1:1 - 1:n message passing
+\item there is a system and a session bus
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
-\frametitle{DBUS Communication Framework}
+\frametitle{D-Bus Communication Framework}
\begin{block}{Language Support}
\begin{itemize}
-\item C / C++
+\item C / C++ / Objective-C
\item JAVA
\item Python
\item Perl
@@ -27,38 +477,82 @@
\item Pascal
\item Ruby
\item Smalltalk
-\item Tcl
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
-\frametitle{DBUS Communication Framework}
+\frametitle{D-Bus Communication Framework}
\begin{block}{Framework Support}
\begin{itemize}
-\item QT4 (and QT3 backport)
-\item glib
-\item mono
-\item e\_dbus (Enlightenment, E17)
-\item .NET
+\item QT (C++ / Python)
+\item GLib (GDBus)
+\item .NET (mono)
+\item edbus (Enlightenment, E17)
\end{itemize}
\end{block}
\end{frame}
-\begin{frame}
-\frametitle{Functional Principle}
-\begin{center}
-\includegraphics[height=0.8\textheight]{images/dbus.png}
-\end{center}
-Source: http://dbus.freedesktop.org
+\begin{frame}[fragile]
+\frametitle{Desktop Integration}
+open home directory with the e17 file manager
+\begin{verbatim}
+% mdbus2 -i
+MDBUS2> org.enlightenment.FileManager \
+ /org/enlightenment/FileManager \
+ org.enlightenment.FileManager.OpenDirectory \
+ /home/local
+\end{verbatim}
\end{frame}
-\begin{frame}
-\frametitle{Desktop Integration}
-\begin{center}
-\includegraphics[height=0.8\textheight]{images/dbus-hal.png}
-\end{center}
-Source: http://www.redhat.com
+\begin{frame}[fragile]
+\frametitle{System Integration}
+e.g. hotplug events
+\begin{verbatim}
+% mdbus2 -s -l
+[SIGNAL]
+org.freedesktop.UDisks.DeviceAdded
+/org/freedesktop/UDisks :1.25
+('/org/freedesktop/UDisks/devices/sdb',)
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\begin{verbatim}
+[SIGNAL]
+org.freedesktop.DBus.ObjectManager.InterfacesAdded
+/org/freedesktop/UDisks2 :1.40
+('/org/freedesktop/UDisks2/drives/WD_My_Passport_0748_57584D314335325839363238',
+{'org.freedesktop.UDisks2.Drive':
+ {'Vendor': <'WD'>, 'Model': <'My Passport0748'>,
+ 'Revision': <'1015'>, 'Serial': <'57584D314335325839363238'>,
+ 'WWN': <''>, 'Id': <'WD-My-Passport-0748-57584D314335325839363238'>,
+ 'Configuration': <@a{sv} {}>, 'Media': <''>,
+ 'MediaCompatibility': <@as []>, 'MediaRemovable':<false>,
+ 'MediaAvailable': <true>, 'MediaChangeDetected': <true>,
+ 'Size':<uint64 1000170586112>,
+ 'TimeDetected': <uint64 1392720111627238>,
+ 'TimeMediaDetected': <uint64 1392720111627238>,
+ 'Optical': <false>, OpticalBlank': <false>,
+ 'OpticalNumTracks': <uint32 0>,
+ 'OpticalNumAudioTracks': <uint32 0>,
+ 'OpticalNumDataTracks': <uint32 0>,
+ 'OpticalNumSessions': <uint32 0>,
+ 'RotationRate': <-1>, 'ConnectionBus':<'usb'>,
+ 'Seat': <'seat0'>, 'Removable': <true>, 'Ejectable': <false>,
+ 'SortKey': <'01hotplug/1392720111627238'>,
+ 'CanPowerOff': <true>,
+ 'SiblingId':<'/sys/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0'>}})
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Example: Session Bus Signals}
+\begin{itemize}
+\item have a look at the code
+\item start pingserver and pingclient
+\item monitor signals with 'mdbus2 -l'
+\end{itemize}
\end{frame}
\subsection{CORBA}
@@ -74,12 +568,39 @@ Source: http://www.redhat.com
\end{frame}
\begin{frame}
+\frametitle{well-known implementations}
+\begin{itemize}
+\item omniORB: C++ / Python
+\item ACE/TAO: C++ including RTCORBA support
+\item MICO: C++ focus on security
+\item JacORB: JAVA
+\item IIOP.NET: .NET Remoting integration
+\item ORBit2: C with C++ and Python bindings
+\end{itemize}
+\end{frame}
+
+
+\begin{frame}
\frametitle{Functional Principle}
\begin{center}
-\includegraphics[height=0.8\textheight]{images/orb.jpg}
+\includegraphics[width=1.0\textwidth]{images/orb.jpg}
\end{center}
\end{frame}
+
+\begin{frame}
+\frametitle{Functional Principle}
+\begin{block}{IDL Interface Description Language}
+\begin{itemize}
+\item write Interface Description
+\item use IDL compiler to produce stubs and skeleton code
+\item implement interfaces and use interfaces in native language
+\item compile applications
+\end{itemize}
+\end{block}
+\end{frame}
+
+
\begin{frame}
\frametitle{Functional Principle}
\begin{block}{CORBA Services}