Programmierung von Mobiltelefonen mit Python
-
Upload
andreas-schreiber -
Category
Technology
-
view
2.909 -
download
2
description
Transcript of Programmierung von Mobiltelefonen mit Python
Folie 1Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Programmierung von Mobiltelefonen mit PythonSymbian S60
Andreas Schreiber <[email protected]>
PyCologne – Python User Group Köln, 11.02.2009
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 2
Smartphones
Kombination aus Mobiltelefon („Handy“)Personal Digital Assistant (PDA)
Viele Funktionen und ProtokolleTelefonie, PIM, Web-Browser, SMS, MMS, E-Mail, VoIP, Multimedia, Radio, Digitalkamera, GPS, DVB-H, … GSM, UMTS, GRPS, HSCSD, WLAN, Bluetooth, IR, USB, …
BetriebssystemSmartphones haben vollständige, erweiterbare BetriebssystemeHandys haben vordefinierte Oberfläche; nur begrenzt erweiterbar (z.B. durch Java)
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 3
Betriebssysteme für Smartphones
Liste: http://de.wikipedia.org/wiki/Smartphone#Betriebssysteme
Linux
Android
Openmoko
Mac OS X (Apple iPhone)
Palm OS
RIM BlackBerry
Symbian OS
UIQ (Sony Ericsson)
Series 80 (Nokia Communicator)
Series 60 (Nokia N-series & E-series, Siemens, Samsung, Motorola, Panasonic)
Windows
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 4
Symbian OS und S60
Symbian OS
Betriebssystem für Smartphones und PDAs
Microkernel, 32bit, Single User
GUI-zentriertes Applikations-Framework
S60
Benutzeroberfläche für Smartphones
Aktuell: S60 3rd Edition
Entwicklungsumgebungen
C++, Java, Web Widgets
(Flash Lite), (Python)
A schematic diagram of the S60 platform architecture.
Quelle: S60 Platform: Introductory Guide. Nokia Corporation, 2007.http://www.s60.com/business/developers/documents
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 5
Python for S60 (PyS60)
Portierung von Python auf S60-Plattform
Entwicklung von NOKIA
Open-Source-Lizenz (Apache Version 2 und Python)
Stable Release
Aktuelle Version: 1.4.5 (03.12.2008)
Verfügbar bei Sourceforgehttp://sourceforge.net/projects/pys60
Development Release
Aktuelle Version: 1.9.1 (24.01.2009)
Verfügbar bei maemo.orghttps://garage.maemo.org/projects/pys60
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 6
Installation von PyS60Version 1.9.1 unter Windows
1. Herunterladen des Installationspaketes(für Windows: PythonForS60_1.9.1_Setup.exe)
2. Der Installer installiert:
a. PyS60 Application Packager Ensymble
b. Python Dokumentation
c. Symbian Installationsdateien
3. Installation der Python Runtime und der Dependencies auf dem Smartphone
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 7
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 8
“Hello World”
import appuifwappuifw.app.title = u„Hello World"appuifw.note(u"Hello World!", 'info')
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 9
Start des Python-Interpreters
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 10
Ausführen von Python-Code (1)Skripte (“Run script”)
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 11
Ausführen von Python-Code (2)Interaktive Konsole
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 12
Ausführen von Python-Code (3)Bluetooth-Konsole
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 13
Bluetooth ConsoleMicrosoft HyperTerminal
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 14
Python APITypen und Bibliotheken von PyS60
Alle Built-In-Typen von Python 2.5.1 sind vorhanden
Python Standard Library
Viele der Standard-Module laufen
Python-Extensions für S60: Native C++-Erweiterungen
Built-in Extensions:
e32: API für die Services der Symbian OS Platform
appuifw: API für das UI Application Framework
Dynamisch nachladbare Extensions:
sysinfo, graphics, camera, keycapture, topwindow, gles, glcanvas, sensor, audio, telephone, messaging, inbox, location, positioning, calendar, contacts, e32db, logs
Entwicklung eigener Extensions per Python/C API möglich
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 15
Python S60-Module (1)Betriebssystem-Zugriff und -Information
e32
Zugriff auf Betriebssystem-Funktion von Symbian, die nicht durch GUI-Module oder die Python Standard Library abgedeckt sind, z.B. Scheduler, Process-Management, Drive-Liste, (Py-)S60-Versionen
sysinfo
Systeminformationen, z.B. aktiviertes Profil, Batteriestatus, Displaygröße, gesamter und freier Speicherplatz, OS Version, Signalstärke
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 16
Python S60-Module (2)Benutzerschnittstelle und Grafik (I)
appuifw
API für das S60 GUI Application Framework
graphics
Grafik- und Bildfunktionen, z.B. Laden, Speichern, Rotieren & Skalieren von Bildern, Erstellen von Grafiken mit Grafikprimitiven und Screenshots
camera
Aufnahme von Fotos und Video, Einstellen der Kamera-Parameter
keycapture
Abfangen von Tastatur-Events
topwindow
Einblenden von Fenstern über Applikationen, dargestellt wird ein graphics.Image
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 17
Python S60-Module (3)Benutzerschnittstelle und Grafik (II)
gles
Python API für OpenGL ES 2D/3D Grafik. Siehe OpenGL ES Standard bei Khronos (http://www.khronos.org/opengles/)
glcanvas
UI Steuerung für OpenGL ES Grafik
sensor
Zugriff auf physikalische Sensoren (Bewegung/Acceleration, Antippen/Tapping, Rotation)
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 18
Python S60-Module (4)Audio und Kommunikation
audio
Audio-Funktionen, z.B. Aufnahme, Abspielen von Audio-Dateien, Lautstärkeregelung, Sprachausgabe (text-to-speech)
telephone
Telefonie-Funktionen: Wählen, Auflegen und Rückruf
messaging
Senden von SMS und MMS
inbox
Zugriff auf Message-Folder (Inbox, Outbox, Sent und Draft)
location
Abfrage der GSM-Funkzellen-Informationen
positioning
Zugriff auf GPS-Empfänger
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 19
Python S60-Module (5)Datenmanagement
contacts
Zugriff auf Adressbuch (ContactDb), z.B. Suchen nach Kontakten, Anzeigen von Gruppen, Ändern von Kontaktinformationen, Import/Export von vCards
calendar
Zugriff auf die Kalender-Datenbank (CalendarDb), z.B. Hinzufügen und Ändern von Terminen, Ereignissen, Geburtstagen und Aufgaben, Behandlung wiederholender Einträge, Import/Export des vCalendar-Formats
e32db
Schnittstelle zur nativen Symbian Datenbank, z.B. Anlegen von Datenbanken und SQL-Abfragen
logs
Zugriff auf Telefon-Protokolle, z.B. Anrufe, SMS, Daten, Faxe, Mails
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 20
Struktur von Applikationen (1)Visuelles Layout
Typisches visuelles Layout von S60-Applikationen
TitleTitleNavigation TabsNavigation Tabs
BodyBody
MenuMenu ExitExit
DialogDialog
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 21
Struktur von Applikationen (2)Source-Code-Template
1. Import von Modulen
2. Screen Size setzen
3. Applications Menu
4. Exit key handler setzen
(Callback function)
5. Application title setzen
6. Application body
7. Active Objects
8. Main Loop
import appuifwimport e32
appuifw.app.screen = 'normal'
def item1(): print "item1 was selected.”
appuifw.app.menu = [(u"item 1", item1)]
def quit(): appuifw.app.set_exit()
app.exit_key_handler=quit
appuifw.app.title = u'Simple Application'
app_lock = e32.Ao_lock()# starts scheduler -> event processingapp_lock.wait()
Ausführliches Template unter:http://www.mobilenin.com/pys60/resources/app_skeleton_with_mainloop.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 22
Graphical User Interface (appuifw) Basiselemente
Dialoge
note: popup note
query: Texteingabe mit einem Feld
multi_query: Texteingabe mit zwei Feldern
Menus
popup_menu: Einfaches Menu
Auswahllisten
selection_list: Einfache Listenauswahl (vgl. „Radio buttons“)
multi_selection_list: Mehrfachauswahl (vgl. „Check boxes“)
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 23
Graphical User Interface (appuifw) Screen Size
Drei Formate für Applikationen
Rotation der Anzeige ist möglich (portrait, landscape)
normal large full
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 24
PackagingEnsymble Developer Utilities
Aufgaben
Erzeugung von SIS-Packages
Merge von SIS-Packages
Signing von Packages
Implementierung
Python-Module und command line tools
GUI „PyS60 Application Packager“ (Qt)
Folie 25Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
BeispieleBeispiele
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 26
Beispiel „Versenden einer SMS“ (1)Source Code
import appuifwimport messaging
data = appuifw.query(u"what are you doing?", "text")
receiver = "+49172940****"
if appuifw.query(u"Send message?", "query") == True: messaging.sms_send(receiver, data)
appuifw.note(u"Message sent.", "info")else: appuifw.note(u"Messages not sent!", "info")
send_sms.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 27
Beispiel „Versenden einer SMS“ (2)Ausführung
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 28
Beispiel „Versenden einer SMS“ (3)Erfolgskontrolle beim Empfänger
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 29
Beispiel „SMS-Empfang und Sound“ (1)Funktionen
Empfang von Befehlen per SMS („record“, „stop“, „play“, „clear“)
Aufzeichnen und Abspielen von Audio
sms_sound_demo.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 30
Beispiel „SMS-Empfang und Sound“ (2)Source Code: Sound-Operationenclass SoundRecorder: filename = 'e:\\boo.wav' # Drive E: is SD card mySound = None def record(self): self.mySound = audio.Sound.open(self.filename) self.mySound.record() def play(self): try: self.mySound = audio.Sound.open(self.filename) self.mySound.play() except: appuifw.note(u"No sound recorded!", "error") def stop(self): if self.mySound: self.mySound.stop() self.mySound.close() def clear(self): self.stop() os.remove(self.filename)
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 31
Beispiel „SMS-Empfang und Sound“ (3)Source Code: SMS-Empfangrecorder = SoundRecorder()
def message_received(msg_id): box = inbox.Inbox() sms_text = box.content(msg_id) appuifw.note(u"sms content: " + sms_text , "info") if sms_text == "play": recorder.play() elif sms_text == "record": recorder.record() elif sms_text == "stop": recorder.stop() elif sms_text == "clear": recorder.clear() app_lock.signal()
box = inbox.Inbox()box.bind(message_received)
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 32
Beispiel „Kontakte-Datenbank“
import contacts
db = contacts.open() print u"Searching contacts…"found = db.find('guy') # search in name, email, etc.
for guy in found: firstname = guy.find('first_name')[0].value company = guy.find('company_name')[0].value email_address = guy.find('email_address')[0].value print u"%s\n %s\n %s" %
(firstname, company, email_address)
contacts_demo.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 33
Beispiel „Kamera und File-Upload“ (1)Aufnahme von Bildern
import time
import appuifwimport camera
filename = time.strftime("n95-%Y%m%d%H%M%S.jpg", time.gmtime())
image = camera.take_photo()image.save(filename)appuifw.note(u"Photo saved to %s" % filename, 'info')
if imageToURL(filename) == 200: appuifw.note(u"Photo uploaded successfully.", 'info')else: appuifw.note(u"Photo upload failed!", 'error')
camera_upload.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 34
Kamera-EinstellungenOptionen von camera.take_photo()
def take_photo( mode='RGB16', size=(640, 480), zoom=0, flash='none', exposure='auto', white_balance='auto'):
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 35
Beispiel „Kamera und File-Upload“ (2)Hochladen auf Server mit httplib
import httplib, urllib, base64, os.pathdef imageToURL(aPath): data = open(aPath, 'rb').read() # read binary data of picture encodedData = base64.encodestring(data) # encoded it to base64 headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain",} params = urllib.urlencode({u'fileName':
os.path.split(aPath)[1], u'data':encodedData}) conn = httplib.HTTPConnection("www.onyame.de") conn.request("POST", "/image_uploader.php", params, headers) response = conn.getresponse()
conn.close() return response.status
Quelle: http://wiki.forum.nokia.com/index.php/How_to_upload_a_file_to_server_with_application/x-www-form-urlencoded
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 36
Beispiel „Kamera und File-Upload“ (3)Hochladen auf Server
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 37
Beispiel „Kamera und File-Upload“ (4)Erfolgskontrolle
http://www.onyame.de/upload/fb.php
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 38
Beispiel „Mandelbrot-Menge“ (1)Rahmenprogrammimport e32from appuifw import * app.screen = 'full'app.body = canvas = Canvas()width, height = canvas.size xaxis = width/2yaxis = height/1.5scale = 60iterations = 25 # <<iteration>> lock = e32.Ao_lock()app.exit_key_handler = lock.signallock.wait()
mandelbrot.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 39
Beispiel „Mandelbrot-Menge“ (2)Iterationsschleifefor y in range(height): for x in range(width): magnitude = 0 z = 0+0j c = complex(float(y-yaxis)/scale,
float(x-xaxis)/scale) for i in range(iterations): z = z**2+c if abs(z) > 2: v = 765*i/iterations if v > 510: color = (255, 255, v%255) elif v > 255: color = (255, v%255, 0) else: color = (v%255, 0, 0) break else: color = (0, 0, 0) canvas.point((x, y), color) e32.ao_yield()
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 40
Beispiel „Bewegungssensor“ (1)Abfrage der Beschleunigungssensoren
import sensor
sensors = sensor.sensors()
# Does this device have Accelerator Sensorif sensors.has_key('AccSensor'): SENSOR_ACC = True sensor_data = sensors['AccSensor'] sensor_acc = sensor.Sensor(sensor_data['id'], sensor_data['category']) sensor_acc.connect(handle_sensor_raw)
def handle_sensor_raw(a_data): if a_data.has_key('data_1'): acc_data_1 = a_data['data_1'] acc_data_2 = a_data['data_2'] acc_data_3 = a_data['data_3']
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 41
Beispiel „Bewegungssensor“ (2)Graphische Aufbereitung: „Sensor Analyzer“
http://jouni.miettunen.googlepages.com/sensoranalyzer
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 42
Beispiel „Location Based Service“Auswertung der GSM Cell ID
Send SMS to someone if caretan cell is nearimport location
HOME_CELL_ID = u"98521779"WIFE = u"+49173247****“
entries = [u"freu mich auf Dich!", u"hab Hunger.", u"hab schlechte Laune."]listbox = appuifw.Listbox(entries, shout)
home = 0while home == 0: country, provider, lac, cell = location.gsm_location() if (cell== HOME_CELL_ID): home = 1 message = u"Bin gleich zuhause und %s" % mood messaging.sms_send(WIFE, message)
cell_id_demo.py
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 43
Beispiel „OpenGL“
http://tinyurl.com/pys60cube
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 44
Links
Python for S60
http://opensource.nokia.com/projects/pythonfors60/index.html
http://sourceforge.net/projects/pys60 (Version 1.4.x)
https://garage.maemo.org/projects/pys60 (Version 1.9.x)
http://wiki.opensource.nokia.com/projects/Python_for_S60
Symbian S60
http://www.s60.com
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 45
Anlaufstellen für Hilfe
Python for S60 discussion board at Forum Nokia
http://discussion.forum.nokia.com/forum/forumdisplay.php?forumid=102
IRC channel #pys60 bei Freenode.net
irc://chat.freenode.net/pys60
Google Group Python for S60
http://groups.google.com/group/py4S60
Google Group PythonS60
http://groups.google.com/group/pythons60
Beispiele / Code-Snippets
http://wiki.forum.nokia.com/index.php/Category:Python#Code_Examples_for_Python
http://snippets.dzone.com/tags/series60
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 46
Python für andere mobile Geräte
Übersicht Python for Mobile Devices
http://www.awaretek.com/pymo.html
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 47
Literatur
Jürgen Scheible, Ville Tuulos.Mobile Python: Rapid Prototyping of Applications on the Mobile Platform
http://www.mobilepythonbook.org
Python User Group Köln > A. Schreiber > Programmierung von Mobiltelefonen mit Python > 11.02.2009
Folie 48
Fragen?Fragen?