Software Suite für Smartphones

Größe: px
Ab Seite anzeigen:

Download "Software Suite für Smartphones"

Transkript

1 AUTOMATISIERUNGSTECHNIK B E T R I E B S I N F O R M AT I K N E U F E L D E N HÖHERE TECHNISCHE BUNDESLEHRANSTALT 4120 NEUFELDEN HÖFERWEG 47 Diplomarbeit 2010/11 Software Suite für Smartphones Lukas Hetzenecker ausgeführt an der Höheren Technischen Lehranstalt für Wirtschaftsingenieurwesen, Ausbildungsschwerpunkt Betriebsinformatik in Neufelden von Lukas Hetzenecker (Matr.Nr.: ) Betreuer Dipl.-Ing. Günther Oberaigner Neufelden, Mai 2011

2 Eidesstattliche Erklärung Ich erkläre an Eides statt, dass ich die vorliegende Diplomarbeit selbstständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die den benutzten Quellen wörtlich oder inhaltlich entnommenen Stellen als solche kenntlich gemacht habe. Neufelden, am 15. Mai Lukas Hetzenecker Seite 2

3 Danksagung An dieser Stelle möchte ich mich bei all jenen bedanken, die durch ihre fachliche und persönliche Unterstützung zur Entstehung dieser Diplomarbeit beigetragen haben. Besonderer Dank gebührt meinem Betreuer Dipl.-Ing. Günther Oberaigner, der mir stets mit Rat zur Seite gestanden ist. Dank den freiwilligen Übersetzern Chris Van Bael, Marián Kyral, Piotr Kalina, Mirko Allegretti, Franco Funes, Romuald Menant und Nikolai Stoilov kann die Anwendung bereits in 9 Sprachen verwendet werden. Weiters möchte ich mich bei den Firmen Trolltech und Nokia bedanken. Durch deren Qt-Toolkit wurde die Programmierung erheblich erleichtert. Vielen Dank! Seite 3

4 Abstract The application Open Mobile Suite provides a way to connect to a mobile phone using the Bluetooth technology. It allows you to synchronize your contacts, calendar entries and messages. Afterwards it is possible to edit your contacts or write text messages. You can also access the file system of your mobile phone. Thanks to the platform-independent programming language Python and the framework Qt, the application is available for Windows, Linux and Mac OS X without a single modification of the source code. Currently the mobile phone operating systems Android and S60 / Symbian^3 are supported. The simpleness of the application was really important. The installation and configuration was made as easy as possible. There are binary packages available for the most important operating systems and Linux distributions. When the application is started for the first time a dialog is opened that allows you to configure the application easily. In addition to the application a website was also created, which contains a support forum for users. Seite 4

5 Zusammenfassung Unter dem Projekt-Namen Open Mobile Suite wurde eine Anwendung entwickelt, welche die Kommunikation über Bluetooth zwischem einem Mobiltelefon und einem Computer ermöglicht. Zum Funktionsumfang zählt der Abgleich der Kontakte, Kalender-Einträge und Mitteilungen des Mobiltelefons mit dem PC. Nach dieser Synchronisierung können vom PC aus die Kontakte bearbeitet oder Mitteilungen geschrieben werden. Auch ein Zugriff auf das Dateisystem des Telefons ist möglich. Da nur plattform-unabhängige Programmiersprachen und Frameworks verwendet wurden, ist die Anwendung ohne Änderungen des Quellcodes unter den Betriebssystemen Windows, Linux und Mac OS X ausführbar. Auf Mobiltelefon-Seite werden derzeit die Plattformen Android, S60 und dessen Nachfolger Symbian^3 unterstützt. Es wurde großer Wert auf Einfachheit gelegt. Die Installation und Einrichtung wurde so unkompliziert wie möglich gestaltet. Dazu wurden Binärpakete für die wichtigsten Betriebssysteme erstellt. Beim ersten Start der Anwendung wird ein Dialog aufgerufen, welcher dem Benutzer die Einrichtung erleichtert. Neben der Anwendung selbst wurde auch noch eine Webseite erstellt, welche den Anwendern auch als Support-Forum dienen kann. Seite 5

6 Inhaltsverzeichnis 1. Projektbeschreibung Grundlagen Python Datentypen Lambda-Operator Ausnahmebehandlung Generatoren Global Interpreter Lock Python-Module PyS PyQt PyBluez PyOBEX Obexftp Matplotlib vobject und ldif Qt Framework Signale & Slots Model/View-Architektur Bluetooth Einführung Protokollstapel RFCOMM / L2CAP Service Discovery Protocol Interprozesskommunikation D-Bus Mitteilungen...21 Service-Name...22 Objekt-Pfade...22 Interfaces Versionsverwaltungssystem Apache Subversion (SVN) Tags und Branches Entwickler-Dokumentation Anfänge des Projekts Aktuelle Entwicklung Grundlegende Objekte Serialisierung Wizard beim ersten Start Logging Verbindungsaufbau Beispiel: PyS Beispiel: Android Geräteverwaltung Connection Manager GUI Seite 6

7 3.8. Kontaktverwaltung Connection Manager Kontaktliste der grafischen Oberfläche Anlegen, Bearbeiten und Löschen von Kontakten Kalenderverwaltung Dateiverwaltung Mitteilungsverwaltung Senden von Mitteilungen Empfangen von Mitteilungen Mitteilungs-Status Verlauf Statistiken Datenbank Plattformunabhängigkeit Übersetzungen Webseite Mailing List Bug Tracker Quellen Anhang Veröffentlichte News-Beiträge der Webseite New architecture of Open Mobile Suite Wichtige Mails der Mailing list series60-remote-devel : Status update [Re: Split series60-remote in two projects] Patches PyBluez Patch für Compiler VC Geräte-Klasse beim Bluetooth-Scan zurückgeben Verhindern einer Blockierung der GUI Behebung eines Fehlers beim Geräte-Scan...86 Seite 7

8 Abbildungsverzeichnis Abbildung 2-1: Model/View-Architektur...16 Abbildung 2-2: Bluetooth-Protokollstapel...18 Abbildung 3-1: Neue Architektur der "Open Mobile Suite"...25 Abbildung 3-2: Entwicklung der "Open Mobile Suite"...27 Abbildung 3-3: Willkommens-Seite...31 Abbildung 3-4: Geräte-Auswahl-Dialog...31 Abbildung 3-5: Plattform-Auswahl...32 Abbildung 3-6: Installation für Android...32 Abbildung 3-7: Installation für S Abbildung 3-8: Weitere Hinweise für S Abbildung 3-9: Weitere Hinweise für S Abbildung 3-10: Datenbank-Einrichtung...33 Abbildung 3-11: Logging-Dialog...34 Abbildung 3-12: Verbindungsaufbau...40 Abbildung 3-13: Geräteübersicht...42 Abbildung 3-14: Diagramm des Verbindungsaufbaus...43 Abbildung 3-15: Model/View-Klassen der Geräteverwaltung...52 Abbildung 3-16: DeviceScanWidget mit Gerät...53 Abbildung 3-17: DeviceScanWidget mit Fehlermeldung...53 Abbildung 3-18: Einstellungsdialog...54 Abbildung 3-19: Kontaktliste Abbildung 3-20: Suche in der Kontaktansicht...57 Abbildung 3-21: Bearbeitung eines Kontakts...58 Abbildung 3-22: Ansicht der Kalender-Einträge...59 Abbildung 3-23: Model/View-Klassen der Kalenderverwaltung...59 Abbildung 3-24: Bearbeitung von Kalender-Einträgen...60 Abbildung 3-25: Dateiverwaltung...62 Abbildung 3-26: Senden einer Kurzmitteilung...63 Abbildung 3-27: Theme "Fresh" des Chat-Dialogs...64 Abbildung 3-28: Theme "Perfect Pushpin"...64 Abbildung 3-29: Theme "Stock"...64 Abbildung 3-30: Theme "Clear"...64 Abbildung 3-31: Theme "Glossyk"...64 Abbildung 3-32: Theme-Auswahl im Einstellungsdialog...65 Abbildung 3-33: Mitteilungs-Status...69 Abbildung 3-34: Verlaufs-Ansicht...69 Abbildung 3-35: Statistiken Abbildung 3-36: Datenbank-Layout...71 Abbildung 3-37: Bearbeiten eines Kontaktes unter Mac OS X...72 Abbildung 3-38: Kontakliste und Bearbeitung unter Windows XP...72 Abbildung 3-39: Screenshot beim Bearbeiten der deutschen Übersetzung...73 Abbildung 3-40: Polnische Übersetzung...74 Abbildung 3-41: Niederländische und tschechische Übersetzungen...74 Abbildung 4-1: Screenshot der Projekt-Webseite...75 Abbildung 4-2: Downloadbereich der Webseite...76 Abbildung 5-1: Screenshot des Archivs der Mailing-Liste "series60-remote-devel"...77 Abbildung 6-1: Screenshot des Bug-Tracking-Systems...78 Seite 8

9 1. Projektbeschreibung Derzeit wird von den großen Handyherstellern kein Softwarepaket zur Verwaltung von Mobiltelefonen für alternative Betriebssysteme wie Linux oder Mac OS X angeboten. Ziel war die Erstellung einer Software Suite, die sich vom PC über Bluetooth mit einem Mobiltelefon verbindet und danach eine Verwaltung des Telefons am Computer ermöglicht. Dazu zählen speziell die folgenden Funktionen: Abgleich der Kontakt-Datenbank Anlegen, Bearbeiten und Löschen der Kontakte des Mobiltelefons Abgleich der Kalender-Einträge Anlegen, Bearbeiten und Löschen der Kalender-Einträge des Mobiltelefons Anzeigen einiger Systeminformationen des Mobiltelefons (wie Signalstärke, Akkuzustand,...) Versenden von SMS-Mitteilungen Benachrichtigungen beim Eintreffen neuer SMS-Mitteilungen Daneben gibt es noch einige weitere Funktionen, die dieses Produkt von Konkurrenzprodukten unterscheidet: Versenden und Empfangen von SMS-Mitteilungen in einem Chat-Fenster (ähnlich wie der Chat-Dialog gängiger Instant-Messaging-Programme) Anzeigen von Statistiken über das Mitteilungsverhalten Speichern des Mitteilungs-Verlaufes in einer Datenbank Zusätzlich wird auch noch der Export und Import von Kontakten und Kalendern unterstützt. Bei der Programmierung wurde besonderer Wert auf die Erweiterbarkeit gelegt. Derzeit werden Smartphones mit den Betriebssystemen S60 und Android unterstützt, durch den modularen Aufbau der Anwendung könnte dies jedoch einfach erweitert werden. Weiters wurde auch auf eine einfache Installation Wert gelegt. Dazu werden Binärpakete für Windows, einige Linux-Distributionen (wie Fedora oder Ubuntu) und Mac OS X bereitgestellt. Im Rahmen des Projekts wurde auch eine zu finden ist. Webseite erstellt, die unter Seite 9

10 2. Grundlagen 2.1. Python Durch die höhere Programmiersprache Python werden mehrere Programmierparadigmen unterstützt. Dazu zählen objektorientierte, aspektorientierte und funktionale Programmierung. Die Sprache steht unter der Python License und wird als Open Source anerkannt. Sie wurde mit dem Ziel entwickelt, möglichst einfach und übersichtlich zu sein. Daher werden Blöcke durch Einrückungen markiert. Dies steht im Gegensatz zu anderen Programmiersprachen, wie C, bei denen Klammern ( { } ) zur Abgrenzung von Codeblöcken verwendet werden. Als Beispiel dazu dient eine Fakultätsfunktion: def fakultät(x): if x > 1: return x * fakultät(x - 1) else: return 1 Außerdem verfügt Python über eine mächtige Standardbibliothek für alle denkbaren Aufgabenstellungen. Sie ist auch auf allen gängigen Betriebssystemen und Plattformen lauffähig. Die folgenden Kapitel liefern eine kurze Übersicht über die wichtigsten Eigenschaften der Sprache, die auch in meiner Diplomarbeit verwendet worden sind Datentypen Die Datentypen werden in Python dynamisch verwaltet, eine statische Typprüfung (wie etwa in C) existiert nicht. Um die Freigabe nicht mehr benutzter Speicherbereiche kümmert sich ein Garbage Collector. Neben den grundlegenden Datentypen (wie Integer) werden auch beliebig große Ganzzahlen (long) sowie komplexe Zahlen unterstützt. Zeichenketten sind (wie in Java) unveränderliche Objekte (immutable). Operationen, die eine Zeichenkette verändern, führen dazu, dass eine neue Zeichenkette zurückgegeben wird. Es gibt 3 verschiedene Gruppen von Datentypen: Skalare zum Beispiel Ganzzahlen (int), Ganzzahlen mit beliebig vielen Stellen (long), Fließkommazahlen (float), komplexe Zahlen (complex) und Zeichenketten (str / unicode) Sequenzen nehmen eine Folge anderer Objekte auf. Sequenzen werden unterteilt in Listen (list) und Tupel (tuple). Seite 10

11 Assoziative Listen Dictionaries (dict) erlauben den Zugriff auf Werte über einen Schlüssel (key), der auch nicht-numerisch sein kann Lambda-Operator Lambda-Funktionen sind anonyme Funktionen mit einer beliebigen Anzahl an Parametern, die einen Ausdruck ausführen und dessen Ergebnis zurückliefern: >>> f = lambda x, y : x y >>> f(1,1) 2 Dies ist vor allem in Kombination mit map-, filter- und reduce-funktionen vorteilhaft, wie folgende Beispiele aus meiner Diplomarbeit zeigen: possibledates = filter(lambda item: daysdicttoday(item, first.date())>currentday, days) In der Liste possibledates werden alle Tage gespeichert, die größer als der aktuelle sind. Dazu muss vorher das Dictionary item noch in einen Integer-Wert umgewandelt werden, der für den aktuellen Tag steht. Dazu wird eine lambda-funktion verwendet. self.connect(self.thread, SIGNAL("finished()"), lambda: self.emit(signal("importcomplete"))) Hier wird das Signal finished ausgelöst, nachdem ein Thread seine Arbeit beendet hat Ausnahmebehandlung Durch einen try... except Block können während der Laufzeit Fehler abgefangen werden. while True: try: num = raw_input("eine Zahl eingeben: ") num = int(num) break except ValueError: print("eine _Zahl_, bitte!") In diesem Beispiel wird so lange nach einer Zahl gefragt, bis die Eingabe in einen Integer umgewandelt werden kann Generatoren Ein Generator ist eine Funktion, die bei jedem Aufruf das nächste Element einer virtuellen Sequenz zurückgibt. Sie ist dabei einer normalen Funktion sehr ähnlich. Hier ist ein Beispiel einer solchen: def range_generator(max): i = 0 while i < max: yield i i = 1 Seite 11

12 Mit Hilfe des yield-statements können die einzelnen Werte einer virtuellen Sequenz zurückgegeben werden. Durch ein return-statement wird der Programmablauf einer normalen Funktion unterbrochen und der Kontrollfluss an die nächsthöhere Ebene zurückgegeben. Beim Erreichen einer yield-anweisung wird jedoch die aktuelle Position innerhalb der Generatorfunktion gespeichert. Es erfolgt ein Rücksprung in das aufrufende Programm mit dem hinter yield angegebenen Wert. Beim nächsten Iteratoraufruf macht Python dann hinter dem zuletzt ausgeführten yield weiter und kann wieder auf die alten lokalen Variablen, in dem Fall i, zugreifen. Erst wenn das Ende der Funktion erreicht wird, beginnen die endgültigen Aufräumarbeiten Global Interpreter Lock In interpretierten Programmiersprachen wie es etwa Python oder Ruby sind gibt es einen Lock, der sicherstellt, dass gleichzeitig nur ein Thread in der virtuellen Maschine der Python-Implementierung CPython ausgeführt wird. Das geht jedoch auf Kosten der Parallelität von Multi-Prozessor-Maschinen. Anwendungen, die in einer Sprache geschrieben sind, die Global Interpreter Locks verwenden, müssen in separate Prozesse aufgeteilt werden, um vollständige Nebenläufigkeit zu erreichen, da jeder Prozess seinen eigenen Interpreter und daher seinen eigenen Global Interpreter Lock hat. In Erweiterungs-Modulen für Python, welche in C geschrieben sind, kann durch die Makros Py_BEGIN_ALLOW_THREADS bzw. Py_END_ALLOW_THREADS ein Block erzeugt werden, in denen I/O-Funktionen des Systems oder länger laufende Berechnungen, die keinen Zugriff auf Python-Objekte benötigen, durchgeführt werden. Seite 12

13 2.2. Python-Module Neben der umfangreichen Standardbibliothek von Python machte ich auch noch von einigen anderen Modulen Gebrauch, die von Drittanbietern entwickelt worden sind PyS60 Python for S60 (oder kurz PyS60) ist Nokias Portierung von Python auf das Betriebssystem S60. Neben den Features von Python werden noch Module angeboten, die speziell auf diese Plattform abgestimmt sind. Dazu zählen zum Beispiel die Möglichkeiten, auf die SMS-Mitteilungen zuzugreifen (inbox-modul), SMS- oder MMSMitteilungen zu schreiben (messaging), die Kontakt-Datenbank zu lesen und zu bearbeiten (contacts) oder Informationen zum Gerät anfordern zu können (sysinfo). Ferner kann auch beispielsweise auf die Kamera zugegriffen werden und es besteht die Möglichkeit Anrufe zu tätigen. Von diesen Funktionen mache ich aber derzeit noch keinen Gebrauch PyQt4 PyQt ist die Anbindung des GUI-Frameworks Qt an Python. Das ist eine Alternative für Tkinter1, welches direkt mit Python ausgeliefert wird. Qt wird im Kapitel 15 genauer beschrieben PyBluez PyBluez ist ein Wrapper der System-Bibliotheken für Bluetooth, damit Entwickler schnell und einfach Bluetooth-Anwendungen unter Python erstellen können. Dazu können folgende Bluetooth-Stacks (Implementierungen des Bluetooth ProtokollStacks) genutzt werden: Windows Widcomm: Dieser Bluetooth-Stack war der erste für Windows. Es wurde anfangs von Widcomm Inc. Entwickelt. Diese Firma wurde aber später von der Broadcom Corporation übernommen. Microsoft Windows Stack: Von diesem Stack werden nur externe und interne USB-Dongles unterstützt, jedoch keine mit PCI- oder seriellen Verbindungen. Seit Windows XP SP 2 ist dieser direkt in Windows inkludiert. Linux BlueZ: Das Ziel dieses Stack ist es, eine Implementierung der Bluetooth wireless standards specifications unter Linux zu schaffen. Er unterstützt dabei alle grundliegenden Bluetooth-Protokolle und ist für alle Linux-Kernel ab Version verügbar. Unter Mac OS X wird das Modul lightblue verwendet, das auf den unter OS X integrierten Bluetooth-Stack zugreift. 1 Tkinter (Tk interface) ist ein Wrapper für das Tk-Toolkit für die Programmiersprache Python Seite 13

14 Für PyBluez habe ich auch einige Patches entwickelt (siehe Anhang Patches für PyBluez, Seite 82). Einer davon war für die Unterstützung von Windows Vista und Windows 7, da dieses Modul unter diesen Betriebssystemen nicht kompiliert werden konnte und daher auch nicht funktionierte. Ein weiterer Patch machte es möglich, durch einen Geräte-Scan die Klasse des Gerätes bestimmen zu können. Der bisher letzte änderte zwei Zeilen, um während der Initialisierung des Microsoft-Stacks Threads zu erlauben und beschleunigte daher den Verbindungsvorgang PyOBEX Dieses von David Boddie entwickelte Modul ist eine Implementierung des OBEXProtokolls für Python, das auf der frei verfügbaren Bluetooth specification basiert. OBEX OBEX (OBject EXchange) ist ein Kommunikations-Protokoll zum Austausch binärer Daten zwischen Geräten. Es wurde ursprünglich für Infrarot entwickelt, es gibt aber auch Portierungen für Bluetooth, USB und WAP. Es ist die Basis für einige Higher-Level-Profile, unter Bluetooth beispielsweise das Object Push Profile, File Transfer Profile und Synchronization Profile. In meiner Anwendung verwende ich den BrowserClient von PyOBEX, um im DateiBrowser auf die Verzeichnisse und Dateien zugreifen zu können. Es wird auch verwendet um die SIS-Dateien beim ersten Start an das Telefon zu senden Obexftp Python-Obexftp ist ein Wrapper für Obexftp und dient als Alternative für PyOBEX. Es wird unterstützt, da die meisten Linux-Distribution Pakete für diese Bibliothek anbieten, für PyOBEX allerdings nicht. Obexftp ist jedoch nicht für Windows und Mac OS X verfügbar Matplotlib Matplotlib ist eine Bibliothek zum Erzeugen und grafischem Darstellen von mathematischen Funktionen und Statistiken. Diese Plots können auch in eine Vielzahl von Datei-Formaten wie SVG oder PNG exportiert werden. Es wird zum Anzeigen der Mitteilungs- und Kontaktstatistiken verwendet. Diese werden auch als PNG- oder SVG- Bilder im HTML-Export angezeigt vobject und ldif Die Bibliothek vobject (in Fedora als Paket python-vcobject) dient zum Parsen und Erzeugen von vcard- und vcalendar-dateien, ldif (unter Fedora python-ldap) macht das gleiche für LDIF, könnte aber auf LDAP-Directory-Server zugreifen. Diese Module werden zum Exportieren und Importieren der Kontakte verwendet. Seite 14

15 2.3. Qt Framework Qt ist eine Bibliothek für die plattformübergreifende Programmierung grafischer Benutzeroberflächen. Das Framework wurde für die Programmiersprache C geschrieben, es gibt jedoch auch Anbindungen für viele andere Sprachen. Dazu zählen PyQt und PySide für Python. Zu den prominenten Programmen, die dieses Toolkit verwenden, gehören die Desktopumgebung KDE, Google Earth, der Webbrowser Opera, die VoIP-Software Skype und der Media-Player VLC. Die Firma Trolltech war ursprünglich für die Entwicklung von Qt zuständig, diese wurde aber Anfang 2008 von Nokia aufgekauft. Die Entwicklung wird seit dem in der Sparte Qt Developement Frameworks fortgeführt. Da dieses Framework als Open Source-Software veröffentlicht wurde, tragen auch viele andere Entwickler zu diesem Projekt bei. Es wird für Linux, Windows und Mac OS X ein vollständiges SDK angeboten, das auch eine umfangreiche Dokumentation enthält. Die Plattformen Embedded Linux, Windows CE, Symbian und Maemo werden auch offiziell unterstützt, externe Entwickler konnten bereits einen Großteil des Frameworks auf das iphone und Android portieren. Die gesamte Bibliothek ist in Module gegliedert. Dadurch können die erstellten Programme kleiner und schneller werden, da nur die verwendeten Module eingebunden werden müssen. Diese Module habe ich in meiner Diplomarbeit verwendet: QtCore: Kern-Klassen, die von allen anderen Modulen genutzt werden QtGui: Dieses Modul dient zur Erstellung von grafischen Benutzeroberflächen verwendet für: die gesamte Benutzeroberfläche, Model/View-Programmierung QtNetwork: Durch dieses Modul wird Netzwerk-Programmierung einfach und portabel verwendet für: Update-Checker QtSql: Datenbankintegration in Qt, die eine Vielzahl von Datenbankmanagementsystemen unterstützt verwendet für: MySQL- und SQLite-Datenbank zum Speichern der Kontakte, Mitteilungen und Kalendereinträge QtXml: Stream-Reader und -Writer für XML-Dokumente verwendet für: Parsen der Ordnerliste, die man über das OBEX-Protokoll bekommt QtSvg: Klassen zur Verwendung von skalierbaren Vektorgrafiken verwendet für: Animation beim Scannen nach Bluetooth-Geräten Webkit: Darstellung von Webseiten verwendet für: Verlaufs-Browser im Chat-Fenster Seite 15

16 Signale & Slots Signale sind Meldungen, die beim Eintreten eines bestimmten Ereignisses abgegeben (emittiert) werden. Ein Slot ist im Prinzip eine normale Funktion, welche mit einem oder mehreren Signalen verbunden ist. Beim Emittieren eines Signals werden dann die ihm zugehörigen Slots aufgerufen. Dieses Konzept hat den Vorteil, das es einfacher als Rückruffunktionen (Callbacks) zu verwenden ist Model/View-Architektur Die Model/View-Architektur wurde in Qt4 eingeführt. Diese soll vor allem die Trennung der Form (Benutzeroberfläche) und den Inhalt (Daten) vereinfachen. Daher gibt es eine Modell-Klasse, welche das Interface für die Daten bereitstellt, und eine View-Klasse, die auf diese Daten zugreift und auf der grafischen Benutzeroberfläche anzeigt. Die Modell-Klasse stellt jedoch nur Methoden zum Zugriff auf die Daten bereit. Die Daten selber können jedoch auch wo anders liegen, zum Beispiel in einer Datenbank oder in einer Datei. Durch die Aufteilung der Programmlogik in Modell- und View-Klassen wird das Programm einfacher und besser strukturiert. Im Qt-Framework gibt es einige Basisklassen, die das Anzeigen der Daten ermöglichen. Dazu zählt beispielsweise die Klasse QListView, welche die Daten in einer Liste darstellt. Weiters gibt es noch QTreeView, die eine Baum-Struktur ermöglicht und QTableView, welche die Daten in einer Tabelle darstellt. Daneben gibt es auch noch Delegate-Klassen, welche die einzelnen Einträge beispielsweise in einer QListView zeichnen. Abbildung 2-1: Model/View-Architektur Seite 16

17 2.4. Bluetooth Einführung Bluetooth ist eine Technologie um Peripherie-Geräte wie Mäuse oder Mobiltelefone drahtlos verbinden zu können. Zu den Vorteilen zählt, dass Bluetooth kostengünstig und stromsparend ist. Da es nur auf kurze Distanz funktioniert wird es nicht für DrahtlosNetzwerke verwendet. Es dient eher als Ersatz für IrDA2. Im Gegensatz zu IrDA muss bei Bluetooth keine direkte Sichtverbindung bestehen und es kann eine weitere Distanz als 1 Meter überbrückt werden. Zur Kommunikation wird von Bluetooth wie auch von Geräten nach dem b- oder g- Standard - das 2,4 Ghz-ISM-Band verwendet. Dafür ist keine Lizensierung erforderlich. Es basiert auf Ad-Hoc Piconetzen, das sind lokale Netzwerke mit einer kleinen Ausdehnung, die üblicherweise keine besondere Infrastruktur benötigen. Jedes Bluetooth-Gerät kann gleichzeitig mit bis zu 7 Teilnehmern in diesem Netzwerk kommunizieren. Um Robustheit gegenüber Störungen zu erreichen, wird ein Frequenzsprungverfahren (Frequency Hopping) eingesetzt, bei dem das Frequenzband in 79 verschiedene Frequenzstufen im 1-MHz-Abstand eingeteilt wird, die normalerweise bis zu mal in der Sekunde gewechselt werden. Das bildet auch eine Grundlage für die Sicherheit, da es schwierig vorherzusagen ist welche Frequenz als nächstes benutzt wird. Jeder jemals erzeugt Bluetooth-Chip ist mit einer global eindeutigen 48 Bit langen Adresse versehen. Diese wird als Bluetooth-Adresse bezeichnet und kann mit der MAC-Adresse von Netzwerkadaptern verglichen werden (es werden sogar beide von der gleichen Organisation der IEEE Registration Authority verwaltet). Sie wird zur Zeit der Herstellung des Chips zugewiesen und ist weltweit einzigartig und unveränderbar. Um mit anderen Geräten kommunizieren zu können, muss es Möglichkeiten geben, um diese Adresse in Erfahrung zu bringen. 2 Die Infrared Data Association (IrDA) spezifiziert das Infratot-Protokoll Seite 17

18 Protokollstapel Die grundlegenden Protokolle können nach dem in der rechten Abbildung erkennbaren Schema unterteilt werden: Funkschicht (Radio): In dieser Schicht wird die Funkübertragung, die genutzten Frequenzen und die Sendeleistung geregelt. Basisband (Baseband): Es werden die Mechanisamen zum Verbindungsaufbau, die Rahmenstruktur und das Zeitverhalten geregelt. Sie entspricht in etwa der Sicherungsschicht des OSI-Modells. Link Manager: Es steuert den Verbindungsaufbau und die Verbindungsverwaltung zwischen zwei Geräten. Er beinhaltet auch Sicherheitsund Authentifizierungsfunktionen. L2CAP (Logical Link Control and Adaption Protocol): Zusammen mit dem LMP stellt es die Sicherungsschicht des Bluetooth-ProtokollStacks dar. Es dient zum Aufbau und zur Konfiguration von logischen Kanälen. Abbildung 2-2: Bluetooth-Protokollstapel RFCOMM (Radio Frequency Communication): Dieses Protokoll stellt eine Befehlssteuerung dar, die es erlaubt bis zu 60 serielle Schnittstellen zu emulieren. Daher wird es auch als Serial Port Emulation bezeichnet. SDP (Service Discovery Protocol): Das SDP dient zur Erkennung und Suche nach Diensten mit bestimmten Eigenschaften und der Beschreibung von Diensten innerhalb der Funkreichweite eines Bluetooth-Gerätes. OBEX (Object Exchange): Dieses vom IrDA-Standard bekannte Protokoll kann zum Austausch von Dateien, Kalenderinformationen oder Visitenkarten verwendet werden. Es arbeitet im klassischen Client-Server-Modell und enthält PUT und GET -Methoden zur Datenübertragung. Audio: Audio-Anwendungen können direkt die Basisbandschicht nutzen, nachdem die Audio-Signale entsprechend kodiert wurden. Darüber befinden sich Anwendungen und Profile. Die Spezifikation von Bluetooth umfasst einige Anwendungen, die Standardlösungen für bestimmte Nutzungsszenarien für bestimmte Anwendungsfälle umfassen. Diese werden als Profile bezeichnet. Dazu zählen beispielsweise das BIP (Basic Imaging Profile) zum Übertragen von Bilddaten, DUN (Dial- up Networking Profile) als Internet-Einwahlverbindung, SAP (SIM Access Profile) zum Zugriff auf die SIM-Karte und SYNC (Synchronisation Profile) zum Datenabgleich. Seite 18

19 RFCOMM / L2CAP Das RFCOMM-Protokoll bietet eine ähnliche Zuverlässigkeit wie TCP (Transmission Control Protocol) im TCP/IP-Protokoll-Stack. Es dient zum Aufbau einer Punkt-zu-PunktVerbindung von 2 Geräten, über die zuverlässig Datenströme aufgebaut werden können. Wenn Daten nicht transportiert werden können, wird die Verbindung abgebrochen und ein Fehler zurückgegeben. Der größte Unterschied zu TCP ist die Wahl der Port-Nummer. Während TCP verschiedene Ports auf einer Maschine zulässt, hat RFCOMM nur 30 Ports. UDP (User Datagram Protocol) wird in Situationen verwendet, wo die Zuverlässigkeit nicht wichtig ist und man den Overhead von TCP vermeiden möchte. Diese Kriterien treffen auch auf L2CAP zu. L2CAP ist sowohl ein verbindungsorientiertes als auch verbindungsloses Protokoll zum Austausch von Datagrammen einer fixen Länge. Die Zuverlässigkeit von L2CAP kann in 3 Verfahren eingeteilt werden: Verlorene Pakete niemals neu übertragen Verlorene Pakete bis zu einem Verbindungsfehler neu übertragen Paket verwerfen, wenn es innerhalb einer bestimmten Zeit ( ms) nicht bestätigt wird. Dies ist für zeitkritische Anwendungen nützlich. Die folgende Tabelle von The Use of Bluetooth in Linux and Location Aware Computing von Albert Huang bietet einen Überblick über die Situationen, in welchen RFCOMM oder L2CAP gewählt werden sollte: Requirement Internet Bluetooth Reliable, streams-based TCP RFCOMM Reliable, datagram TCP RFCOMM or L2CAP with infinite retransmit Best-effort, datagram UDP L2CAP ( ms retransmit) Table 2.1: A comparison of the requirements that would lead us to choose certain protocols. Best-e ffort streams communication is not shown because it reduces to best-e ffort datagram communication. Diese Tabelle bietet eine Übersicht über die Port-Nummern: protocol terminology reserved/well-known port dynamically assigned ports TCP port UDP port RFCOMM channel none 1-30 L2CAP PSM odd numbered odd numbered Table 2.2: Port numbers and their terminology for various protocols Seite 19

20 Service Discovery Protocol Das Service Disvocery Protocol (SDP) definiert das Aufspüren von Services und Eigenschaften eines Bluetooth-Gerätes. Die Kommunikation erfolgt dabei über einen SDP-Server und einen SDP-Client. Der Server verwaltet dabei eine Liste von Service Records, welche die auf dem Gerät laufenden Services beschreiben. Jeder Service Record beinhaltet Informationen über ein einzelnes Service. Ein Client kann diese Informationen durch einen SDP request abfragen. Auf jedem Bluetooth-Gerät soll nur ein SDP-Server laufen. Falls das Gerät nur als Client betrieben wird kann auf den SDP-Server verzichtet werden. Für die genauen Details des Protokolls wird auf das Kapitel SERVICE DISCOVERY PROTOCOL (SDP) SPECIFICATION der BLUETOOTH SPECIFICATION verwiesen. Seite 20

21 2.5. Interprozesskommunikation Mit dem Begriff Interprozesskommunikation (IPC) bezeichnet man den den Informationsaustausch zwischen nebenläufigen Prozessen (auch zwischen Threads) D-Bus D-Bus ist ein freies IPC-Framework, welches speziell für die Bedürfnisse von Desktopumgebungen geschaffen wurde. Es sollte auch die damals verfügbaren IPCFrameworks (DCOP3 für KDE und CORBA4 für GNOME) vereinigen und ein einheitliches Framework schaffen. Es wird im Rahmen eines freedesktop.org-projekts entwickelt und derzeit von fast jeder modernen Linux-Distribution eingesetzt. Daneben existieren auch noch Portierungen für andere Betriebssysteme, darunter auch einige Unix-Derivate (wie Mac OS X) und Windows. D-Bus wird verwendet um die Kommunikation von Programmen untereinander zu ermöglichen. Dazu dient vor allem die Bibliothek libdbus, die es ermöglicht Nachrichten auszutauschen. Diese Programme können auch bei Bedarf gestartet werden, also wenn die Services von einem Daemon-Programm benötigt werden. D-Bus unterstützt dabei einen systemweiten Dienst (system daemon) und einen benutzerspezifischen (per-user-login-session daemon). Dadurch wird die Kommunikation zwischen Prozessen auf dem System-Level (wie Drucker oder andere Hardware-Services) und normalen Benutzer-Anwendungen möglich. Die miteinander kommunizierenden Anwendungen können dabei entweder auf dem gleichen Rechner laufen, oder dank TCP/IP auch auf verschiedenen Rechnern im Netzwerk. Die libdbus-bibliothek hat außer einem XML-Parser (libxml oder expat) keine weiteren Abhängigkeiten, die Bindings für weitere Frameworks (also Qt, GLib, Java, C#, Python u.s.w.) sind einfacher zu verwenden, bringen aber auch mehr Abhängigkeiten zu weiteren Bibliotheken. Die low-level-bibliothek libdbus sollte daher nicht direkt von den Entwicklern verwendet werden, sondern dient nur als Basis für die verschiedenen darauf aufbauenden Bindings Mitteilungen Auf dem unteren Level kommunizieren Anwendungen über Mitteilungen. Dabei wird ein schnelles, binäres Protokoll verwendet, um diese weiterzuleiten. Hier wurde auf geringe Latenz und geringen Overhead Wert gelegt. Mitteilungen leiten die Remote Procedure Calls (RPC) weiter und geben danach die Antworten oder Fehler davon zurück. Es gibt noch eine spezielle Art der Mitteilung: die Signal-Nachricht. Diese hat kein klar definiertes Ziel, sondern wird an alle daran interessierten Teilnehmer gesendet (Opt-In- Mechanismus). 3 4 Desktop Communication Protocol, ein einfaches IPC-Framwork Common Object Request Broker Architecture Seite 21

22 Durch das QtDBus-Modul muss sich der Programmierer über das Konzept der Mitteilungen keine Gedanken machen, da dadurch ein einfacher, objekt-orientierter Ansatz zur Verfügung steht Service-Name Anwendungen registrieren sich einen Service-Namen um über D-Bus mit anderen Anwendungen kommunizieren zu können. Dieser Name wird verwendet um eine Nachricht von einer Anwendung zu einer anderen weiterzuleiten. Das Format dieses Namens ist dem eines Hostnamen in einem Netzwerk sehr ähnlich, da er auch durch Punkte getrennt wird. Üblicherweise wird dieser Name nach dem Domain-Namen der Organisation gewählt, zum Beispiel net.sourceforge.openmobilesuite.connectionmanager Objekt-Pfade Die Services exportieren nun einzelne Objekte. Die Namen dieser Objekte sind hierarchisch aufgebaut und werden mit Schrägstrichen (/) getrennt. Im Vergleich mit Web-Adressen ist dieser Teil der Pfad der Adresse. So kann das Service net.sourceforge.openmobilesuite.connectionmanager nun zum Beispiel die Objekte /Devices, /Contacts und /Database exportieren Interfaces Interfaces sind ähnlich abstrakter Klassen aus C bzw. dem interface-keyword aus Java. Diese bestimmen den Vertrag zwischen dem aufrufenden und dem aufgerufenem Objekt. Das Interface stellt daher einen Namensraum für Methoden und Signale bereit und wird durch einen Namen eindeutig identifiziert. Dieser startet wieder mit dem umgekehrten Domain-Namen. Seite 22

23 Versionsverwaltungssystem Apache Subversion (SVN) Das Versionsverwaltungssystem Apache Subversion (oft wegen des Kommandos als svn abgekürzt) ist freie Software. Es wird unter der Apache-Lizenz veröffentlicht. Es dient zur Versionsverwaltung von Dateien und Verzeichnissen in Form einer einfachen Revisionszählung. Dabei erfolgt die Versionierung in einem zentralen Projektarchiv (repository). Dies unterscheidet es von dezentralen Systemen, wie etwa git. Subversion ist eine Weiterentwicklung von CVS (Concurrent Versions System) und hat diesem gegenüber den Vorteil, dass Dateien und Verzeichnisse umbenannt und verschoben werden können, ohne die Versionsgeschichte zu verlieren. Die Entwicklung dieses Versionsverwaltungssystems wurde 2000 begonnen und erreichte 2004 die erste stabile Version. Die aktuell verfügbare Version ist 1.6 (März 2011) Tags und Branches Ein Repository wird normalerweise in drei Bereiche aufgeteilt: branches, trunk und tags. Im branches-pfad (branches = Verzweigungen) wird die grundlegende Entwicklung eines Projekts durchgeführt. Zu den grundlegenden Entwicklungen zählen weitgreifende Überarbeitungen und komplett neu entwickelte Bereiche. Im trunk-pfad (trunk = Stamm) wird die Entwicklung der aktuellen Version durchgeführt. Diese sollte immer möglichst stabil sein und keine großen, inkompatiblen Neuerungen enthalten. Im tags-pfad (tags = Markierungen) befinden sich Kopien von veröffentlichten Versionen. Diese stellen eine Kopie aus dem trunk- oder einem branch-verzeichnis dar. Dieser Pfad ist nicht für Entwicklungen vorgesehen, sondern stellt eher einen Schnappschuss dar. Seite 23

24 3. Entwickler-Dokumentation 3.1. Anfänge des Projekts Im Jahr 2006 hörte ich das erste Mal von der Portierung der Programmiersprache Python auf die Smartphone-Plattform S60, auf der mein damaliges Mobiltelefon basierte. Als im Juli 2007 die erste stabile Version davon freigegeben wurde 5, dachte ich erstmals an die Implementierung einer Weiterleitung der am PC geschriebenen SMS-Nachrichten zu meinem Mobiltelefon. Nach langer Recherche wurde ich auf das Projekt btsms6 aufmerksam, das genau meinen Vorstellungen entsprach. Es war sehr einfach geschrieben (der ganze Programmcode mitsamt der Oberfläche bestand aus weniger als 400 Zeilen) und hatte außer der SMS-Weiterleitung keine weiteren Funktionen. Da es bei mir Probleme mit dem Senden von Umlauten in SMS-Mitteilungen gab machte ich mich mit dem Quellcode vertraut und besserte kleine Fehler aus. Mit der Zeit erweiterte ich das Programm um einige weitere Funktionen (wie das Speichern der Mitteilungen in einer Datenbank). Da ich die auf Tkinter7 basierende Oberfläche nicht mochte, schaute ich mich nach Alternativen um. Ich entschied mich für das Toolkit Qt, das nativ wirkende Oberflächen für die Betriebssysteme Windows, Linux und Mac OS X versprach 8. Dieses Toolkit wird auch von der Linux-Desktopumgebung KDE benutzt, welche ich verwende. Am 29. August 2007 begann ich mit der Entwicklung unter diesem Toolkit und veröffentlichte diese Arbeit unter dem Namen Series60-Remote in einem Versionsverwaltungssystem auf Sourceforge 9. Als ich die für mich wichtige Mitteilung- und Kontaktverwaltung in einer Datenbank fertiggestellt hatte machte ich einige Monate Pause. Erst im Februar 2009 beschäftigte ich mich wieder mit diesem Projekt und veröffentlichte neben einer Version für das Betriebssystem Linux auch erstmals eine für Windows. Im Rahmen der Diplomarbeit habe ich dieses Projekt nun vorangetrieben. Alle Änderungen seit dem Start der Diplomarbeit am 10. Juni 2010 sind Teil davon (toter Link, archiviert unter ) Tk interface, ein Toolkit für grafische Benutzeroberflächen für die Programmiersprache Python - Qt uses the native graphics APIs of each platform it supports, taking full advantage of system resources and ensuring that applications have native look and feel. Seite 24

25 3.2. Aktuelle Entwicklung Ein wichtiger Punkt in der aktuellen Entwicklung ist die Unterstützung weiterer Plattformen für Smartphones. Neben S60 und Symbian^3 soll in Zukunft auch Android unterstützt werden. Dazu wird eine Server-Anwendung in der Programmiersprache Java geschrieben. Das Projekt wird von Series60-Remote in Open Mobile Suite umbenannt. Abbildung 3-1: Neue Architektur der "Open Mobile Suite" Ein weiterer wichtiger Punkt ist die Änderung der Architektur der Anwendung: Früher bestand sie aus einem Prozess, der für alles Oberfläche, Datenbank und BluetoothVerbindung zuständig war. Diese drei Komponenten sollen nun in eigene Anwendungen ausgegliedert werden. Das dient vor allem zur Umgehung der Global Interpreter Lock von Python. Diese wird genauer im Kapitel Global Interpreter Lock (Seite 12) beschrieben. Weitere Details dazu findet man in der Ankündigung auf der Webseite. Diese findet man im Anhang im Kapitel New architecture of Open Mobile Suite (Seite 80). Der zentrale Prozess ist nach diesem Aufbau nun der Connection Manager, welcher über das DBus-Interface net.sourceforge.openmobilesuite.connectionmanager erreichbar ist. Er kümmert sich um die Verwaltung der (SQLite- oder MySQL-) Datenbank und stellt eine einfache API zur Verfügung, mit der die verschiedenen Verbindungen einfach verwaltet werden können. Er benachrichtigt weiters auch die verschiedenen Clients in etwa Benutzeroberflächen bei Veränderungen mittels Signalen. Seite 25

26 Die Open Mobile Suite Connection stellt nun eine Verbindung zu dem Mobiltelefon her dabei werden sowohl die Plattformen S60/Symbian^3 als auch Android unterstützt. Durch dieses Konzept gestaltet sich die Portierung auf weitere Plattformen einfach. Diese sind über das Interface net.sourceforge.openmobilesuite.connections erreichbar, die Benutzeroberflächen sollten jedoch indirekt über den Connection Manager darauf zugreifen. Eine weitere Bluetooth-Verbindung wird durch den OBEX Connection Prozess ermöglicht, der einen Datei-Manager implementiert. Zu den Vorteilen dieser Architektur zählt auch die Möglichkeit, verschiedene Benutzeroberflächen verwenden zu können, ohne sich um die Logik dahinter Gedanken machen zu müssen. Neben der derzeit implementierten Oberfläche könnte man beispielsweise durch wenig Programmieraufwand ein Frontend erzeugen, das bei bestimmten kritischen Systemereignissen den Administrator per SMS benachrichtigt. Eine weitere Möglichkeit besteht in der Integration der Kontaktliste und des SMS-Versandes in bestehende Instant-Messaging-Applikationen, wie etwa Telepathy. Weiters kann auch der Chat-Verlauf in andere Anwendungen importiert werden. Dies ist vor allem für die KDEProjekte Nepomuk und Akonadi interessant, da so eine Verknüpfung zu anderen semantischen Daten möglich ist. Auf der Seite des Mobiltelefons läuft eine Server-Anwendung, die für S60 in Python und für Android in Java geschrieben ist. Anmerkung: Durch den Python-Profiler cprofile konnte die Laufzeit-Performance der alten Architektur (als alles noch aus einem Prozess bestand) analysiert werden. Dadurch konnten einige aussagekräftige Statistiken erzeugt werden. Es konnte beispielsweise festgestellt werden, dass die Methode zur Berechnung des ContactHashs sehr lange dauert (bei einer großen Datenbank mit mehr als 400 Kontakten kann diese Funktion bis zu 30 Sekunden in Anspruch nehmen). Da in dieser Zeit die Benutzeroberfläche nicht bedienbar ist und es für den Benutzer den Anschein hat, dass das Programm hängt, wurde diese Funktion in einen anderen Prozess verlegt. Seite 26

27 Abbildung 3-2: Entwicklung der "Open Mobile Suite" Die Entwicklung fand dabei in mehreren Zweigen des SVN-Archives statt. Nachdem einige Änderungen an der GUI gemacht wurden, konzentrierte sich die Entwicklung auf die Portierung zur Android-Plattform. Erst danach wurde die Anwendung in drei einzelne Prozesse aufgeteilt. Daneben wird auch noch der aktuell stabile Zweig (mit den Versionen 0.4.x) betreut. Seite 27

28 3.3. Grundlegende Objekte In dem Python-Module openmobilesuite.base sind einige grundlegende Objekte definiert, die in anderen Modulen (wie openmobilesuite.gui oder openmobilesuite.connectionmanager) verwendet werden. Dazu zählen beispielsweise die folgenden Klassen: Connection (openmobilesuite.base.element.connection) stellt eine aktive Verbindung zu einem Telefon dar Attribute: id: Eine für diese Verbindung eindeutige ID plugin: Das verwendete Verbindungs-Plugin device: Das Gerät (Instanz der Klasse Device), zu dem die Verbindung gehört ConnectionPlugin (openmobilesuite.base.element.connection_plugin) enthält Informationen, die zur Verbindung des Telefons notwendig sind Attribute: name: Der Name des Plugins executable: Das auszuführende Programm, das bei einer Verbindungsanforderung gestartet wird (z.b. openmobilesuite-connection-oms) bluetooth_servicename: Der Name des damit verbundenen Bluetooth-Services devices: Die durch dieses Plugin unterstützten Gerät-Typen fix_bluetooth_ports: Bluetooth-Ports, die einem gewissen Gerät-Typ fix zugeordnet sind (damit ist kein Service-Scan notwendig) Device (openmobilesuite.base.element.device) stellt ein (in der Datenbank gespeichertes oder verbundenes) Mobiltelefon dar Attribute: id: Die in der Datenbank gespeicherte ID des Gerätes name: Der sichtbare Name des Gerätes (durch den Bluetooth-Scan bekannt) bluetooth_address: Adresse des Gerätes in der Form xx:xx:xx:xx:xx:xx bluetooth_port: Der Bluetooth-Port, zu dem eine Verbindung besteht bluetooth_device_class: Die Geräte-Klasse des Gerätes device_type: Der Typ des Gerätes (Instanz einer von device.general abgeleiteten Klasse) values: In diesem Dictionary werden die Systeminformationen gespeichert SysinfoValue (openmobilesuite.base.element.device_sysinfo_value) ist ein Eintrag der Systeminformationen Attribute: key: Der Typ des Eintrags value: Der normale Wert des Eintrags alternative_value: Ein alternativer (lesbarer) Wert max_value: Der maximal mögliche Wert bei einem Integer-Schlüssel Seite 28

29 Contact (openmobilesuite.base.element.contact) ein Kontakt des Adressbuches Attribute: id: Die in der Datenbank gespeicherte ID des Kontakts id_on_phone: Die auf dem Mobiltelefon verwendete ID des Kontakts device: Die ID des dazugehörigen Gerätes name: Der Name des Kontakts ignore: (bool) Wird auf True gesetzt wenn dieser Kontakt ignoriert wird favorite: (bool) Wird auf True gesetzt wenn dieser Kontakt bevorzugt wird values: Eine Liste der Eigenschaften (Instanzen von ContactField) des Kontakts internal_values: Eigenschaften, die nicht in der Datenbank bzw. am Telefon gespeichert werden CalendarEntry (openmobilesuite.base.element.calendar_entry) ist ein Eintrag in der Kalender-Datenbank Attribute: id: Die in der Datenbank gespeicherte ID des Kalender-Eintrags id_on_phone: Die auf dem Mobiltelefon verwendete ID des Kalender-Eintrags device: Die ID des dazugehörigen Gerätes type: Der Typ ( Überschrift ) des Eintrags content: Der längere Inhalt des Eintrags location: Der zu diesem Eintrag definierte Ort real_start_time: Der für diesen Eintrag definierte Startzeitpunkt real_end_time: Der für diesen Eintrag definierte Endzeitpunkt start_time: Der Startzeitpunkt (bei Wiederholungen der Startzeitpunkt der Wiederholung) end_time: Der Endzeitpunkt (bei Wiederholungen der Endzeitpunkt der Wiederholung) last_modified: Das Datum der letzten Änderung replication: Zugriffsberechtigung, kann 'open', 'private' oder 'restricted' sein alarm: Zeitpunkt des Alarms oder None priority: Priorität des Eintrags (Integer von 0 bis 255) Falls der Eintrag wiederholt wird gibt es noch folgende Attribute: repeat_type: Typ der Wiederholung repeat_days: Tage der Wiederholung repeat_exceptions: Ausnahmen (Als Sekunden seit der UNIX-Epoche) repeat_start: Start der Wiederholung (Als Sekunden seit der UNIX-Epoche) repeat_end: Ende der Wiederholung (Als Sekunden seit der UNIX-Epoche) repeat_interval: Intervall der Wiederholung Seite 29

30 Message (openmobilesuite.base.element.message) id: Die in der Datenbank gespeicherte ID der Mitteilung id_on_phone: Die auf dem Mobiltelefon verwendete ID der Mitteilung device: Die ID des dazugehörigen Gerätes contact: Die ID des Empfängers oder Senders address: Die Telefonnummer, an die die SMS gesendet oder von der sie empfangen wurde type: Gesendet (MessageType.Sent) oder empfangen (MessageType.Inbox) priority: Priorität der Mitteilung (normalerweise MessagePriority.Medium) date_time: Der Zeitpunkt des Sendens oder Empfangens message: Der Inhalt der Mitteilung encoding: Kodierung der Mitteilung (normalerweise '7bit') Daneben gibt es noch die Klassen StatisticsRequest und StatisticsResponse, welche eine Anfrage bzw. Antwort der Statistik-Abfrage darstellen Serialisierung Da diese Objekte von der Klasse DbusSerializeable abstammen verfügen sie über die Methoden serialize und deserialize. Dadurch kann eine Instanz einer Klasse über D-Bus an einen anderen Prozess geschickt und von diesem wieder in das ursprüngliche Objekt umgewandelt werden. Für jede Klasse muss durch das Attribut _dbus_properties ein Dictionary definiert werden, welches als Schlüssel die über D-Bus übermittelbaren Attribute und als Wert den Datentyp davon festhält. Seite 30

31 3.4. Wizard beim ersten Start Beim ersten Start der Anwendung wird ein Einrichtungs-Assistent gestartet, der beim Installieren und Konfigurieren der Anwendung hilfreich ist. Wenn die Konfiguration abgeschlossen ist wird der Eintrag firststart in der Kategorie general in der Konfigurationsdatei auf true gesetzt und dadurch der Dialog beim nächsten Start nicht mehr angezeigt. Jede Seite basiert auf einer QWizardPage, welchen den für einen Einrichtungsdialog typischen Stil auf jedem unterstützten Betriebssystem verwendet. Für jede Seite wird ein Titel, Untertitel und Banner-Logo angegeben. Für die QWizardPage können die virtuellen Methoden initializepage und validatepage überschrieben werden. initializepage wird zum Vorbereiten der Seite verwendet, nachdem der Benutzer auf der vorhergehenden Seite den Weiter -Button klickt. validatepage wird nach dem Klick auf Weiter aufgerufen und bestimmt ob die nächste Seite angezeigt werden soll. Auf der Willkommens-Seite findet man eine kurze Information zum Programm. Hier werden die wichtigsten Features aufgelistet. Sollte eine nicht stabile Version installiert worden sein, erscheint auch ein Hinweis, dass Fehler auftreten können und man diese im Bug-Tracking-System melden soll. Abbildung 3-3: Willkommens-Seite Auf der Geräteauswahl-Seite wird ein Bluetooth-Scan gestartet und man bekommt eine Übersicht über die gefundenen Geräte. Das Widget für den Scan basiert auf dem DeviceScanWidget, welches im Kapitel 3.7 Geräteverwaltung (Seite 52) beschrieben wird. Wenn kein Gerät ausgewählt wird, erscheint eine Meldung, dass man sein Gerät später über den Einstellungs-Dialog auswählen kann. Die folgenden Seiten werden dadurch übersprungen. Das ausgewählte Gerät wird in einer Variable gespeichert und auf den nachfolgenden Seiten für die Installation und den Eintrag in die Datenbank gespeichert. Abbildung 3-4: Geräte-Auswahl-Dialog Seite 31

32 Als nächstes kommt die Seite zur Auswahl der Mobiltelefon-Plattform. Hier kann derzeit zwischen Android und S60 und Symbian^3 gewählt werden. Diese Auswahl wird gespeichert und dem zuvor ausgewählten Gerät zugeordnet. Die nächsten Seiten sind von ausgewählten Plattform abhängig. der Wenn Android ausgewählt wurde erscheint eine Seite, die bei der Übertragung der Android-App hilft. Für die Plattform S60 bzw. Symbian^3 muss vor der Anwendung die Bibliothek Python for S60, oder kurz PyS60 auf das Gerät übertragen und dort installiert werden. Abbildung 3-5: Plattform-Auswahl Die Übertragung zum Smartphone übernimmt der Connection Manager durch das ObexConnections-Objekt. Kommt es zu einem Fehler bei der Übertragung, wird ein Dialog ausgegeben. Falls die Server-Anwendung für das Telefon nicht gefunden werden konnte (weil beispielsweise die SVN-Version heruntergeladen wurde) erscheint ebenfalls eine Meldung mit Hinweisen zum Erzeugen der Anwendung. Abbildung 3-6: Installation für Android Für die Übertragung wird das Python-Modul obexftp (siehe Kapitel Obexftp, Seite 14) oder PyOBEX verwendet (siehe Kapitel PyOBEX, Seite 14). Da diese optional sind, werden, falls diese nicht verfügbar sind, die Schaltflächen ausgegraut. Abbildung 3-7: Installation für S60 Seite 32

33 Für die Plattform S60 bzw. Symbian^3 werden auf den folgenden zwei Seiten noch Anweisungen für das Ausführen der Anwendung nach der Installation angezeigt. Auf der ersten (siehe auf Abbildung Abbildung 3-8: Weitere Hinweise für S60) findet man Hinweise zum Start der Anwendung. Bei der Installation wird eine Verknüpfung im Anwendungs-Menü erstellt, welche das Programm startet. Das ist bei Symbian (im Gegensatz zu Android) notwendig, da sonst das Bluetooth-Service nicht gestartet wird. Auf der nächsten Seite (siehe auf Abbildung 3-9: Weitere Hinweise für S60) wird eine Möglichkeit gezeigt, wie das Programm in den Hintergrund verschoben werden kann ohne es zu beenden. In zukünftigen Versionen soll dies vereinfacht werden, da derzeit durch einen Klick auf die rechte Navigations-Taste das Programm beendet wird. Abbildung 3-8: Weitere Hinweise für S60 Das wird durch ein 3rd-Party-Modul in kommenden Versionen durch einen Verstecken -Button ersetzt. Die Einrichtung der Datenbank ist die letzte Seite des Wizards. Hier kann zwischen SQLite und MySQL gewählt werden. Bei MySQL erscheint zusätzlich noch eine Groupbox, in der Host, Port, Benutzername, Passwort und Name der Datenbank eingestellt werden können. Abbildung 3-9: Weitere Hinweise für S60 Da die Qt-Module für SQLite (QSQLITE) und MySQL (QMYSQL) optional sind, erscheint eine rote, fett gedruckte Meldung unter der Combobox falls das aktuell ausgewählte Modul nicht installiert und so der DatenbankTyp nicht verfügbar ist. Abbildung 3-10: Datenbank-Einrichtung Seite 33

34 3.5. Logging Auf der Oberfläche kann durch den Menüpunkt Datei Log-Meldungen ein Dialog aufgerufen werden, in dem sämtliche Log-Meldungen angezeigt werden, die zum Debuggen der Anwendung dienen. Im Wizard beim ersten Start kann dieser Dialog durch die Tastenkombination StrgD aufgerufen werden. Dieser Dialog fasst sämtliche Debug-Meldungen der verschiedenen Module (unterscheidbar durch unterschiedliche Farben) zusammen. Weiters werden in das Textfeld im Tab Output auch die Meldungen der Standard-Ausgabe und der StandardFehlerausgabe kopiert. Abbildung 3-11: Logging-Dialog Ein weiterer Handler der Meldungen ist die Standard-Ausgabe. Wenn beim Start der Anwendung der Parameter -v (oder --verbose) angegeben wird, werden auch InfoMeldungen angezeigt. Der Paramter -d (oder --debug) zeigt auch Meldungen auf dem Debug-Level und der Parameter -l (--long) schaltet auf eine ausführliche Ansicht um. Beispiel: ~ $ openmobilesuite-gui --verbose --long [ :57:14] - GUI - INFO - Show wizard-dialog (gui: init - line 212, process 11345) [ :57:14] - CM - INFO - Opening SQLite database in file /home/lukas/.config/openmobilesuite/data.db (database: opensqlitedatabase - line 60, process 11351) [ :57:14] - CM - INFO - Bluetooth scan started (bluetoothscanner_object: ScanStarted - line 87, process 11351) [ :57:25] - CM - INFO - Bluetooth scan found device Desire HD (bluetoothscanner_object: ScanFoundDevice - line 91, process 11351) [...] Seite 34

35 Als Logging-Framework wird das Python-Modul logging verwendet. Dieses ist sehr umfangreich und flexibel. Die Grundfunktionen dieses Moduls werden in die folgende Bereichen gegliedert: Logging-Objekte stellen ihre Interfaces der Anwendung zur Verfügung Handler senden die von den Loggern erzeugten Log-Datensätze zum bestimmen Ziel Durch Filter kann festgelegt werden, welche Datensätze angezeigt werden. Formatter bestimmen das Layout der Log-Datensätze in der endgültigen Ausgabe. Es kann auch ein Level für Handler und Logger, ab welchem die Datensätze behandelt werden sollen, festgelegt werden (liegt ein Datensatz unter dem festgelegten Level wird er einfach verworfen): Die Level sind unterteilt in DEBUG, INFO, WARNING, ERROR und CRITICAL (falls diese vordefinierten Level nicht ausreichen, können selber auch noch welche definiert werden). Dieses Logging-Framework wird in der Oberfläche durch die Methode createlogger initialisiert: def createlogger(self): # Log Window self.log_window = LogWindow(None, self) # Output forwarding sys.stdout = QtOutput(self.log_window.outputEdit, sys.stderr = QtOutput(self.log_window.outputEdit, sys. stdout ) sys. stderr, QColor(Qt.red)) # Create logger self.log_general = logging.getlogger("openmobilesuite") self.log_gui = logging.loggeradapter(self.log_general, {"origin": "GUI"}) self.log_cm = logging.loggeradapter(self.log_general, {"origin": "CM"}) self.log_sql = logging.loggeradapter(self.log_general, {"origin": "SQL"}) self.log_con = logging.loggeradapter(self.log_general, {"origin": "CON"}) # Create standard output handler self.stdout = logging.streamhandler(sys. stderr ) if self.debug: self.stdout.setlevel(logging.debug) elif self.verbose: self.stdout.setlevel(logging.info) else: self.stdout.setlevel(logging.warning) self.logging_object.set(self.logging_level_interface, "log_level", self.stdout.level) if self.long: format = logging.formatter("[%(asctime)s] - %(origin)-4s - %(levelname)-7s - % (message)s (%(module)s: %(funcname)s - line %(lineno)s, process %(process)s)", "%d.%m.%y %H:%M:%S") self.stdout.setformatter(format) # Create log window handler self.dialoghandler = QtStreamHandler(self.log_window.logEdit, self) if self.settings.setting("log/long"): format = logging.formatter("[%(asctime)s] - %(origin)-4s - %(levelname)-7s - % (message)s (%(module)s: %(funcname)s - line %(lineno)s, process %(process)s)", "%d.%m.%y %H:%M:%S") else: format = logging.formatter("%(origin)-4s - %(message)s") Seite 35

36 self.dialoghandler.setformatter(format) # Add handlers to logger self.log_general.addhandler(self.stdout) self.log_general.addhandler(self.dialoghandler) self.dialog_filter = LoggingFilter( self.settings.setting("log/showguiorigin"), self.settings.setting("log/showcmorigin"), self.settings.setting("log/showconorigin"), self.settings.setting("log/showsqlorigin")) self.dialoghandler.addfilter(self.dialog_filter) self.setlogginglevel(self.settings.setting("log/level")) self.log = self.log_gui # Alias... [aus pc/gui/src/gui.py] Das Log Window wird vom Designer erzeugt und um Funktionen zum Ändern des Levels erweitert. Die Standard-Ausgabe und -Fehlerausgabe wird durch die Klasse QtOutput in das textwidget des Dialogs geschrieben: class QtOutput(object): def init (self, parent, out=none, color=none): self.textwidget = parent self.out = out self.color = color def write(self, m): self.textwidget.movecursor(qtgui.qtextcursor.end) if self.color: tc = self.textwidget.textcolor() self.textwidget.settextcolor(self.color) self.textwidget.insertplaintext( m ) if self.color: self.textwidget.settextcolor(tc) if self.out: if isinstance(m, unicode): self.out.write(m.encode("utf8")) else: elf.out.write(m) [aus pc/gui/src/lib/log.py] Im nächsten Schritt wird der Logger der Anwendung erzeugt. Die LoggingAdapter werden benutzt um Kontext-Informationen (in diesem Fall den Ursprung der Informationen) festzulegen, so dass diese nicht für jede Log-Meldung explizit spezifiziert werden müssen. Danach wird der Handler für die Ausgabe in die Kommandozeile erstellt und das Level und das Format dieses Handlers festgelegt (wie es über die Kommandozeilen-Parameter festgelegt wurde). Seite 36

37 Der Handler für die Ausgabe im Dialog ist nicht mehr über einen StreamHandler realisierbar, sondern es wurde eine eigene Klasse dafür erstellt (von logging.handler abgeleitet): class QtStreamHandler(logging.Handler, colors = { "GUI" : QtGui.QColor("#CE5C00"), # "CM" : QtGui.QColor("#4E9A06"), # "SQL" : QtGui.QColor("#204A87"), # "CON" : QtGui.QColor("#5C3566"), # } QtCore.QObject): Orange Chameleon Sky Blue Plum def init (self, parent, main): logging.handler. init (self) QtCore.QObject. init (self) self.parent = parent self.main = main self.textwidget = parent def setformatter(self, format): self.formater = format def createlock(self): self.mutex = QtCore.QMutex() def acquire(self): self.mutex.lock() def release(self): self.mutex.unlock() def emit(self, record): self.textwidget.movecursor(qtgui.qtextcursor.end) tc = self.textwidget.textcolor() self.textwidget.settextcolor(self.colors[record.origin]) self.textwidget.insertplaintext(self.formater.format(record) '\n') self.textwidget.settextcolor(tc) self.textwidget.movecursor(qtgui.qtextcursor.startofline) self.textwidget.ensurecursorvisible() [aus pc/gui/src/lib/log.py] Abschließend wird noch das Format für den Dialog-Handler festgelegt und ein Filter erzeugt, der je nach Einstellung nur Meldungen von gewissen Ursprüngen anzeigt. Seite 37

38 Die Log-Meldungen des Connection Managers (und daher auch die der BluetoothVerbindungen) werden vom DBus-Objekt Logging gesendet. Dieses verfügt über die folgenden Methoden und Signale: net.sourceforge.openmobilesuite.connectionmanager /Logging Methoden: GetAll (Interface: org.freedesktop.dbus.properties) in: string interface_name out: a{sv} properties Get (Interface: org.freedesktop.dbus.properties) in: string interface_name, string property_name out: variant property Set (Interface: org.freedesktop.dbus.properties) in: string interface_name, string property_name, variant new_value Signale: PropertiesChanged (Interface: org.freedesktop.dbus.properties) out: a{sv} changed_properties LogMessage out: string name, int levelno, string pathname, double created, string origin, string levelname, string message, string module, string funcname, int lineno, int process Durch die Eigenschaft log_level des Logging-Level-Interface (net.sourceforge.openmobilesuite.connectionmanager.debuglevel) kann das Level festgelegt werden, ab welchem die Meldungen gesendet werden sollen. Die Log-Meldungen selber werden durch das Signal LogMessage gesendet. Dazu wurde wieder ein eigener Log-Handler implementiert: class DbusLogHandler(logging.Handler): def init (self, main): super(dbusloghandler, self). init () self.main = main def emit(self, record): self.main.logging_service.logmessage( record.name, record.levelno, record.pathname, record.created, record.origin, record.levelname, unicode(record.msg), record.module, record.funcname, record.lineno, record.process ) [aus pc/connection-manager/src/lib/dbus_log_handler.py] Seite 38

39 Dieser ruft die Funktion Log-Message des DBus-Service mit den geforderten Parametern auf. Damit die Meldungen nun auch auf der Oberfläche sichtbar sind wird ein Listener gestartet, der eben auf dieses Signal reagiert und daraus wieder einen Log-Datensatz erzeugt. Die per DBus übermittelten Argumente werden nun diesem Datensatz zugeordnet und so wird auch wieder die richtige Zeilennummer bzw. Prozess-ID des Eintrags verwendet: class LoggingListener(QtCore.QObject): def init (self, main): super(logginglistener, self). init (main) [...] self.logging_object.connect_to_signal("propertieschanged", self.propertieschanged) [...] def log(self, name, levelno, pathname, created, origin, levelname, msg, module, funcname, lineno, process): record = logging.makelogrecord( { "name" : unicode(name), "levelno" : int(levelno), "pathname" : unicode(pathname), "created" : float(created), "origin" : str(origin), "levelname" : str(levelname), "msg" : unicode(msg), "module" : unicode(module), "funcname" : unicode(funcname), "lineno" : int(lineno), "process" : int(process) } ) self.main.log_general.handle(record) [aus pc/gui/src/service/logging_listener.py] Somit erscheinen auch die Log-Ausgabe des Connection Managers mit dem richtigen Ursprung in den Meldungen. Seite 39

40 3.6. Verbindungsaufbau Der Prozess des Verbindungsaufbaus wird in den folgenden Seiten für die S60-Plattform genauer erläutert. Der Java-Prozess für Android verhält sich ähnlich. Die Benutzeroberfläche (openmobilesuite-gui) ruft dazu die Methode RequestConnection beim Verbindungsmanager (openmobilesuite-connectionmanager) auf, die in einem eigenen Prozess (openmobilesuite-connection-oms) eine Verbindung zum Telefon aufbaut. In der GUI wird der aktuelle Status des Verbindungsaufbaus angezeigt: Abbildung 3-12: Verbindungsaufbau Nach der Synchronisation der Systeminformationen werden diese auf der Oberfläche unter dem Tab Devices (Geräte) angezeigt. Die angezeigten Informationen bestimmt der Typ des Geräts: Für Android gibt es einige Felder (wie Netzwerk-Betreiber und SIM-Nummer), die für S60 nicht existieren. Seite 40

41 Welche Informationen zur Verfügung stehen wird in den Objekten zu den Geräte-Typen (unter pc/base/src/device) gespeichert. Als Beispiel dazu ist hier die Definition der S60-Klasse: from PyQt4 import QtCore from.generic import Generic from..element.device_sysinfo_key import StringKey, IntegerKey, SizeKey, TelephoneCategory, MemoryCategory, SystemCategory class Symbian(Generic): name = "symbian" has_been_configured = True def sysinfo(self): return Generic.sysinfo(self) [ StringKey(False, True, TelephoneCategory, "model", "Model type"), IntegerKey(False, True, TelephoneCategory, "battery", "Battery level"), "", False, "%", 100), IntegerKey(False, True, TelephoneCategory, "signal_strength", "Signal strength", "", True, "dbm", 7), StringKey(False, True, TelephoneCategory, "active_profile", "Active profile"), SizeKey(False, False, MemoryCategory, "free_ram", "Free RAM"), SizeKey(False, False, MemoryCategory, "total_rom", "Total ROM"), StringKey(True, False, SystemCategory, "display", "Display pixels", "", False, "pixels"), StringKey(True, False, SystemCategory, "imei", "IMEI"), StringKey(False, False, SystemCategory, "program_version", "Application version"), StringKey(False, False, SystemCategory, "pys60_version", "PyS60 version"), StringKey(False, False, SystemCategory, "s60_version", "S60 SDK version"), ] [aus pc/base/src/symbian.py] Seite 41

42 Aus diesen Informationen wird dynamisch das SysinfoWidget erzeugt, welches im GeräteTab der Oberfläche angezeigt wird (siehe Abbildung 3-13: Geräteübersicht). Abbildung 3-13: Geräteübersicht Die Kontakte und Kalender-Einträge werden asynchron in die jeweiligen Modelle eingefügt. Der genaue Prozess des Verbindungsaufbau wird in dem Diagramm auf der folgenden Seite veranschaulicht. Seite 42

43 Abbildung 3-14: Diagramm des Verbindungsaufbaus Seite 43

44 Beispiel: PyS60 Beim Start der Server-Anwendung auf dem Mobiltelefon wird ein Bluetooth-Socket geöffnet, welches auf den Port 18 lauscht und Anfragen von allen Geräten annimmt. Die Flags AUTH (authentication) und AUTHOR (authorization) werden gesetzt, damit ein Verbindungsaufbau bestätigt werden muss. Es wird auch das Advertising des Services eingeschaltet, damit es über SDP (Service Disvocery Procovol) auffindbar ist. Danach wird auf eine eingehende Verbindung gewartet. PORT = 18 [...] self.sock = socket.socket(socket.af_bt, socket.sock_stream) self.sock.bind(('', PORT)) self.sock.listen(1) socket.set_security(self.sock, socket.auth socket.author) socket.bt_advertise_service(u"pys60_remote", self.sock, True, socket.rfcomm) [...] while self.service: self.client = self.sock.accept() [aus mobile/s60/mobile.py] Auf der PC-Seite versucht nun die Client-Anwendung, eine Verbindung zu dem Mobiltelefon herzustellen. Für die Kommunikation wird das RFCOMM (Radio Frequency Communication, ein Bluetooth-Protokoll, das serielle Schnittstellen emuliert)-protokoll verwendet. Es muss eine Verbindung zur Bluetooth-Adresse des Telefons auf Port 18 hergestellt werden. try: self.sock = bluetooth.bluetoothsocket( bluetooth.rfcomm ) self.sock.connect((self.parent.device().bluetoothaddress(), self.parent.device().port())) [...] while True: try: recv = unicode(self.sock.recv(1000), "utf8") [...] [aus pc/connection-oms/src/plugin/openmobilesuite.py] Seite 44

45 Nachdem das Mobiltelefon den Verbindungsaufbau akzeptiert hat, werden File-Objekte erzeugt, die ein einfaches Lesen und Schreiben auf den Socket ermöglichen. Dem PC wird eine Meldung über den erfolgreichen Verbindungsaufbau gesendet, die auch die aktuelle Protokoll-Version der Anwendung enthält. self.client = self.sock.accept() [...] self.fos = self.client[0].makefile("w") self.fis = self.client[0].makefile("r") self.send(num_connected, PROTOCOL_VERSION) [...] while(true): try: data = self.fis.readline() except: [...] [aus mobile/s60/mobile.py] Der PC vergleicht nun diese Version mit der eigenen und Verbindungsaufbau nur fort, wenn beide Nummern übereinstimmen. elif header == NUM_CONNECTED: if not float(message) == PROTOCOL_VERSION: self.emit(signal("connectionversionmismatcherror"), PROTOCOL_VERSION) return fährt mit dem float(message), [aus pc/connection-oms/src/plugin/openmobilesuite.py] Der eigentliche Verbindungsaufbau ist nun abgeschlossen und es können Daten übermittelt werden. Begonnen wird mit der Synchronisation der Geräte. Geräteinformationen Dazu fragt der PC zuerst das Mobiltelefon nach Systeminformationen, wie etwa den AkkuLadezustand oder die Signalstärke. Es wird jeweils ein Wert pro Nachricht gesendet, der Header dafür ist NUM_SYSINFO_REPLY_LINE. Sind keine weiteren Informationen verfügbar wird abschließend eine Nachricht mit dem Header NUM_SYSINFO_REPLY_END gesendet. Seite 45

46 Kontakte Auf die Kontakt-Datenbank kann durch das PyS60-Modul contacts zugegriffen werden. Zum Öffnen der Standard-Datenbank reicht es, die Methode open ohne Parameter aufzurufen. Es wird ein ContactDb-Objekt zurückgegeben, in welchem die einzelnen Kontakte durch einen Generator ausgelesen werden können. Durch die Eigenschaften id und title können eine eindeutige ID und der Name des Contact-Objektes ausgelesen werden. Auf die einzelnen Felder (ContactField) kann wieder durch einen Generator zugegriffen werden. In diesen Feldern ist der Typ (z.b. last_name für den Nachnamen, phone_number für die Telefonnummer oder _address für eine -Adresse), der Wert dieses Feldes und ein Ort (home, work oder none) gespeichert. import contacts [...] self.contactdb = contacts.open() [...] keys = self.contactdb.keys() contactdict = dict() for key in keys: contact = self.contactdb[key] [...] contactdict[contact.id] = list() for field in contact: _type = field.type value = field.value value = unicode(value) value = value.replace(u'\u2029', u'\n') # PARAGRAPH SEPARATOR (\u2029) replaced by LINE FEED (\u000a) location = field.location if _type == "unknown": continue elif _type == "thumbnail_image": value = self.getcontactthumbnail(contact) if not value: continue elif _type == "date": value = self.getcontactbirthday(contact) if isinstance(value, type(none)): # Ignore this field continue contactdict[contact.id].append((_type, contactdict[contact.id].sort() [...] location, value)) [aus mobile/s60/mobile.py] Seite 46

47 Auf das Vorschaubild des Kontakts kann nicht direkt zugegriffen werden, da der Wert dieses Feldes immer leer ist. Auch beim Zugriff auf den Geburtstag gibt es Probleme, falls dieser vor Beginn der UNIX-Epoche (1. Januar :00 Uhr UTC) liegt. In diesen beiden Fällen ist ein Workaround notwendig, der das Contact-Field-Objekt als VCard exportiert und so auf den Wert zugreift. def getdetailfromvcard(self, contact, detail, delimiter='\r\n'): # This is an ugly hack, needed for some fields that cannot be handled using the contact object try: value = unicode(contact.as_vcard(), 'utf8') value = value.split(detail ":")[1].split(delimiter)[0] return value except: return [...] def getcontactthumbnail(self, contact): # Ugly workaround! # HACK: The value of type "thumbnail_image" is empty, it is only shown when we export # the contact to a vcard image = self.getdetailfromvcard(contact, "PHOTO;TYPE=JPEG;ENCODING=BASE64", "\r\n\r\n") if image: image = image.split("\r\n\r\n")[0] image = image.replace("\r", "").replace("\n", "").replace(" ", "") return image return [...] def getcontactbirthday(self, contact): return self.getdetailfromvcard(contact, "BDAY") [aus mobile/s60/mobile.py] Das Vorschaubild wird in der Funktion getcontactthumbnail aus der vcard geholt. Es ist im JPEG-Format und durch base64 (Kodierung in eine Zeichenfolge, die nur aus ASCII-Zeichen besteht) kodiert. Es müssen auch noch alle Whitespaces (\r, \n und Leerzeichen) entfernt werden. Nachdem alle Kontakte mit sämtlichen Feldern in einem Dictionary gespeichert wurden wird erstmal ein MD5-Hash aller Felder gebildet und an den PC gesendet. Dort wird auch ein Hash über alle Einträge gebildet, die sich zur Zeit in dessen Datenbank befinden. Stimmt dieser Wert überein, ist die Synchronisation der Kontakte abgeschlossen. Gibt es einen Unterschied, wird vom Mobiltelefon eine Liste sämtlicher Kontakt-IDs mit ihren zugehörigen Hash-Werten angefordert. Die PC-Anwendung kann nun überprüfen, ob am Mobiltelefon ein Kontakt hinzugefügt (ID ist in der PC-Datenbank noch nicht vorhanden), geändert (Hash stimmt nicht überein) oder gelöscht (ID ist in der PCDatenbank, jedoch nicht in der Liste, die das Mobiltelefon gesendet hat) wurde. Falls es nur gelöschte Kontakte gibt, werden diese aus der Datenbank entfernt und die Synchronisation ist abgeschlossen. Hinzugefügte oder geänderte Kontakte werden vom Mobiltelefon angefordert (siehe Kapitel Kontakte). Die Grafik auf der nächsten Seite sollte diesen Prozess verdeutlichen. Seite 47

48 User interface <Contact #258: "Normalverbraucher Otto"> <field #0: type=phone_number value= location=home> <field #1>: type=last_name value=normalverbraucher location=none> <field #2>: type= _address location=none> <field #3>: type=first_name value=otto location=none> <field #4>: type=thumbnail_image value= location=none> <field #5>: type=mobile_number value= location=none> <Contact #259: "Mustermann Martha"> <field #0>: type=last_name value=mustermann location=none> <field #1>: type= _address location=none> <field #2>: type=first_name value=martha location=none> <field #3>: type=mobile_number value= location=none> <field #4: type=phone_number value= location=work> {258: [(' _address', 'none', ('first_name', 'none', u'otto'), ('last_name', 'none', u'normalverbraucher'), ('mobile_number', 'none', u' '), ('phone_number', 'home', u' '), ('thumbnail_image', 'none', u'/9j/4aaqskzjr...ikm//z')], 259: [(' _address', 'none', ('first_name', 'none', u'martha'), ('last_name', 'none', u'mustermann'), ('mobile_number', 'none', u' '), ('phone_number', 'work', u' ')]} }phone_number\x1d work\x1d \x1e\x1f' = c0b0364f7ca275603dd7f0b3a4f7026a }\x1e' = d8fdc493884f03dcd1d6d7db9f44e417 }phone_number\x1dwork\x1d \x1e\x1f' = e3695bf258d70f6b e9f01d1e2 Contact objects Python contact dictionary MD5 hash of all contacts MD5 hash for each contact Seite 48

49 Kalender Die Synchronisation der Kalendereinträge erfolgt ähnlich wie die Kontakt-Synchronisation. Es wird wieder erstmals ein MD5-Hash über die Einträge gebildet und dieser zum PC gesendet. Sollte dieser nicht übereinstimmen werden alle Kalender-Einträge gesendet um die PC-Datenbank aktualisieren zu können Beispiel: Android Zum Verständnis dieses Kapitels sollte der Verbindungsaufbau mit einem S60-Telefon bereits gelesen worden sein, da hier nur der Teil der Android-Anwendung, jedoch nicht mehr der des Connection Managers beschrieben wird. Hier folgt die Beschreibung der wichtigsten Funktionen der Implementierung in Java: Die Server-Anwendung ist hier als Service realisiert, da dieses nicht im Gegensatz zu normalen Programmen jederzeit beendet werden kann. public class BluetoothService extends Service { [...] public void onstart(intent intent, int startid) { serverworker = new BluetoothServiceThread(getApplicationContext()); serverworker.start(); super.onstart(intent, startid); } [...] [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/ BluetoothServiceThread.java] Dieses Service startet einen neuen Thread, in dem das Bluetooth-Socket initialisiert wird. Danach wird auf eine Verbindungsanfrage gewartet. Seite 49

50 Sollte sich eine Anwendung verbinden, wird diese wieder in einem eigenen Thread dem Bluetooth-Client-Thread bearbeitet. public class BluetoothServiceThread extends Thread { private final BluetoothServerSocket mbluetoothserversocket; private final BluetoothAdapter mbluetoothadapter = BluetoothAdapter.getDefaultAdapter(); private final UUID uuid = UUID.fromString("A060C43C-913B-E4EB-CB B52F"); public BluetoothServiceThread(Context context) { mcontext = context; BluetoothServerSocket serversocket = null; serversocket = mbluetoothadapter.listenusingrfcommwithservicerecord("pys60_remote", uuid); mbluetoothserversocket = serversocket; public void run() { BluetoothSocket bluetoothsocket = null; try { while (true) { bluetoothsocket = mbluetoothserversocket.accept(); if (bluetoothsocket!= null) { new BluetoothClientThread(bluetoothSocket, mcontext).start(); } } } catch (IOException e) { e.printstacktrace(); } } [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/ BluetoothService.java] Seite 50

51 Im Client-Thread erfolgt die Behandlung der Kommandos des PC (in der Methode handlecommand). class BluetoothClientThread extends Thread { private final Context mcontext; private SysinfoManager msysinfomanager; private ContactManager mcontactmanager; private MessageManager mmessagemanager; public void run() { msysinfomanager = new SysinfoManager(this, mcontext); mcontactmanager = new ContactManager(this, mcontext); mmessagemanager = new MessageManager(this, mcontext); byte[] buffer = new byte[1024]; int bytes; send(statuscodes.num_connected, String.valueOf(Statuscodes.PROTOCOL_VERSION)); String data = ""; String recv; while (true) { try { // Read from the InputStream bytes = inputstream.read(buffer); recv = new String(buffer, 0, bytes); [...] } } catch (IOException e) { connectionlost(); break; } } } [...] } [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/ BluetoothClientThread.java] Im Gegensatz zur S60-Implementierung werden für die Teilbereiche einzelne Klassen (wie SysinfoManager, ContactManager und MessageManager) verwendet. Dies hat den Grund, das die Implementierung für Android um einiges aufwendiger ist. Für den Zugriff auf die Kontakt-Datenbank gibt es keine einfache API, sondern man muss mit einem Content Resolver arbeiten. Seite 51

52 3.7. Geräteverwaltung Connection Manager Das DBus-Objekt Devices exportiert die Methoden DeviceCount, die die Anzahl der in der Datenbank gespeicherten Geräte zurückgibt und Devices, die die Geräte selbst als Array liefert. Es gibt außerdem noch das Objekt BluetoothScanner, welches asynchron einen GeräteScan durchführt. Dieses hat die Funktionen StartScan und StopScan zum Initialisieren und Stoppen eines Bluetooth-Scans, die Funktion FoundDevices, welche alle gefundenen Geräte zurückgibt und die Signale ScanStarted, ScanCompleted, ScanFailed und ScanFoundDevice, welche über den aktuellen Stand des Scans Bescheid geben GUI In der grafischen Oberfläche werden beim Start der Anwendung alle in der Datenbank verfügbaren Geräte geladen. Diese werden in der devices-variable der Main-Klasse gespeichert und stehen so der gesamten Anwendung zur Verfügung. Abbildung 3-15: Model/View-Klassen der Geräteverwaltung Seite 52

53 Zur Anzeige der Geräte wurden Widgets erstellt, die eine einfache Darstellung in einer Liste oder einer Combobox ermöglichen. Das Widget DeviceScanWidget weist den Connection Manager an, einen Scan zu starten und fügt die gefundenen Geräte asynchron zu seinem Modell hinzu. Beim Auftreten eines Fehlers scheint das auch in einem Element der Liste auf (siehe Abbildung 3-17: DeviceScanWidget mit Fehlermeldung). Durch Rechtsklick auf ein Gerät erscheint ein Menü, das Aktionen zum Senden der Installationsdatei der Server-Anwendung für Android und S60 enthält. Das DeviceViewWidget verfügt über die Methoden adddevice, adddevices und removedevice zum Anzeigen bereits verfügbarer Geräte (z.b. die in der Main-Klasse gespeicherten Geräte der Datenbank). Durch die Klasse DeviceDatabaseViewCombobox ist die Anzeige aller in der Datenbank gespeicherten Geräte in einer Combobox möglich. Abbildung 3-16: DeviceScanWidget mit Gerät Das abstrakte Modell der Daten, das später in der Liste dargestellt wird, wird in allen Widgets in einem _DeviceModel (bzw. den davon abgeleiteten DeviceScanModel und DeviceViewModel) gespeichert. In diesem wird auch der passende Geräte-Typ und das Icon zur Bluetooth-Geräteklasse festgelegt (Methode: classtotuple). Das Icon wird durch die Rolle Qt.DecorationRole bereitgestellt und wird darum auch in der Combobox angezeigt. Das Zeichnen der Elemente wird von einem DeviceDelegate übernommen. (siehe Kapitel Model/View-Architektur, Seite 16). Abbildung 3-17: DeviceScanWidget mit Fehlermeldung Seite 53

54 Diese Widgets werden im First Run Wizard und im Einstellungsdialog verwendet: Abbildung 3-18: Einstellungsdialog Seite 54

55 3.8. Kontaktverwaltung Connection Manager Die Kontakte werden in einer Datenbank des Connection Managers verwaltet. Dieser stellt Methoden zum Abrufen der Kontaktliste bereit, aktualisiert sie beim Verbindungsaufbau und sendet Signale bei Änderungen (beim Hinzufügen neuer Kontakte und beim Ändern oder Löschen bestehender Kontakte). Das Dbus-Objekt Contacts hat dabei folgende Methoden und Signale: net.sourceforge.openmobilesuite.connectionmanager /Contacts Methoden: Contact in: int id out: a{sv} contact Contacts in: bool only_contacts_from_phone out: aa{sv} contacts ContactCount in: bool count_only_contacts_from_phone out: int count ContactHash out: string hash ContactHashSingle out: a{is} hashes Signale: ContactAdded out: a{sv} contact ContactChanged out: a{sv} contact ContactDeleted out: int contact_id Seite 55

56 Kontaktliste der grafischen Oberfläche Beim Start der grafischen Oberfläche werden alle in der Datenbank gespeicherten Mobiltelefone geladen. Diese Objekte vom Typ Device haben in der GUI eine weitere Eigenschaft contacts_model. Das ist eine Referenz zu einem ContactModel, das auf der Qt-Klasse QAbstractListModel (siehe Kapitel Model/View-Architektur, Seite 16) basiert. Diese Eigenschaft ist standardmäßig auf None gesetzt. Erst wenn das Gerät ausgewählt wird, werden die Kontakte dazu angefordert. Das Widget ContactListView (basierend auf einer QListView) dient zum Darstellen der Kontaktliste. Das Zeichnen der einzelnen Elemente in dieser Liste wird jedoch einem Delegate überabbildung 3-19: Kontaktliste lassen. Das Erscheinungsbild kann dabei über die Methoden setthumbnailsize (Ändern der Größe der Thumbnail-Icons der Kontakte), setroundedrectthumbnail bzw. setcirclethumbnail (Thumbnail in rechteckigen oder runden Rahmen) und showmobile, showphone und showmail (Anzeigen bzw. Ausblenden gewisser Eigenschaften) angepasst werden. Möchte man nun die Kontakte eines Telefons in der ContactListView anzeigen lassen, muss man der Klasse nur das Quell-Modell übergeben. Weiters gibt es noch eine Klasse zum Filtern der Kontakte (ContactProxy, basierend auf einem QSortFilterProxyModel). Damit lassen sich beispielsweise wie im unteren Beispiel aus dem Mitteilungs-Fenster der Oberfläche nur Kontakte anzeigen, die über eine Mobiltelefon-Nummer verfügen. [...] device = self.parent.device_widget.device_box.currentdevice() if device.contacts_model is not None: self.source_model = device.contacts_model else: self.source_model = ContactModel(device) self.proxy_model = ContactProxy(self) self.proxy_model.setsourcemodel(self.source_model) self.proxy_model.setdynamicsortfilter(true) self.proxy_model.setfilter("mobile_number") self.proxy_model.setsearchtypes([searchtype.name, "mobile_number"]) self.proxy_model.setfiltercasesensitivity(qtcore.qt.caseinsensitive) self.proxy_model.sort(0) self.contacts_view.setmodel(self.proxy_model) self.contacts_view.delegate.setsmallthumbnail() self.contacts_view.delegate.showmobile(true) self.contacts_view.delegate.showphone(false) self.contacts_view.delegate.showmail(false) [...] [aus pc/gui/src/window/mainwindow/messages.py] Seite 56

57 Hier wird ein neues ContactModel für ein Gerät erstellt, falls dieses noch nicht existiert. Dieses Modell sendet automatisch eine Anfrage an den Connection Manager, der die, in der Datenbank gespeicherten Kontakte liefert. Es überwacht auch selber Änderungen, indem es auf Signale des Connection Managers horcht. Es wird auch ein ContactProxy erstellt, der dafür sorgt, dass nur Kontakte mit Mobiltelefonnummern angezeigt werden. Die Suche wird auf den Namen und die Mobiltelefonnummer beschränkt. Für das Delegate werden auch Anweisungen zum Zeichnen der Elemente gegeben, die jedoch über das Options-Menü überschrieben werden können. Die Suche auf der Oberfläche könnte beispielsweise so aussehen: Abbildung 3-20: Suche in der Kontaktansicht Seite 57

58 Anlegen, Bearbeiten und Löschen von Kontakten Wie man im vorherigen Screenshot (Abbildung 3-20: Suche in der Kontaktansicht) erkennen kann werden unter den Kontakt-Details Buttons zum Anzeigen und Ändern von Kontakten angezeigt. Das Löschen eines Kontakts ist durch Rechtsklick möglich. Der Dialog zum Anlegen und Bearbeiten von Kontakten basiert auf der gleichen Klasse, es wird nur der Text in der Titelleiste und das Icon geändert. Gründsätzlich werden die Kontakt-Details in 3 Gruppen (Locations) eingeteilt: Allgemein, Privat und Geschäftlich. Für Kontakte können auch noch Notizen angelegt werden. Abbildung 3-21: Bearbeitung eines Kontakts Seite 58

59 3.9. Kalenderverwaltung Neben den Kontakten werden beim Verbindungsaufbau auch die Kalender-Einträge synchronisiert. Diese werden auf der Oberfläche unter dem Punkt Kalender angezeigt. Abbildung 3-22: Ansicht der Kalender-Einträge Als Vorbild des Erscheinungsbildes wurde das Programm Kontact aus der KDE PIMSuite verwendet. Es wurden daraus einige Teile entnommen und von C nach Python übersetzt. Dafür wurde das Graphics View Framework verwendet. Dieses wird einem QPainter beim Darstellen vieler benutzerdefinierter Widgets und Elemente bevorzugt. Die Architektur besteht aus einer Szene (die von der Klasse QGraphicsScene dargestellt wird), und den darauf platzierten Elementen Abbildung 3-23: Model/View-Klassen (die von einem QGraphicsItem verwaltung abgeleitet sind). Dies wird dem Benutzer in einer Ansicht (einer QGraphicsView) sichtbar gemacht. der Kalender- Seite 59

60 In meinem Beispiel kümmert sich die CalendarGraphicsView um das Zeichnen des Hintergrunds (Tabellenstruktur, Überschriften,.. ). Die einzelnen Einträge des Kalenders werden stattdessen durch CalendarGraphicItems dargestellt. Pro Eintrag kann es davon mehrere geben, da pro Zeile (Woche) im Kalender ein eigenes Item angelegt werden muss. Im nächsten Screenshot (Abbildung 3-24: Bearbeitung von Kalender-Einträgen) ist der Dialog zum Anlegen und Bearbeiten von Einträgen ersichtlich. Dieser kann durch Doppelklick oder Rechtsklick auf einen bereits bestehenden Eintrag oder eine freie Fläche aufgerufen werden. Der Titel ist das einzige notwendige Feld, optional kann man dazu noch einen Ort eingeben. Der Start- und Endzeitpunkt ist bei Ereignissen und Geburtstagen wichtig, bei Aufgaben kann er weggelassen werden. Danach kann auch noch eine Wiederholung des Ereignisses und ein Alarm definiert werden. Für die einzelnen Einträge kann man die Priorität anpassen und den Zugriff ändern. Abbildung 3-24: Bearbeitung von Kalender-Einträgen Seite 60

61 3.10. Dateiverwaltung Im Connection Manager gibt es eine spezielle Art einer Bluetooth-Verbindung: Durch das Objekt ObexConnections kann eine Verbindung zu dem OBEX-Service eines BluetoothGerätes hergestellt werden. Dadurch kann auf dessen Dateien zugegriffen werden und diese ähnlich wie bei FTP (File Transfer Protocol) heruntergeladen und hochgeladen werden. Das ist vom Typ des Gerätes unabhängig (es kann sich sowohl um ein Mobiltelefon als auch um einen Computer handeln). Im Hintergrund wird dafür die Bibliothek PyOBEX, oder falls diese nicht installiert ist, Obexftp verwendet. Diese bieten eine sehr einfache API zur Verbindung. Daher wird das dem zu Grunde liegende OBEX-Protokoll hier nicht genauer beschrieben. Anmerkung: Im Rahmen der Diplomarbeit wurde in Zusammenarbeit mit David Boddie, dem Entwickler von PyOBEX, ein Patch entwickelt, der einen Fehler in der Implementierung des Moduls behob. Dieser lag in der Behandlung der Connection ID, die von PyOBEX ignoriert wurde und daher zu Fehlern beim Anzeigen des Ordnerinhalts führt. Dadurch konnte ich umfassendere Erfahrung mit dem OBEX-Protokoll sammeln. Zum Mitlesen des Bluetooth-Traffics wurde das Tool hcidump verwendet. Da die Antworten der Auflistung des Ordnerinhaltes im XML-Format vorliegen, wurde ein XML-Parser des Moduls QtXml verwendet. Seite 61

62 Die Dateiverwaltung basiert auch auf auf dem Model/View-Ansatz. Dadurch ist es möglich, die Daten von einem Modell in mehreren Views darzustellen. Wie im Beispiel unten ersichtlich, ist ein Teil davon (die linke Ordneransicht) in einer QListView, während rechts daneben der Ordnerinhalt in einer QTableView angezeigt wird. Abbildung 3-25: Dateiverwaltung Seite 62

63 3.11. Mitteilungsverwaltung Senden von Mitteilungen Ein zentraler Punkt der Anwendung stellt das Senden von Kurzmitteilungen dar. In der GUI ist dies durch mehrere Wege möglich. Einerseits gibt es im Hauptfenster durch den Tab Mitteilungen eine Möglichkeit, um direkt eine SMS auch an mehrere Kontakte verschicken zu können: Abbildung 3-26: Senden einer Kurzmitteilung Andererseits kann man durch Rechtsklick auf einen Kontakt ein Chat-Fenster öffnen. Dieses zeigt einen Teil des Verlaufs und man kann mit dem Kontakt wie in einer üblichen Instant Messaging-Anwendung schreiben: Seite 63

64 Abbildung 3-27: Theme "Fresh" des Chat-Dialogs Dieser Dialog kann dabei durch eine Vielzahl von Themes die zu dem InstantMessaging-Programm Kopete und daher auch zu Adium kompatibel sind - angepasst werden. Eine kurze Übersicht ist hier abgebildet: Abbildung 3-28: Theme "Perfect Pushpin" Abbildung 3-29: Theme "Stock" Abbildung 3-30: Theme "Clear" Abbildung 3-31: Theme "Glossyk" Seite 64

65 Das gewünschte Design kann dabei im Einstellungs-Dialog ausgewählt werden: Abbildung 3-32: Theme-Auswahl im Einstellungsdialog Für das Senden der Mitteilung wird ein neues Message-Objekt angelegt, welches an den Connection Manager weitergeleitet wird. Dieser speichert die Mitteilung in seiner Datenbank und schickt zu danach zum OMS-Programm weiter. Diese sendet über Bluetooth eine Anfrage zum Senden (NUM_MESSAGE_SEND_REQUEST) an das Mobiltelefon. Dieses versucht die SMS an den Empfänger zu senden und meldet die dabei auftretenden Statusmeldungen (siehe Kapitel Mitteilungs-Status, Seite 69) dem PC zurück. Wurde die Mitteilung erfolgreich versandt, wird die Meldung NUM_MESSAGE_SEND_REPLY_OK mit der ID der Mitteilung an den PC gesendet. Falls beim Sendevorgang ein Fehler auftritt, wird stattdessen die Meldung NUM_MESSAGE_SEND_REPLY_FAILURE mit ID und Fehlertext geschickt. def sendmessage(self, name, phone, encoding, msg): try: messaging.sms_send(phone, msg, encoding, self.sentmessage, name) except RuntimeError, detail: if str(detail) == "Already sending": # Workaround for the "Already sending" bug: # messaging._sending = False self.send(num_message_send_reply_retry, str(detail) "; tried workaround") else: self.send(num_message_send_reply_retry, detail) def sentmessage(self, status): if status == messaging.ecreated: self.send(num_message_send_reply_status, "Message created.") [...] elif status == messaging.edeleted: self.send(num_message_send_reply_ok, "The SMS message has been deleted from device's outbox queue.") elif status == messaging.eschedulefailed: self.send(num_message_send_reply_failure, "Schedule failed.") [...] [aus mobile/s60/mobile.py] Seite 65

66 Das Senden wird durch die Methode sms_send des Moduls messaging ermöglicht. Im einfachsten Fall reicht als Parameter die Telefonnummer und die Mitteilung. Im oberen Beispiel wird noch die Koderierung der Mitteilung (normalerweise 7bit), ein Callback, welcher bei Statusänderungen aufgerufen wird und der Name des Kontaktes angeben. Im Callback (sentmessage) wird der aktuelle Status (Erfolg, Fehler oder normale Statusmeldung) an den PC geschickt. Bei einem Android-Telefon funktioniert dieser Vorgang ähnlich: public void sendmessage(string address, String message) { final String SMS_ADDRESS_PARAM = "SMS_ADDRESS_PARAM"; final String SMS_DELIVERY_MSG_PARAM = "SMS_DELIVERY_MSG_PARAM"; final String SMS_SENT_ACTION = "com.hetzenecker.openmobilesuite.service.messagemanager.sms_sent"; ContentValues values = new ContentValues(); values.put("address", address); values.put("date", System.currentTimeMillis()); values.put("read", 1); values.put("status", -1); values.put("type", 2); // sent values.put("body", message); mcontext.getcontentresolver().insert(uri.parse("content://sms"), values); ArrayList<String> messages = msmsmanager.dividemessage(message); ArrayList<PendingIntent> listofintents = new ArrayList<PendingIntent>(); for (int i = 0; i < messages.size(); i) { Intent sentintent = new Intent(SMS_SENT_ACTION); sentintent.putextra(sms_address_param, address); sentintent.putextra(sms_delivery_msg_param, (messages.size() > 1)? "Part " i " of Message " : "Message "); PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, sentintent, PendingIntent.FLAG_CANCEL_CURRENT); listofintents.add(pi); } // Method onreceive is called when SMS has been sent mcontext.registerreceiver(new BroadcastReceiver() public void onreceive(context arg0, Intent intent) { switch (getresultcode()) { case Activity.RESULT_OK: Bundle b = intent.getextras(); mclientthread.send(statuscodes.num_message_send_reply_ok, b.getstring(sms_delivery_msg_param) "sent"); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: mclientthread.send(statuscodes.num_message_send_reply_failure, "Generic failure"); break; case SmsManager.RESULT_ERROR_NO_SERVICE: mclientthread.send(statuscodes.num_message_send_reply_failure, "No service"); break; [...] } } }, new IntentFilter(SMS_SENT_ACTION)); msmsmanager.sendmultiparttextmessage(address, null, messages, listofintents, null); } [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/messagemanager.java] Seite 66

67 Hier muss die Mitteilung auch (anders als in der Implementierung für S60) in die Datenbank geschrieben werden. Dazu wird über den ContentResolver ein Insert in der Datenbank ausgeführt. Danach wird die SMS in mehrere Fragmente aufgeteilt, von denen keines größer als die maximale SMS-Größe ist. Wenn ein Fragment davon erfolgreich versandt wurde wird ein Signal ausgelöst, welches im nächsten Programm-Block behandelt wird. Hier wird der aktuelle Status Erfolg oder Fehler an den PC gemeldet Empfangen von Mitteilungen Zum Empfang der Mitteilungen wird ein Callback registriert, welches aufgerufen wird wenn eine SMS eintrifft: Hier wird das am Beispiel S60 demonstriert: def init (self): [...] self.inbox.bind(self.newmessage) def newmessage(self, sms): if not self.connected: return id = sms time = self.inbox.time(sms) address = self.inbox.address(sms) content = self.inbox.content(sms) self.send(num_message_new, id, time, address, content) [aus mobile/s60/mobile.py] Seite 67

68 Die gleiche Funktionalität wird unter Android durch diesen Code erfüllt: public class MessageManager { public SmsManager msmsmanager; private BroadcastReceiver mmessagereceiver = new BroadcastReceiver() public void onreceive(context context, Intent intent) { Bundle extras = intent.getextras(); if (extras == null) return; Object[] pdus = (Object[]) extras.get("pdus"); for (int i = 0; i < pdus.length; i) { SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); String sender = message.getoriginatingaddress(); String body = message.getmessagebody().tostring(); mclientthread.send(statuscodes.num_message_new, "0", String.valueOf(message.getTimestampMillis()), sender, body); } } }; public MessageManager(BluetoothClientThread clientthread, Context context) { [...] msmsmanager = SmsManager.getDefault(); mcontext.registerreceiver(mmessagereceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); } } [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/messagemanager.java] In beiden Beispielen wird im Callback die Telefonnummer des Senders, der Text der Nachricht und die Uhrzeit des Empfangs geholt. Diese Informationen werden durch den Header NUM_MESSAGE_NEW an den PC geschickt. Der PC zeigt wie im unteren Screenshot (Abbildung 3-33: Mitteilungs-Status) ersichtlich ein Popup-Fenster an, falls für den Kontakt der Mitteilung noch kein ChatFenster offen ist. Seite 68

69 Mitteilungs-Status Abbildung 3-33: Mitteilungs-Status Im oberen Fenster kann man auch die Status-Meldungen der Mitteilungen erkennen. Falls eine SMS erfolgreich versendet werden konnte, wird dies durch ein grünes Häkchen deutlich gemacht Verlauf Vom Connection Manager kann auch der gesamte Verlauf abgefragt werden. Dabei ist eine Kontakt und möglich. Filterung nach Mitteilungs-Typ Nach einem Klick auf Mitteilungen suchen erscheint am unteren Rand eine Suchleiste. Die Suchergebnisse werden farblich hervorgehoben und in der Datumsanzeige sind nur noch diejenigen Tage vorhanden, an dem eine Mitteilung gefunden wurde und die den Filterkriterien entsprechen. Abbildung 3-34: Verlaufs-Ansicht Seite 69

70 Statistiken Ein weiteres Feature ist die Anzeige des Mitteilungsverhalten. Um die Daten abzufragen, wird an das Objekt Database des Connection Managers eine Anfrage gestellt. Die Anfrage ist dabei vom Objekt StatisticRequest, als Antwort kommt eine StatisticResponse. Der Graph im Statistikfenster wird durch die Python-Bibliothek matplotlib erzeugt. Wenn diese nicht installiert ist, erscheint ein Hinweis, dass der Graph nicht angezeigt werden kann. Neben der periodenbezogenen Anzeige kann man sich auch noch die Kontakte in einem Tortendiagramm und allgemeine Statistiken anzeigen lassen. Abbildung 3-35: Statistiken Seite 70

71 3.12. Datenbank Die Daten Geräte, Kontakte, Kalender-Einträge und Mitteilungen - werden vom Connection Manager in einer Datenbank gespeichert. Dabei kann man zwischen einer SQLite- und MySQL-Datenbank wählen. Die Verbindung zu dieser Datenbank wird dann über das QtSql-Model hergestellt. In Abbildung 3-36 sieht man das Layout der Datenbank. Abbildung 3-36: Datenbank-Layout Hier kann man erkennen, dass die Device-Tabelle im Mittelpunkt steht und alle anderen Objekte einem Gerät zugeordnet werden können. Eine Ausnahme bildet die config-tabelle in dieser wird etwa die verwendete Version der Datenbank gespeichert, um später Upgrades durchführen zu können. Über die Klasse QSqlQuery können SQL-Abfragen durchgeführt werden. In diesem Beispiel wird die durchschnittliche Länge einer eingehenden SMS-Mitteilung ermittelt: query = "SELECT ROUND(AVG(LENGTH(message)),2) FROM messages WHERE type='" str(messagetype.incoming) "'" query = self. queryreturn(query) if query.last(): ret["incoming_avglength"] = str(query.value(0).todouble()[0]) [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/messagemanager.java] Seite 71

72 3.13. Plattformunabhängigkeit Durch die Verwendung der Programmiersprache Python und des Toolkits Qt war es möglich, die Anwendung nahezu unverändert unter den Betriebssystemen Windows, Linux und Mac OS X auszuführen. Seit Qt4 werden dazu die nativen Style-APIs der jeweiligen Betriebssysteme verwendet und dadurch passen sich die Qt-Widgets perfekt an das jeweilige Betriebssystem an. Abbildung 3-37: Bearbeiten eines Kontaktes unter Mac OS X Abbildung 3-38: Kontakliste und Bearbeitung unter Windows XP Seite 72

73 3.14. Übersetzungen Damit diese Anwendung von so vielen Menschen wie möglich benutzt werden kann, wurde von Anfang an eine einfache Übersetzbarkeit angestrebt. Dazu müssen die zu übersetzenden Zeichenketten im Programm gekennzeichnet werden (in etwa durch die Methode QApplication.translate) und danach durch PyQt extrahiert werden. Die Übersetzer können dann das einfach zu benutzende Programm Qt Linguist zum Übersetzen in die eigene Sprache benutzen. Abbildung 3-39: Screenshot beim Bearbeiten der deutschen Übersetzung Diese Übersetzung kann dann zur Laufzeit geladen werden: # Languages localename = self.settings.setting("lookandfeel/language") if localename: self.locale = QLocale(localename) QLocale.setDefault(self.locale) # for QDate.toString(x, Qt.DefaultLocaleLongDate) else: self.locale = QLocale.system() locale = self.locale.name() tmptranslator = QTranslator() apptranslator = QTranslator() if tmptranslator.load("app_" locale, ":/lang"): apptranslator.load("app_" locale, ":/lang") self.app.installtranslator(apptranslator) [aus mobile/android/src/com/hetzenecker/openmobilesuite/service/messagemanager.java] Seite 73

74 Dadurch wurde es für freiwillige Helfer sehr einfach, das Programm in die eigene Sprache zu übersetzen. Daher existieren derzeit neben der Hauptsprache Englisch Übersetzungen für Deutsch, Französisch, Italienisch, Polnisch, Spanisch, Tschechisch, Bulgarisch und Niederländisch. Abbildung 3-40: Polnische Übersetzung Abbildung 3-41: Niederländische und tschechische Übersetzungen Seite 74

75 4. Webseite Unter der Adresse wurde eine Webseite für dieses Projekt erstellt. Diese basiert auf dem Content Management System (CMS) Zikula. Ein wichtiger Grund für die Wahl dieses CMS war die einfache Unterstützung mehrerer Sprachen der Webseite. Sie ist derzeit auf Deutsch und Englisch verfügbar, die optimale Sprache wird durch den Browser erkannt. Auf der Homepage werden laufend News-Einträge veröffentlicht, es sind Screenshots der aktuellen Releases vorhanden und es gibt eine Übersicht über getestete Mobiltelefone. In einem Support-Forum können aufgetretene Fehler und Verbesserungsvorschläge zum Programm gepostet werden. Abbildung 4-1: Screenshot der Projekt-Webseite Seite 75

76 Nach Klick auf die Kategorie Downloads bekommt der Besucher eine übersichtliche Seite mit Downloads für alle verfügbaren Betriebssysteme: Abbildung 4-2: Downloadbereich der Webseite Seite 76

77 5. Mailing List Neben der Webseite werden auch noch drei Mailing-Listen betreut, welche auch auf Sourceforge gehostet werden. Die Mailing List series60-remote-devel dient zum Austausch unter den Entwicklern. Hier werden auch Themen wie Übersetzungen diskutiert. Daneben gibt es auch noch die Liste series60-remote-announcements, auf der Ankündigungen in etwa über eine neue Version geschrieben werden. Diese ist moderiert und es können nur Beiträge von bestimmten Personen veröffentlicht werden. Die letzte Liste series60-remote-commits enthält Kopien aller Änderungen des Quellcodes aus dem SVN-Versionsverwaltungssystem. Auf der Webseite ist ein Archiv mit allen s vorhanden: Abbildung 5-1: Screenshot des Archivs der Mailing-Liste "series60-remote-devel" Die Mailing Listen basieren auf dem Open-Source-Programm mailman. Seite 77

78 6. Bug Tracker Auf Sourceforge wird auch noch ein System zur Verfolgung von Fehlern und zum Schreiben von Verbesserungsvorschlägen betrieben. Abbildung 6-1: Screenshot des Bug-Tracking-Systems Seite 78

Mobile Application Development

Mobile Application Development Mobile Application Development Android: Einführung Jürg Luthiger University of Applied Sciences Northwestern Switzerland Institute for Mobile and Distributed Systems Lernziele Der/die Kursbesucher/in kann

Mehr

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper Python Programmierung Kontaktdaten Homepage: http://wwwlehre.dhbw-stuttgart.de/~schepper/ Email: Volker. Schepper [A@T] yahoo.de Vorlesung Skriptsprachen Vorlesung: 06.03.2013 13.03.2013 20.03.2013 27.03.2013

Mehr

1. Software-Plattform Android Android. Was ist Android? Bibliotheken, Laufzeitumgebung, Application Framework

1. Software-Plattform Android Android. Was ist Android? Bibliotheken, Laufzeitumgebung, Application Framework 1. Software-Plattform Android Android Was ist Android? Plattform und Betriebssystem für mobile Geräte (Smartphones, Mobiltelefone, Netbooks), Open-Source Linux-Kernel 2.6 Managed Code, Angepasste Java

Mehr

DBUS Interprozess-Kommunikation für Embedded-Plattformen

DBUS Interprozess-Kommunikation für Embedded-Plattformen DBUS Interprozess-Kommunikation für Embedded-Plattformen Andreas Schwarz Neratec Solutions AG Firmenprofil Neratec Solutions AG Produkt-Entwicklungen für kundenspezifische elektronische Produkte Produkte

Mehr

Enigma2 Plugin Entwicklung mit Eclipse

Enigma2 Plugin Entwicklung mit Eclipse Enigma2 Plugin Entwicklung mit Eclipse Enigma2 Plugin Entwicklung mit Eclipse 1/15 Inhaltsverzeichnis 1 ÜBER... 3 2 INSTALLATION... 4 2.1 INSTALLATION VON ECLIPSE... 4 2.2 INSTALLATION VON PYDEV... 4 3

Mehr

UM ALLE DATEN ZU KOPIEREN. ZUNÄCHST die Daten des alten Telefons auf einen Computer kopieren

UM ALLE DATEN ZU KOPIEREN. ZUNÄCHST die Daten des alten Telefons auf einen Computer kopieren LUMIA mit WP8 IPHONE Daten des alten Telefons auf einen Computer kopieren Software von welcomehome.to/nokia auf Ihrem PC oder Mac. verbinden Sie Ihr altes Telefon über 3. Wenn Sie Outlook nutzen, öffnen

Mehr

Kapitel 6,»Objektorientierte Programmierung«, widmet sich der objektorientierten Programmierung mit Python.

Kapitel 6,»Objektorientierte Programmierung«, widmet sich der objektorientierten Programmierung mit Python. 1.3 Aufbau des Buchs lichkeiten offen. Auf die Unterschiede der beiden Versionen gehe ich besonders ein, sodass ein späterer Umstieg von der einen zur anderen Version leichtfällt. Erste Zusammenhänge werden

Mehr

1. Software-Plattform Android Android. Was ist Android? Managed Code, Angepasste Java Virtual Machine

1. Software-Plattform Android Android. Was ist Android? Managed Code, Angepasste Java Virtual Machine 1. Software-Plattform Android Android Was ist Android? Plattform und Betriebssystem für mobile Geräte (Smartphones, Mobiltelefone, Netbooks), Open-Source Linux-Kernel ab 2.6, aktuell 3.8 Managed Code,

Mehr

Das Bluetooth Handbuch

Das Bluetooth Handbuch Telekommunikation Jörg Franz Wollert Das Bluetooth Handbuch Technologie Software Einsatzfelder Systementwicklung Wettbewerb Mit 213 Abbildungen Franzis Inhalt 1 Bluetooth - Übersicht 15 1.1 Wo steht Bluetooth?

Mehr

Netzwerk Technologien in LabVIEW

Netzwerk Technologien in LabVIEW Netzwerk Technologien in LabVIEW von Dirk Wieprecht NI Germany Hier sind wir: Agenda Agenda Bedeutung des Ethernet für die Messtechnik Ethernet-basierende Technologien in LabVIEW Low Level- TCP/IP Objekt

Mehr

C++ und mobile Plattformen

C++ und mobile Plattformen Dieser Artikel stammt aus dem Magazin von C++.de (http://magazin.c-plusplus.de) C++ und mobile Plattformen Mit diesem Artikel möchte ich euch einen kurzen Überblick über die verschiedenen Plattformen für

Mehr

Einrichtung des NVS Calender-Google-Sync-Servers. Installation des NVS Calender-Google-Sync Servers (Bei Neuinstallation)

Einrichtung des NVS Calender-Google-Sync-Servers. Installation des NVS Calender-Google-Sync Servers (Bei Neuinstallation) Einrichtung des NVS Calender-Google-Sync-Servers Folgende Aktionen werden in dieser Dokumentation beschrieben und sind zur Installation und Konfiguration des NVS Calender-Google-Sync-Servers notwendig.

Mehr

Technische Beschreibung: EPOD Server

Technische Beschreibung: EPOD Server EPOD Encrypted Private Online Disc Technische Beschreibung: EPOD Server Fördergeber Förderprogramm Fördernehmer Projektleitung Projekt Metadaten Internet Foundation Austria netidee JKU Linz Institut für

Mehr

Meine Welt auf einen Blick erleben.

Meine Welt auf einen Blick erleben. Daten- Synchronisation Sie haben Fragen? Hier finden Sie Antworten. Meine Welt auf einen Blick erleben. Die folgenden Anleitungen helfen Ihnen dabei Ihre vorhandenen Daten mit einem Windows Phone 7 weiter

Mehr

4D Server v12 64-bit Version BETA VERSION

4D Server v12 64-bit Version BETA VERSION 4D Server v12 64-bit Version BETA VERSION 4D Server v12 unterstützt jetzt das Windows 64-bit Betriebssystem. Hauptvorteil der 64-bit Technologie ist die rundum verbesserte Performance der Anwendungen und

Mehr

Zeiterfassung-Konnektor Handbuch

Zeiterfassung-Konnektor Handbuch Zeiterfassung-Konnektor Handbuch Inhalt In diesem Handbuch werden Sie den Konnektor kennen sowie verstehen lernen. Es wird beschrieben wie Sie den Konnektor einstellen und wie das System funktioniert,

Mehr

BLK-2000. Quick Installation Guide. English. Deutsch

BLK-2000. Quick Installation Guide. English. Deutsch BLK-2000 Quick Installation Guide English Deutsch This guide covers only the most common situations. All detail information is described in the user s manual. English BLK-2000 Quick Installation Guide

Mehr

crm-now/ps Anwenderhandbuch für die Thunderbird Erweiterung Zweite Ausgabe

crm-now/ps Anwenderhandbuch für die Thunderbird Erweiterung Zweite Ausgabe crm-now/ps Anwenderhandbuch für die Thunderbird Erweiterung Zweite Ausgabe crm-now/ps: Copyright 2006 crm-now Versionsgeschichte Version 02 08.09.2006 Release Version Version 01 16.06.2005 crm-now c/o

Mehr

MGE Datenanbindung in GeoMedia

MGE Datenanbindung in GeoMedia TIPPS & TRICKS MGE Datenanbindung in GeoMedia 10. September 2002 / AHU INTERGRAPH (Schweiz) AG Neumattstrasse 24, CH 8953 Dietikon Tel: 043 322 46 46 Fax: 043 322 46 10 HOTLINE: Telefon: 043 322 46 00

Mehr

Marketing Update. Enabler / ENABLER aqua / Maestro II

Marketing Update. Enabler / ENABLER aqua / Maestro II Marketing Update Enabler / ENABLER aqua / Maestro II Quartal 01/2013 1 Kommentar des Herausgebers Liebe Kunden und Partner, dieser Marketing Update gibt Ihnen einen kurzen Überblick über die aktuell verfügbaren

Mehr

LDAP für HiPath OpenOffice ME V1 Installation von ESTOS Metadir unter Windows XP

LDAP für HiPath OpenOffice ME V1 Installation von ESTOS Metadir unter Windows XP LDAP für HiPath OpenOffice ME V1 Installation von ESTOS Metadir unter Windows XP Inhaltsverzeichnis Dokumenteninformation... 2 Voraussetzungen... 2 Einschränkungen... 2 Installation von ESTOS Metadir...

Mehr

Sophos Mobile Control Benutzerhandbuch für Android

Sophos Mobile Control Benutzerhandbuch für Android Sophos Mobile Control Benutzerhandbuch für Android Produktversion: 2 Stand: Dezember 2011 Inhalt 1 Über Sophos Mobile Control... 3 2 Einrichten von Sophos Mobile Control auf einem Android-Mobiltelefon...

Mehr

Ein neues TOONTRACK Produkt registrieren / installieren / authorisieren...

Ein neues TOONTRACK Produkt registrieren / installieren / authorisieren... Ein neues TOONTRACK Produkt registrieren / installieren / authorisieren... Viele TOONTRACK Music Produkte sind mittlerweile als reine Seriennummer-Version oder als auf einer Karte aufgedruckte Seriennummer

Mehr

B-Speech MiniPad Anleitung zur Schnellinstallation. Anleitung zur Schnellinstallation. Seite 1 von 12

B-Speech MiniPad Anleitung zur Schnellinstallation. Anleitung zur Schnellinstallation. Seite 1 von 12 Anleitung zur Schnellinstallation Seite 1 von 12 Inhaltsverzeichnis B-Speech MiniPad Anleitung zur Schnellinstallation BK300 Anleitung zur Schnellinstalltion.. 3 Pocket PC / Microsoft Smartphone.. 4 Systemanforderungen....

Mehr

White Paper. Embedded Treiberframework. Einführung

White Paper. Embedded Treiberframework. Einführung Embedded Treiberframework Einführung White Paper Dieses White Paper beschreibt die Architektur einer Laufzeitumgebung für Gerätetreiber im embedded Umfeld. Dieses Treiberframework ist dabei auf jede embedded

Mehr

Smartphone Entwicklung mit Android und Java

Smartphone Entwicklung mit Android und Java Smartphone Entwicklung mit Android und Java predic8 GmbH Moltkestr. 40 53173 Bonn Tel: (0228)5552576-0 www.predic8.de info@predic8.de Was ist Android Offene Plattform für mobile Geräte Software Kompletter

Mehr

Knottenwäldchen Software

Knottenwäldchen Software Knottenwäldchen Software Installationsanleitung für die netzbasierte Lösung Knottenwäldchen Software März.2011 Knottenwäldchen Software Seite 2 1 Inhalt 1 Inhalt... 2 2 Übersicht... 3 3 Installation...

Mehr

Benutzerdokumentation Web-Portal

Benutzerdokumentation Web-Portal GRUPP: SWT0822 Benutzerdokumentation Web-Portal Yet Another Reversi Game Martin Gielow, Stephan Mennicke, Daniel Moos, Christine Schröder, Christine Stüve, Christian Sura 05. Mai 2009 Inhalt 1. Einleitung...3

Mehr

Praktikum aus Softwareentwicklung 2. Web Services. Java Praktikum SS 2010 Gerald.Ehmayer@borland.com

Praktikum aus Softwareentwicklung 2. Web Services. Java Praktikum SS 2010 Gerald.Ehmayer@borland.com Web Services Java Praktikum SS 2010 Gerald.Ehmayer@borland.com 1 Web Services Einführung Definition, Eigenschaften, Anwendungen... JAX-RPC Überblick, Architektur... JAX Übersicht, Architektur Java Praktikum

Mehr

Outlook - CommuniGate Pro Schnittstelle installieren. Outlook - Elemente freigeben. Outlook - Freigegebene Elemente öffnen

Outlook - CommuniGate Pro Schnittstelle installieren. Outlook - Elemente freigeben. Outlook - Freigegebene Elemente öffnen Microsoft Outlook 1 Nutzung der Groupware mit Microsoft Outlook 1.1 Outlook - CommuniGate Pro Schnittstelle installieren 4 1.2 Outlook - Elemente freigeben 11 1.3 Outlook - Freigegebene Elemente öffnen

Mehr

Collax Web Application

Collax Web Application Collax Web Application Howto In diesem Howto wird die Einrichtung des Collax Moduls Web Application auf einem Collax Platform Server anhand der LAMP Anwendung Joomla beschrieben. LAMP steht als Akronym

Mehr

Oracle 10g und SQL Server 2005 ein Vergleich. Thomas Wächtler 39221

Oracle 10g und SQL Server 2005 ein Vergleich. Thomas Wächtler 39221 Oracle 10g und SQL Server 2005 ein Vergleich Thomas Wächtler 39221 Inhalt 1. Einführung 2. Architektur SQL Server 2005 1. SQLOS 2. Relational Engine 3. Protocol Layer 3. Services 1. Replication 2. Reporting

Mehr

Qt Framework. Thomas Keller - itcampus GmbH 14.08.2008. Creative Commons Namensnennung-Keine kommerzielle Nutzung 2.0 Deutschland Lizenz

Qt Framework. Thomas Keller - itcampus GmbH 14.08.2008. Creative Commons Namensnennung-Keine kommerzielle Nutzung 2.0 Deutschland Lizenz Qt Framework Thomas Keller - itcampus GmbH 14.08.2008 Creative Commons Namensnennung-Keine kommerzielle Nutzung 2.0 Deutschland Lizenz 1 Überblick 2 Die Themen Was ist Qt? Anwendungen Module Was macht

Mehr

Perinorm Systemvoraussetzungen ab Version Release 2010

Perinorm Systemvoraussetzungen ab Version Release 2010 Perinorm Systemvoraussetzungen ab Version Release 2010 1. DVD Version - Einzelplatzversion Betriebssystem Unterstützte Betriebssysteme Windows XP, Windows Vista Windows 7 (falls bereits verfügbar) Auf

Mehr

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Nach dem Update auf die Version 1.70 bekommen Sie eine Fehlermeldung,

Mehr

Die in diesem Dokument aufgelisteten Anforderungen an das Betriebssystem schließen die aktuellen Patches und Servivepacks ein.

Die in diesem Dokument aufgelisteten Anforderungen an das Betriebssystem schließen die aktuellen Patches und Servivepacks ein. Systemanforderungen Die unten angeführten Systemanforderungen für Quark Publishing Platform sind grundlegende Anforderungen, Ihre Benutzerzahl, Asset-Anzahl und Anzahl der Asset-Versionen beeinflussen

Mehr

SSH-Zugang zu Datenbanken beim DIMDI

SSH-Zugang zu Datenbanken beim DIMDI SSH-Zugang zu Datenbanken beim DIMDI Ab November 2013 entsprechen wir dem Wunsch vieler Nutzer nach mehr Sicherheit bei der Recherche. Dazu ermöglichen wir Ihnen eine bessere Alternative zum bisherigen

Mehr

EEX Kundeninformation 2007-09-05

EEX Kundeninformation 2007-09-05 EEX Eurex Release 10.0: Dokumentation Windows Server 2003 auf Workstations; Windows Server 2003 Service Pack 2: Information bezüglich Support Sehr geehrte Handelsteilnehmer, Im Rahmen von Eurex Release

Mehr

25. Februar 2009, Version 1.0. Installationsanleitung Tivoli Storage Manager für Windows. Verwaltungsdirektion. Informatikdienste

25. Februar 2009, Version 1.0. Installationsanleitung Tivoli Storage Manager für Windows. Verwaltungsdirektion. Informatikdienste 25. Februar 2009, Version 1.0 Installationsanleitung für Windows Verwaltungsdirektion Informatikdienste Installationsanleitung für Windows Inhaltsverzeichnis...1 Installation... 1 Voraussetzungen...1 Ablauf

Mehr

3-349-871-01 1/7.15. GMSTHostService. Bedienungsanleitung

3-349-871-01 1/7.15. GMSTHostService. Bedienungsanleitung 3-349-871-01 1/7.15 GMSTHostService Bedienungsanleitung Inhaltsverzeichnis 1. Registrierung... 3 Erste Registrierung... 3 2. GMSTHostService Basisinformationen... 8 3. Beispiel GMSTHostService Konfiguration....

Mehr

ASUS WebStorage Bedienungsanleitung

ASUS WebStorage Bedienungsanleitung ASUS WebStorage Bedienungsanleitung Willkommen bei ASUS WebStorage Mit ASUS WebStorage können Sie die Daten auf Ihrem PC und anderen Geräten jederzeit synchronisieren egal, wo Sie sind. Mit ASUS WebStorage

Mehr

Erste Schritte mit Eclipse

Erste Schritte mit Eclipse Erste Schritte mit Eclipse März 2008, KLK 1) Java Development Kit (JDK) und Eclipse installieren In den PC-Pools der HAW sind der JDK und Eclipse schon installiert und können mit dem Application Launcher

Mehr

webpdf für VMware SoftVision Development GmbH Kurfürstenstraße 15 36037 Fulda, Deutschland Tel.: +49 (0)661 25100-0 Fax: +49 (0)661 25100-25

webpdf für VMware SoftVision Development GmbH Kurfürstenstraße 15 36037 Fulda, Deutschland Tel.: +49 (0)661 25100-0 Fax: +49 (0)661 25100-25 webpdf für VMware SoftVision Development GmbH Kurfürstenstraße 15 36037 Fulda, Deutschland Tel.: +49 (0)661 25100-0 Fax: +49 (0)661 25100-25 E-Mail: sales@softvision.de Web: www.softvision.de Inhaltsverzeichnis

Mehr

G-Info Lizenzmanager

G-Info Lizenzmanager G-Info Lizenzmanager Version 4.0.1001.0 Allgemein Der G-Info Lizenzmanager besteht im wesentlichen aus einem Dienst, um G-Info Modulen (G-Info Data, G-Info View etc.; im folgenden Klienten genannt) zentral

Mehr

CRM KINDERLEICHT NEUERUNGEN IM RELEASE 8.4

CRM KINDERLEICHT NEUERUNGEN IM RELEASE 8.4 CRM KINDERLEICHT NEUERUNGEN IM RELEASE 8.4 STRATEGISCHE ZIELE Terminumfrage, Termine und Aufgaben in GEDYS IntraWare 8.web Unabhängig vom E Mail und Kalendersystem Termine auch für Kunden Ablösung der

Mehr

p^db=`oj===pìééçêíáåñçêã~íáçå=

p^db=`oj===pìééçêíáåñçêã~íáçå= p^db=`oj===pìééçêíáåñçêã~íáçå= Error: "Could not connect to the SQL Server Instance" or "Failed to open a connection to the database." When you attempt to launch ACT! by Sage or ACT by Sage Premium for

Mehr

http://www.cis.upenn.edu/~bcpierce/unison/download/stable/unison- 2.9.1/

http://www.cis.upenn.edu/~bcpierce/unison/download/stable/unison- 2.9.1/ Einführung Was ist Unison? Unison ist ein Dateisynchronisationsprogramm für Windows und Unix. Es teilt sich viele Funktionen mit anderen Programmen, wie z.b. CVS und rsync. Folgend einige Vorteile des

Mehr

Scalera Mailplattform Dokumentation für den Anwender Installation und Konfiguration des Outlook Connectors

Scalera Mailplattform Dokumentation für den Anwender Installation und Konfiguration des Outlook Connectors Installation und Konfiguration des Outlook Connectors Vertraulichkeit Die vorliegende Dokumentation beinhaltet vertrauliche Informationen und darf nicht an etwelche Konkurrenten der EveryWare AG weitergereicht

Mehr

Kundenanforderungen. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw, 24.05.2013

Kundenanforderungen. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw, 24.05.2013 Software Komponenten FS13 Gruppe 03 Horw, 24.05.2013 Bontekoe Christian Estermann Michael Moor Simon Rohrer Felix Autoren Bontekoe Christian Studiengang Informatiker (Berufsbegleitend) Adresse Telefon

Mehr

MySQL Community Server 5.1 Installationsbeispiel

MySQL Community Server 5.1 Installationsbeispiel MySQL Community Server 5.1 Installationsbeispiel Dieses Dokument beschreibt das Herunterladen der Serversoftware, die Installation und Konfiguration der Software. Bevor mit der Migration der untermstrich-datenbank

Mehr

Softwareanforderungen für Microsoft Dynamics CRM Server 2015

Softwareanforderungen für Microsoft Dynamics CRM Server 2015 Softwareanforderungen für Microsoft Dynamics CRM Server 2015 https://technet.microsoft.com/de-de/library/hh699671.aspx Windows Server-Betriebssystem Microsoft Dynamics CRM Server 2015 kann nur auf Computern

Mehr

Access und OpenOffice.org

Access und OpenOffice.org Access-Datenbanken in OpenOffice.org 1.1 einbinden Herausgegeben durch das OpenOffice.org Germanophone-Projekt Autoren Autoren vorhergehender Versionen Timo Kozlowski Alle in diesem Dokument erwähnten

Mehr

Handover von Daten IBM Rational DOORS StartUp Training - Teil 2

Handover von Daten IBM Rational DOORS StartUp Training - Teil 2 Handover von Daten IBM Rational DOORS StartUp Training - Teil 2 Inhalt: Überblick Daten Import & Export Import von RTF Dateien Import von Spreadsheet Daten Export als RTF und HTML DOORS Repository In-Export

Mehr

1 Überblick. A-Z SiteReader Benachrichtigung.doc Seite 1 von 9

1 Überblick. A-Z SiteReader Benachrichtigung.doc Seite 1 von 9 1 Überblick In A-Z SiteReader ist das Feature Benachrichtigung enthalten. Dieses Feature ermöglicht einer Installation, beim Auftreten von Ereignissen eine automatische Benachrichtigung für verschiedene

Mehr

GUI Programmierung mit Qt

GUI Programmierung mit Qt GUI Programmierung mit Qt C++ vs. JAVA Norman Wolf 22.04.05 GUI Programmierung mit Qt 1 Einleitung Qt wird von der norwegischen Firma Trolltech entwickelt Es ist kommerzielle Software, die aber von Trolltech

Mehr

OPC-Server VM OPC. Anleitung. Installation, Konfiguration, Verwendung. Version 1.01

OPC-Server VM OPC. Anleitung. Installation, Konfiguration, Verwendung. Version 1.01 Installation, Konfiguration, Verwendung Version 1.01 Seite 2 von 20 OPC-Server VM OPC Revision Version Erstellt am Versionsnummer Bemerkung 1.00 26.07.2013 Erstellung 1.01 05.11.2013 2.14 - Reiter der

Mehr

Java Micro Edition. Entwicklung mobiler JavaME-Anwendungen mit CLDC und MIDP. von Klaus D. Schmatz. 2., aktualis. u. erw. Aufl.

Java Micro Edition. Entwicklung mobiler JavaME-Anwendungen mit CLDC und MIDP. von Klaus D. Schmatz. 2., aktualis. u. erw. Aufl. Java Micro Edition Entwicklung mobiler JavaME-Anwendungen mit CLDC und MIDP von Klaus D. Schmatz 2., aktualis. u. erw. Aufl. Java Micro Edition Schmatz schnell und portofrei erhältlich bei beck-shop.de

Mehr

Acrolinx IQ. Verbindung mit einer externen Terminologiedatenbank herstellen 2.7

Acrolinx IQ. Verbindung mit einer externen Terminologiedatenbank herstellen 2.7 Acrolinx IQ Verbindung mit einer externen Terminologiedatenbank herstellen 2.7 2 Inhalt Einleitung 3 Über diesen Leitfaden...3 Verbinden mit externen Terminologiedatenbanken 4 Erstellen von Sicherungen

Mehr

Acrolinx IQ. Verbindungen mit externen Terminologiedatenbanken 2.9

Acrolinx IQ. Verbindungen mit externen Terminologiedatenbanken 2.9 Acrolinx IQ Verbindungen mit externen Terminologiedatenbanken 2.9 2 Inhalt Einleitung 3 Über diesen Leitfaden...3 Verbinden mit externen Terminologiedatenbanken 4 Erstellen von Sicherungen vorhandener

Mehr

Ein Bild sagt mehr als 1000 IP-Adressen. Ind. HiVision 4.0. Key Selling Features Key Selling Features 4.0. Partner Sales Training 2.

Ein Bild sagt mehr als 1000 IP-Adressen. Ind. HiVision 4.0. Key Selling Features Key Selling Features 4.0. Partner Sales Training 2. Ein Bild sagt mehr als 1000 IP-Adressen. Ind. HiVision 4.0 Key Selling Features Key Selling Features 4.0 Inhalt Allgemein Dokumentation Einzel- & Multikonfiguration Abspeichern und Laden der Einzel- &

Mehr

Anleitung: Notebook für den Betrieb in der DHBW einrichten und nutzen

Anleitung: Notebook für den Betrieb in der DHBW einrichten und nutzen Anleitung: Notebook für den Betrieb in der DHBW einrichten und nutzen 1 Inhaltsverzeichnis 1 Zugangsdaten an der DHBW... 3 2 OpenVPN Client installieren... 4 3 OpenVPN starten und mit dem Lehrenetz der

Mehr

Installation von Typo3 CMS

Installation von Typo3 CMS Installation von Typo3 CMS TYPO3 Version 6.2.x unter Windows Eigenen lokalen Webserver mit XAMPP installieren Für die Installation von Typo3 wird eine passende Systemumgebung benötig. Diese besteht aus

Mehr

Inhaltsverzeichnis. Teil 1 Node.js... 1

Inhaltsverzeichnis. Teil 1 Node.js... 1 xiii Teil 1 Node.js... 1 1 Was ist Node.js? 3 1.1 Die Zeitalter des Webs................................... 3 1.1.1 1990 bis 2000: Das Web 1.0....................... 3 1.1.2 2000 bis 2010: Das Web 2.0.......................

Mehr

Das Handbuch zu Desktop Sharing. Brad Hards Übersetzung: Frank Schütte

Das Handbuch zu Desktop Sharing. Brad Hards Übersetzung: Frank Schütte Brad Hards Übersetzung: Frank Schütte 2 Inhaltsverzeichnis 1 Einleitung 5 2 Das Remote Frame Buffer -Protokoll 6 3 Verwendung von Desktop Sharing 7 3.1 Verwaltung von Desktop Sharing-Einladungen.....................

Mehr

TimeMachine. Time CGI. Version 1.5. Stand 04.12.2013. Dokument: time.odt. Berger EDV Service Tulbeckstr. 33 80339 München

TimeMachine. Time CGI. Version 1.5. Stand 04.12.2013. Dokument: time.odt. Berger EDV Service Tulbeckstr. 33 80339 München Time CGI Version 1.5 Stand 04.12.2013 TimeMachine Dokument: time.odt Berger EDV Service Tulbeckstr. 33 80339 München Fon +49 89 13945642 Mail rb@bergertime.de Versionsangaben Autor Version Datum Kommentar

Mehr

Persona-SVS e-sync auf Windows Terminal Server

Persona-SVS e-sync auf Windows Terminal Server Persona-SVS e-sync auf Windows Terminal Server 2014 by Fraas Software Engineering GmbH Alle Rechte vorbehalten. Fraas Software Engineering GmbH Sauerlacher Straße 26 82515 Wolfratshausen Germany http://www.fraas.de

Mehr

estos MAPI Calendar Replicator 5.1.30.33611

estos MAPI Calendar Replicator 5.1.30.33611 estos MAPI Calendar Replicator 5.1.30.33611 1 Willkommen zu estos MAPI Calendar Replicator... 4 2 Voraussetzungen... 5 3 Funktionsweise... 6 4 Installation... 7 5 Konfiguration... 8 6 UCServer Verbindung...

Mehr

OP-LOG www.op-log.de

OP-LOG www.op-log.de Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server

Mehr

Subversion. Einstieg in die. Versionskontrolle

Subversion. Einstieg in die. Versionskontrolle Versionskontrolle mit Subversion Einstieg in die Versionskontrolle Dipl.Ing.(FH) K. H. Marbaise Agenda Wozu Versionskontrolle? Was leistet Versionskontrolle? Historie zu Subversion Projekt Handling Installation

Mehr

bnsyncservice Installation und Konfiguration bnnetserverdienst Voraussetzungen: KWP Informationssysteme GmbH Technische Dokumentation

bnsyncservice Installation und Konfiguration bnnetserverdienst Voraussetzungen: KWP Informationssysteme GmbH Technische Dokumentation bnsyncservice Voraussetzungen: Tobit DAVID Version 12, DVWIN32: 12.00a.4147, DVAPI: 12.00a.0363 Exchange Server (Microsoft Online Services) Grundsätzlich wird von Seiten KWP ausschließlich die CLOUD-Lösung

Mehr

Theorie und Praxis einer JSON-RPC-basierten Web-API

Theorie und Praxis einer JSON-RPC-basierten Web-API Theorie und Praxis einer JSON-RPC-basierten Web-API Christian Krause Christian.Krause@raritan.com Raritan Deutschland GmbH Chemnitzer LinuxTage 2015 Gliederung 1 2 Remote Procedure Call Interface Definition

Mehr

VPN Tracker für Mac OS X

VPN Tracker für Mac OS X VPN Tracker für Mac OS X How-to: Kompatibilität mit DrayTek Vigor Routern Rev. 1.0 Copyright 2003 equinux USA Inc. Alle Rechte vorbehalten. 1. Einführung 1. Einführung Diese Anleitung beschreibt, wie eine

Mehr

Bedienungsanleitung Modbus-LAN Gateway

Bedienungsanleitung Modbus-LAN Gateway Bedienungsanleitung Modbus-LAN Gateway Bedienungsanleitung Modbus-LAN Gateway Inhalt 1. Starten der Konfigurationsoberfläche des MLG... 3 2. Konfiguration MLG... 4 2.1. Network Settings... 4 2.1.1 Statische

Mehr

Workbooster File Exchanger Command Line Tool

Workbooster File Exchanger Command Line Tool Thema Technische Benutzerdokumentation - WBFileExchanger Workbooster File Exchanger Command Line Tool Letzte Anpassung 18. Januar 2014 Status / Version Finale Version - V 1.1 Summary Erstellung Diese technische

Mehr

Einführung in Betriebssysteme

Einführung in Betriebssysteme Einführung in Betriebssysteme APPLE ios Entwicklung von ios Entwickelt auf der Basis von MacOS X UNIX Vorgestellt am 9.1.2007 Zusammen mit iphone Markenname von Cisco Internetwork Operating System Für

Mehr

NOCTUA by init.at DAS FLEXIBLE MONITORING WEBFRONTEND

NOCTUA by init.at DAS FLEXIBLE MONITORING WEBFRONTEND NOCTUA by init.at DAS FLEXIBLE MONITORING WEBFRONTEND init.at informationstechnologie GmbH - Tannhäuserplatz 2 - A-1150 Wien - www.init.at Dieses Dokument und alle Teile von ihm bilden ein geistiges Eigentum

Mehr

JOB SCHEDULER. Managed User Jobs. Dokumentation Juli 2005. MySQL-Job-Automation

JOB SCHEDULER. Managed User Jobs. Dokumentation Juli 2005. MySQL-Job-Automation MySQL-Job-Automation Managed User Jobs JOB SCHEDULER Dokumentation Juli 2005 Software- und Organisations-Service GmbH Giesebrechtstr. 15 D-10629 Berlin Telefon (030) 86 47 90-0 Telefax (030) 861 33 35

Mehr

GmbH, Stettiner Str. 38, D-33106 Paderborn

GmbH, Stettiner Str. 38, D-33106 Paderborn Serial Device Server Der Serial Device Server konvertiert die physikalische Schnittstelle Ethernet 10BaseT zu RS232C und das Protokoll TCP/IP zu dem seriellen V24-Protokoll. Damit können auf einfachste

Mehr

Praktikum Internetprotokolle - POP3

Praktikum Internetprotokolle - POP3 Technische Universität Ilmenau Fakultät für Informatik und Automatisierung Institut für Praktische Informatik und Medieninformatik Fachgebiet Telematik/Rechnernetze 19. Mai 2008 1 Aufgabenstellung Praktikum

Mehr

bluelino 4G/ 4G+ Konfigurationssoftware

bluelino 4G/ 4G+ Konfigurationssoftware LinTech Bedienungsanleitung bluelino 4G/ 4G+ Konfigurationssoftware Revision 1.42 Inhalt 1 Konfiguration des bluelino 4G oder 4G+ ändern... 3 1.1 Voraussetzungen... 3 1.2 Start/Inbetriebnahme Konfigurationssoftware...

Mehr

Installation und Registrierung von WinGAEB 3.5 unter Linux mit CrossOver Office

Installation und Registrierung von WinGAEB 3.5 unter Linux mit CrossOver Office Installation und Registrierung von WinGAEB 3.5 unter Linux mit CrossOver Office 1. WINGAEB UND LINUX... 2 1.1. Systemvoraussetzungen... 2 1.2. Anmerkungen... 2 2. DIE INSTALLATION VON WINGAEB... 3 2.1.

Mehr

DCOM Einstellungen zur rechnerübergreifenden Kommunikation zwischen OPC Server und OPC Client

DCOM Einstellungen zur rechnerübergreifenden Kommunikation zwischen OPC Server und OPC Client DCOM Einstellungen zur rechnerübergreifenden Kommunikation zwischen OPC Server und OPC Client 1. Einleitung Für die rechnerübergreifende Kommunikation zwischen OPC Client und OPC Server wird bei OPC DA

Mehr

Managed VPSv3 Was ist neu?

Managed VPSv3 Was ist neu? Managed VPSv3 Was ist neu? Copyright 2006 VERIO Europe Seite 1 1 EINFÜHRUNG 3 1.1 Inhalt 3 2 WAS IST NEU? 4 2.1 Speicherplatz 4 2.2 Betriebssystem 4 2.3 Dateisystem 4 2.4 Wichtige Services 5 2.5 Programme

Mehr

Präsentation. homevisu Familie. Peter Beck. Juni 2011. www.p-b-e.de. 2011 p b e Peter Beck 1

Präsentation. homevisu Familie. Peter Beck. Juni 2011. www.p-b-e.de. 2011 p b e Peter Beck 1 Präsentation homevisu Familie Peter Beck Juni 2011 2011 p b e Peter Beck 1 Funktionensumfang Der Funktionsumfang das provisu Framework. Modular und durch Plug-In erweiterbar / anpassbar. Plug-In Schnittstelle

Mehr

Mitglied der: KNX Association OPC Foundation BACnet Interest Group Europe. Dokumentversion: 1.0.2

Mitglied der: KNX Association OPC Foundation BACnet Interest Group Europe. Dokumentversion: 1.0.2 Mitglied der: KNX Association OPC Foundation BACnet Interest Group Europe Dokumentversion: 1.0.2 Inhaltsverzeichnis 1. System Überblick 4 2. Windows Firewall Konfiguration 5 2.1. Erlauben von DCOM Kommunikation

Mehr

Sophos Anti-Virus. Felizitas Heinebrodt. Technische Hochschule Nürnberg Rechenzentrum Kesslerplatz 12, 90489 Nürnberg. Version 12 September 2014

Sophos Anti-Virus. Felizitas Heinebrodt. Technische Hochschule Nürnberg Rechenzentrum Kesslerplatz 12, 90489 Nürnberg. Version 12 September 2014 Sophos Anti-Virus Felizitas Heinebrodt Technische Hochschule Nürnberg Rechenzentrum Kesslerplatz 12, 90489 Nürnberg Version 12 September 2014 DokID: sophos Vers. 12, 20.08.2015, RZ/THN Informationen des

Mehr

Einführung in die Cross-Plattform Entwicklung Das Intel XDK

Einführung in die Cross-Plattform Entwicklung Das Intel XDK Einführung in die Cross-Plattform Entwicklung Das Intel XDK Einführung Dieses Hands-on-Lab (HOL) macht den Leser mit dem Intel XDK vertraut. Es wird Schritt für Schritt die erste eigene Hybrid-App entwickelt

Mehr

Whitepaper. Produkt: combit List & Label 16. List & Label Windows Azure. combit GmbH Untere Laube 30 78462 Konstanz

Whitepaper. Produkt: combit List & Label 16. List & Label Windows Azure. combit GmbH Untere Laube 30 78462 Konstanz combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit List & Label 16 List & Label Windows Azure List & Label Windows Azure - 2 - Inhalt Softwarevoraussetzungen 3 Schritt 1: Neues Projekt

Mehr

KURZANLEITUNG CLOUD BLOCK STORAGE

KURZANLEITUNG CLOUD BLOCK STORAGE KURZANLEITUNG CLOUD BLOCK STORAGE Version 1.12 01.07.2014 SEITE _ 2 INHALTSVERZEICHNIS 1. Einleitung......Seite 03 2. Anlegen eines dauerhaften Block Storage...Seite 04 3. Hinzufügen von Block Storage

Mehr

Wie fängt man an. Fortgeschrittene Kontakt Verwaltung

Wie fängt man an. Fortgeschrittene Kontakt Verwaltung Wie fängt man an Um alle Vorzüge der iphone TBird Anwendung zu nutzen, sollten nachfolgende Hinweise gelesen werden. Fortgeschrittene Kontakt Verwaltung Mit der TBird iphone Anwendung ist es möglich Kontakte

Mehr

Versionskontrolle mit Subversion

Versionskontrolle mit Subversion mit im Rahmen der Projektarbeit "Moderne Methoden der Parallelverarbeitung" Michael Süß Universität Kassel http://www.se.e-technik.uni-kassel.de/se/index.php?id=494 Michael Süß, November 23, 2004 mit -

Mehr

Das Beste aus zwei Welten

Das Beste aus zwei Welten : Das Beste aus zwei Welten Das Beste aus zwei Welten Aufruf von R Funktionen mit PROC IML KSFE 2012 08.03.2012 ist IT Dienstleister für Business Intelligence und Datenanalyse gibt es seit über 20 Jahren

Mehr

Kurzanleitung zu Webordnern in ILIAS

Kurzanleitung zu Webordnern in ILIAS Kurzanleitung zu Webordnern in ILIAS Stand: März 2010 Dipl.-Hdl. Mark Kusserow Christian Bogen, M.A. CompetenceCenter E-Learning des Prorektors für Lehre und Studium E-Mail: elearning-ilias@uni-koeln.de

Mehr

Internetprotokolle: POP3. Peter Karsten Klasse: IT7a. Seite 1 von 6

Internetprotokolle: POP3. Peter Karsten Klasse: IT7a. Seite 1 von 6 Internetprotokolle: POP3 Peter Karsten Klasse: IT7a Seite 1 von 6 Alle Nachrichten, die auf elektronischem Weg über lokale oder auch globale Netze wie das Internet verschickt werden, bezeichnet man als

Mehr

Systemanforderungen Verlage & Akzidenzdruck

Systemanforderungen Verlage & Akzidenzdruck OneVision Software AG Inhalt Asura 9.5, Asura Pro 9.5, Garda 5.0...2 PlugBALANCEin 6.5, PlugCROPin 6.5, PlugFITin 6.5, PlugRECOMPOSEin 6.5, PlugSPOTin 6.5,...2 PlugTEXTin 6.5, PlugINKSAVEin 6.5, PlugWEBin

Mehr

Projekt AGB-10 Fremdprojektanalyse

Projekt AGB-10 Fremdprojektanalyse Projekt AGB-10 Fremdprojektanalyse 17. Mai 2010 1 Inhaltsverzeichnis 1 Allgemeines 3 2 Produktübersicht 3 3 Grundsätzliche Struktur und Entwurfsprinzipien für das Gesamtsystem 3 3.1 Die Prefuse Library...............................

Mehr

Call Monitor und TAPI mit Outlook & Exchange Integration an Cisco UC540W

Call Monitor und TAPI mit Outlook & Exchange Integration an Cisco UC540W Call Monitor und TAPI mit Outlook & Exchange Metacarp GmbH Geschäftsführer: Alexander Cimen Unter den Eichen 5 (Haus i) 65195 Wiesbaden T: +49 (0) 611 53 1777 55 F: +49 (0) 611 53 1777 51 E: info@metacarp.de

Mehr

17.2 MS-Access Projekte

17.2 MS-Access Projekte 964 Von MS-Access 2000 zum SQL-Server 17.2 MS-Access Projekte MS-Access-Projekte, die die Dateiendung adp besitzen, werden als Front-End-Anwendung verwendet. Für die Back-End-Seite gibt es mehrere Möglichkeiten.

Mehr

ekey TOCAhome pc Software Inhaltsverzeichnis 1. ZWECK DIESES DOKUMENTS... 3 2. VERWENDUNGSHINWEIS ZUR SOFTWARE... 3

ekey TOCAhome pc Software Inhaltsverzeichnis 1. ZWECK DIESES DOKUMENTS... 3 2. VERWENDUNGSHINWEIS ZUR SOFTWARE... 3 Inhaltsverzeichnis Software ekey TOCAhome pc 1. ZWECK DIESES DOKUMENTS... 3 2. VERWENDUNGSHINWEIS ZUR SOFTWARE... 3 3. MONTAGE, INSTALLATION UND ERSTINBETRIEBNAHME... 3 4. VERSION... 3 Version 1.5 5. BENUTZEROBERFLÄCHE...

Mehr

U SB M I N I ADAPTE R BLUETOOTH

U SB M I N I ADAPTE R BLUETOOTH COMMUNICATION S U PPOR T U SB M I N I ADAPTE R BLUETOOTH CLASS I I H A N DBU C H NI - 7075 2 0 C O M M U N I C AT I O N S U P P O R T U S B A D A P T E R B L U E T O O T H C L A S S I I V i e l e n D a

Mehr