Programmieren mobiler Geräte - High Performance and Web
Transcription
Programmieren mobiler Geräte - High Performance and Web
Programmieren mobiler Geräte Datum Technologie Entwicklung Werkzeug Übung ENTWICKLUNG Grundlagen 23.10.30 1 Überblick Ant Kompilieren 30.10.03 2 WLAN, BT Eclipse Projektverwaltung 06.11.03 3 GSM Eclipse Debugging 13.11.03 4 WAP, WML, WMLS XML Nokia Toolkit WML, WMLS 20.11.03 5 WAP, SMS, MMS XML J2ME Toolkit Erste Schritte JAVA mobil 27.11.03 6 Einführung J2ME 04.12.03 7 MIDP 1.0 GUI 11.12.03 8 HTTP / Sockets RMS+IO 18.12.03 9 MIDP 2.0 Media+Game Grafik POSE RMS+IO Tomcat Servlet Kannel SMS Service Vernetzte Systeme 08.01.04 10 Grundlagen Netzwerke 15.01.04 11 Projektvergabe 22.01.04 12 29.01.04 13 05.02.04 14 12.02.04 15 SMS, MMS Cocoon Präsentationen Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 1 ENTWICKLUNG Unified Resource Locator/Identifier URL vereinheitlichte explizite, transiente Zugriffsanweisung zu einer Ressource im Internet entweder als absolute URL oder relative URL zu einer Basis URL Syntax RFC 2396: <scheme>://<user>:<password>@<host>:<port>/<path>? <query><argument>=<value>&<argument>=<value>#<fragment> Schemen sind z.B. : http, ftp, gopher, telnet, ssh, mailto, file, https, etc.... Beispiele: http://www.unibas.ch/ http://www.unibas.ch:80/index.html http://dict.leo.org/?search=gauge ftp://herbert@mambo.unibas.ch/daten/herbert/neue_daten.txt Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 2 ENTWICKLUNG Ports Wichtige Ports SMTP Mail 25 Telnet FTP 23 File Transfer HTTP 21 80 Portnummern kann man beliebig wählen. Cave: aktive Firewalls blockieren Ports; der HTTP-Port 80 ist meistens offen Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 3 Networking in J2SE vs. J2ME ENTWICKLUNG java.io.* java.net.* Das sind grosse, reichhaltige APIs mit entsprechenden Speicher- und PerformanceAnforderungen Spezielle Mobile Anforderungen Netzwerk Hardware Verbindung Software Beispiele Circuit-switched Network stream-based connection TCP, Sockets Packet-switched Network datagram-based connection UDP Abstraktion: Generic Connection Framework (GCF) all connections are created using the open static method of the Connector class Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 4 Connection Hierarchie ENTWICKLUNG CLDC 1.0 MIDP 1.0 neu MIDP 2.0 Der Pfeil bedeutet: “A ist ein(e) B” Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 5 ENTWICKLUNG Netzwerk IO mit MIDP Micro Information Device Profile 1.0 kennt nur HTTP als Netzwerkprotokoll. javax.microedition.io enthält Interfaces für verschiedene Verbindungsarten. java.io enthält die Stream, Writer und Reader Klassen aus J2SE nur high-level Connections Bei Micro Information Device Profile 2.0 zusätzlich Datagram, HTTPS, COMM, Socket based on the Generic Connection Framework (GCF) (auch low-level Connections) Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 6 java.io.ByteArrayInputStream All Packages class class java.io.DataInputStream Hierarchy For Package java.io.ByteArrayInputStream (implements java.io.DataInput) java.io Hierarchy For Package java.io Package Hierarchie java.io lass Hierarchy ENTWICKLUNG class java.io.DataInputStream class java.io.OutputStream class (implements java.io.DataInput) Package Hierarchies: class java.io.OutputStream java.io.ByteArrayOutputStream All Packages class java.io.DataOutputStream Package class Hierarchies: java.io.ByteArrayOutputStream (implements java.io.DataOutput) classAlljava.lang.Object Packages class java.io.DataOutputStream Class Hierarchy class java.io.PrintStream class java.io.InputStream (implements java.io.DataOutput) class java.io.Reader class class java.lang.Object class class java.io.PrintStream Class Hierarchy class java.io.InputStream java.io.ByteArrayInputStream class java.io.Reader java.io.InputStreamReader class class class java.io.DataInputStream class java.lang.Throwable java.io.ByteArrayInputStream class java.lang.Object java.io.InputStreamReader class java.lang.Exception (implements java.io.DataInput) class java.io.DataInputStream class java.lang.Throwable java.io.InputStream class class java.io.IOException (implements java.io.DataInput) class java.io.OutputStream class classclass java.lang.Exception class java.io.OutputStream class java.io.ByteArrayInputStream class java.io.IOException class java.io.EOFException class java.io.DataInputStream java.io.ByteArrayOutputStream class java.io.ByteArrayOutputStream class (implements java.io.DataInput) class java.io.DataOutputStream java.io.EOFException class java.io.DataOutputStream java.io. class java.io.OutputStream (implements java.io.DataOutput) class InterruptedIOException (implements java.io.DataOutput) class java.io.PrintStream class class java.io. class java.io.PrintStream class java.io.Reader java.io.ByteArrayOutputStream InterruptedIOException java.io. class Ausnahmen class java.io.Reader class java.io.DataOutputStream class UnsupportedEncodingException java.io.InputStreamReader (implements java.io.DataOutput) class class java.io. class java.lang.Throwable class java.io.PrintStream UnsupportedEncodingException java.io.InputStreamReader class java.lang.Exception java.io. class java.io.Reader class class java.io.IOException UTFDataFormatException class java.lang.Throwable class class java.io. class java.io.Writer class java.lang.Exception java.io.InputStreamReader java.io.EOFException UTFDataFormatException Unicode! class class class java.io.IOException class class java.lang.Throwable java.io.Writer java.io.OutputStreamWriter java.io. class java.lang.Exception class class InterruptedIOException class java.io.IOException java.io.OutputStreamWriter java.io.EOFException class nterface Hierarchy class java.io. class java.io.EOFException UnsupportedEncodingException Interface Hierarchy java.io. interface java.io.DataInput class class interface java.io.DataOutput java.io. InterruptedIOException java.io. interface java.io.DataInput InterruptedIOException UTFDataFormatException class interface java.io.DataOutput class java.io.Writer class java.io. classGeräte Departement Informatikjava.io. Programmieren mobiler http://www.informatik.unibas.ch/lehre UnsupportedEncodingException java.io.OutputStreamWriter Universität Basel Lektion 8 UnsupportedEncodingException 7 ENTWICKLUNG InputStream Typisches Szenario : Keieren ein InputStream Objekt von einer Connection Lesen der Input Information mit read() Cave: falls kein Input bereit ist und ein read versucht wird, erfolgt blocking einige Methoden von InputStream read() (liest ein Byte und gibt es als Integer zurück, oder -1 falls EOS.) read (byte b[]) (liest ein ByteArray) read (byte b[], int off, int len) available() (liest ein ByteArray mit Offset und Länge) (liefert die Anzahl Bytes, die ohne blocking gelesen werden können) close() Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 8 ENTWICKLUNG OutputStream Szenario: generiere ein OutputStream Objekt auf eine Connection rufe die write() Methode auf, um Information auszugeben es existiert auch hier ein blocking-Mechanismus Methoden write(int b) write(byte b[]) write(byte[], int off, int len) flush() (alle hängigen Daten werden ausgegeben) close() Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 9 ENTWICKLUNG Aufbau einer Verbindung 3 Schritte: Netzwerkverbindung Aufbauen Stream davon erhalten Daten lesen/schreiben open ist eine factory Methode: wir brauchen keine new Operation StreamConnection conn = null; InputStream in = null; StringBuffer data = new StringBuffer(); int ch Definitionen conn = (StreamConnection) Connector.open(”http://www.unibas.ch”); in = conn.openInputStream(); Schritt 1: verbinden Schritt 2: Stream erhalten Schritt 3: lesen while((ch = in.read()) != -1) { if(ch != ‘\n’){ lesen bis Zeilenumbruch und an Buffer anhängen data.append((char)ch); }else{ System.out.println(data.toString()); fertige Zeile herausschreiben data = new StringBuffer(); } Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 10 ENTWICKLUNG HTTP HTTP ist firewall-freundlich und von allen J2ME-Geräten unterstützt. Server Client Anfrage Antwort REQUEST RESPONSE HTTP 1.1 Methoden: GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS http://www.w3.org/Protocols/ Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 11 ENTWICKLUNG Client - Server Modell Request Client Server Response Verschieden Dienste Client: Anfrage (REQUEST) Server: Server wartet auf Anfragen Ausführung der geforderten Anfrage und Antwort (RESPONSE) Asynchron !! GET POST für Anfragen mit wenig Zusatzinformationen für Anfragen mit grossen Zusatzinformationen Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 Beispiel (GET-Request): telnet monet.physik.unibas.ch 80 GET /index.html HTTP/1.0 HTTP/1.1 200 OK Date: Wed, 10 Dec 2003 08:04:49 GMT Server: Apache/2.0.40 (Red Hat Linux) DAV/2 Last-Modified: Wed, 09 Apr 2003 11:11:31 GMT ETag: "38473-1a63-cb457ec0" Accept-Ranges: bytes Content-Length: 6755 Connection: close Content-Type: text/html; charset=ISO-8859-1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> ..... http://www.informatik.unibas.ch/lehre 12 ENTWICKLUNG HTTP Response Codes http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html 100 Continue 200 OK 301 Moved Permanently 304 Not Modified Beispiel (GET-Request): telnet monet.physik.unibas.ch 80 GET /index.html HTTP/1.0 400 Bad Request 403 Forbidden HTTP/1.1 200 404 Not Found 500 Internal Server Error 502 Bad Gateway Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 OK Date: Wed, 10 Dec 2003 08:04:49 GMT Server: Apache/2.0.40 (Red Hat Linux) DAV/2 Last-Modified: Wed, 09 Apr 2003 11:11:31 GMT ETag: "38473-1a63-cb457ec0" Accept-Ranges: bytes Content-Length: 6755 Connection: close Content-Type: text/html; charset=ISO-8859-1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> ..... http://www.informatik.unibas.ch/lehre 13 User Datagram Protocol (UDP) ENTWICKLUNG javax.microedition.io.UDPDatagramConnection Connector.open("datagram://java.sun.com:port") connection-less analog SMS HTTPS Sichere Verbindung mit SSL und Public Key Technik Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 14 ENTWICKLUNG Sockets Ein Socket (Anschluss-Buchse, “Steckdose”) ist ein Endpunkt einer 2-wegVerbindung zwischen 2 Programmen, die im Netzwerk laufen javax.microedition.io.SocketConnection javax.microedition.io.ServerSocketConnection Connector.open("socket://host:port") ergibt eine SocketConnection Connector.open("socket://:port") macht eine ServerSocketConnection Connector.open("socket://") weist eine freie Portnummer dynamisch zu. getLocalPort gibt die aktive Portnummer des Sockets zurück, und getLocalAddress die lokale URL-Adresse. Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 15 SocketConnection Interface ENTWICKLUNG ... SocketConnection client = (SocketConnection) Connector.open("socket://" + hostname + ":" + port); // set application-specific options on the socket. Call setSocketOption to set other options client.setSocketOption(DELAY, 0); client.setSocketOption(KEEPALIVE, 0); InputStream is = client.openInputStream(); OutputStream os = client.openOutputStream(); // send something to server os.write("some string".getBytes()); // read server response int c = 0; while((c = is.read()) != -1) { // do something with the response } // close streams and connection is.close(); os.close(); client.close(); ... Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 16 ENTWICKLUNG ServerSocketConnection Interface ... // create a server to listen on port 2500 ServerSocketConnection server = (ServerSocketConnection) Connector.open("socket://:2500"); // wait for a connection SocketConnection client = (SocketConnection) server.acceptAndOpen(); // set application-specific options on the socket; // call setSocketOption to set other options client.setSocketOption(DELAY, 0); client.setSocketOption(KEEPALIVE, 0); // open streams DataInputStream dis = client.openDataInputStream(); DataOutputStream dos = client.openDataOutputStream(); // read client request String result = is.readUTF(); // process request and send response os.writeUTF(...); // close streams and connections is.close(); os.close(); client.close(); server.close(); ... Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 17 ENTWICKLUNG HTTP vs. Sockets HTTP stateless = zustandslos Request, Response Szenario: Einkaufswagen-Anwendung 1. Aussuchen von Artikeln 2. Hinzufügen zum Einkaufswagen 3. Bezahlen der gewählten Artikel Problem mit zustandslosem Protokoll Lösung: Serverseitiges Session-Management Cookies Sockets Socket connected / unconnected Stream Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 18 ENTWICKLUNG Einfache Beispiele Anfrage auf ein Textfile Ausgabe einer vorgegebenen Zeile Anwendung für Abfragen einer Liste, Wörterbuch o. ä. Anfrage auf ein HTML-Dokument Parsen der Seite Erkennen und Herausdestillieren der interessierenden Stelle Anwendung für Extraktion von aktuellen Daten von Webpages Weitere Anfragetypen auf Servlets oder CGI (Common Gateway Interface) Datenbanken etc Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 19 Palm OS Emulator (POSE) ENTWICKLUNG J2ME MIDP 1.0 gibt es auch für Palm OS Palm versteht nur PRC als ausführenbare Datei: WTK104 / Utility / PRC Converter macht aus JAD+JAR ein PRC, das beim HotSync auf das POSE geladen werden kann. Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 20 ENTWICKLUNG POSE Installation Download von http://www.palmsource.com/developers/ Aber es fehlt das Herzstück, das ROM-Image Es kann mit einem Utility von einem echten Palm auf den Computer und in das POSE geladen werden. MIDP for PalmOS v1.0 muss auf das POSE geladen sein. (Install Application) http://java.sun.com/products/midp4palm/ Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 21 Selbstladende Canvas ENTWICKLUNG public class PartCanvas extends Canvas { //.... update Methode wird bei Bedarf vom MIDlet mit public PartCanvas() { myPartCanvas.update(); buffer = Image.createImage(128, 128); aufgerufen. } public void update() { try { System.err.println(url + "?im=" + String.valueOf(size) + "&" + urlParam); source = createImage(url + "?im=" + String.valueOf(size) + "&" + urlParam); g = buffer.getGraphics(); g.drawImage(source, 0, (start * size) / 256, g.TOP | g.LEFT); Bemerkung zum Ankerpunkt: repaint(); vertikale und horizontale Anker-Position } catch (Exception e) { sind mit bitweisem OR verknüpft. System.err.println(e + " : error in update()"); e.printStackTrace(); try-catch Block um fehlerträchtige Stelle, } Ausgabe auf der Konsole des WTK } protected void paint(Graphics g) { try { painting = true; g.drawImage(buffer, 0, 0, g.TOP | g.LEFT); g.setColor(0, 0, 0); g.drawString(message, getWidth() / 2, 0, g.TOP | g.HCENTER); paint() Methode von Lektion 7 painting = false; } catch (Exception e) { System.err.println(e + " : error in paint()"); } } Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 22 Selbstladende Canvas .. public Image createImage(String name) { ENTWICKLUNG überschreibt createImage() nutze normales createImage(), falls ein Bild aus dem JAR if (name.startsWith("/")) { return Image.createImage(name); verlangt ist. } else if (name.startsWith("http:")) { sonst lade das Bild vom Internet HttpConnection c = null; DataInputStream is = null; initialisiere die HTTP-Verbindung try { c = (HttpConnection) Connector.open(name); hole Status-Code und Länge status = c.getResponseCode(); der HTTP-Antwort finally { int len = (int) c.getLength(); if (is != null) { falls Status OK: if (status == 200) { try { is = c.openDataInputStream(); lies soviele Bytes wie als Länge is.close(); angegeben wurde byte[] data = new byte[len]; } catch (Exception e) { is.readFully(data); System.err.println(e); verwandle den Byte-Array in ein Bild return Image.createImage(data, 0, len); } und gib dies zurück } else { } message = String.valueOf(status); wenn Verbindungs-Status nicht OK: if (c != null) { return Image.createImage(256, 256); schreibe den Fehler-Code in ein leeres Bild try { und gib dies zurück c.close(); } } catch (Exception e) { } catch (Exception e) { System.err.println(e); System.err.println(e + " : error in createImage()"); } wenn keine Verbindung möglich: e.printStackTrace(); } schreibe dies in ein leeres Bild message = "Image N/A"; } und gib dies zurück return Image.createImage(256, 256); } in jedem fall: } } schliesse alle Verbindungen, die allenfalls offen sind. Departement Informatik Programmieren mobiler Geräte Universität Basel Lektion 8 http://www.informatik.unibas.ch/lehre 23 ENTWICKLUNG Projekt-Liste 1. WML/WMLS Seite für die Fachgruppe mit Kommunikationsfunktionalitäten 2. Bluetooth-Anwendung (BTAPI-DevKit für Linux vorhanden) 3. Mobile Blogging, Bildertagebuch auf einer Webpage das man mobil füttern kann 4. WMA/MMAPI : SMS/Multimedia in der J2ME Umgebung, Technologie austesten 5. JXTA: mobile peer-to-peer computing 6. Sichere Zahlungsüberweisung: Authentication, Authorisation, Session Handling 7. Multithreaded Networking, Wait-Screen, Download-Progressbar 8. Fraktal auf mobilem Device rechnen 9. Fraktal auf Server rechnen und Bild an Mobil-Device schicken 10. Mobiler Wetterdienst mit Daten vom Inst. f. Meteorologie d. Uni. Basel oder auch eigene Ideen! Auswählen bis 18.12.03 Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 24 Projekt-Präsentation ENTWICKLUNG Datum: letzte oder zweitletzte Semesterwoche Gruppen: 1 - 3 Leute Inhalt ca. 10 Minuten pro Person Aufbau Einleitung, Um was gehts? Wie löst man das? Demonstration Probleme, Erkenntnisse Fragen Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 25 ENTWICKLUNG Record Management System RMS Persistente Speicherung in eine einfache Record orientierte Datenbank DB Package javax.microedition.rms Eine Datenbank hat einen Namen: - Case sensitive - max. 32 Zeichen lang RecordId1 Bsp: myProg.db RecordId2 Record Store RecordId3 Die Datenbank DB besteht aus Sammlung von Einträgen (Records) Records bestehen aus eine Schlüssel Integer und einem Inhalt (array of Byte) Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 26 ENTWICKLUNG MIDlet Suite und RMS Midlet_Suite_1 RecordId1 Midlet1 Midlet2 Record Store RecordId2 RecordId3 Midlet_Suite_2 Midlet1 Midlet2 Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 27 RecordStore Operationen ENTWICKLUNG Package javax.microedition.rms Öffnen und Erzeugen eines Record Stores public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException Löschen eines Record Stores public static void deleteRecordStore(String recordStoreName) Suchen nach allen Namen von Record Stores des aktiven MIDlets public static String[] listRecordStores() Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 28 ENTWICKLUNG Exceptions java.lang.Object | +--java.lang.Throwable | +--java.lang.Exception | +--javax.microedition.rms.RecordStoreException - InvalidRecordIDException Falsche ID - RecordStoreFullException Die Record DB ist voll - RecordStoreNotFoundException Record DB kann nicht gefunden werden - RecordStoreNotOpenException Record DB kann nicht geöffnet werden try { recStore = RecordStore.openRecordStore(REC_STORE, true ); } catch (Exception e) { System.err.println(e.toString()); } Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 29 Zugriff auf Records ENTWICKLUNG Neuer Record hinzufügen: public int addRecord(byte[] data, int offset, int numBytes) Inhalt eines Record ändern: public void setRecord(int recordId, byte[] newData, int offset, int numBytes) Record löschen: public void deleteRecord(int recordId) Record lesen: public byte[] getRecord(int recordId) public int getRecord(int recordId, byte[] buffer, int offset) Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 30 ENTWICKLUNG Record Records sind Byte Array’s Jeder Record hat einen eindeutige ID (integer) Folgende Klassen können zum einpacken und auspacken in Records verwendet werden: DataOutputStream ByteArrayOutputStream RecordId1 Record Store DataInputStream ByteArrayInputStream RecordId1 RecordId2 RecordId2 RecordId3 RecordId3 Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 Record Store http://www.informatik.unibas.ch/lehre 31 ByteArrayOutputStream Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 ENTWICKLUNG http://www.informatik.unibas.ch/lehre 32 ENTWICKLUNG DataOutputStream DataOutput Interface unterstützt die Übersetzung jedes Basis Java Typ in Binäre Format. public void writeInt(int v) throws IOException (byte)(0xff (byte)(0xff (byte)(0xff (byte)(0xff Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 & & & & (v >> 24)) (v >> 16)) (v >> 8)) v) http://www.informatik.unibas.ch/lehre 33 ENTWICKLUNG WRITE int recId; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream outputStream = new DataOutputStream(baos); try { outputStream.writeInt(score); outputStream.writeUTF(playerName); } catch (IOException ioe) { System.out.println(ioe); } byte[] b = baos.toByteArray(); try { recId = recordStore.addRecord(b, 0, b.length); } catch (RecordStoreException rse) { System.out.println(rse); } Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 34 ENTWICKLUNG READ try { RecordEnumeration re = recordStore.enumerateRecords(null, this, true); while(re.hasNextElement()) { int id = re.nextRecordId(); ByteArrayInputStream bais = new ByteArrayInputStream(recordStore.getRecord(id)); DataInputStream inputStream = new DataInputStream(bais); try { int score = inputStream.readInt(); String playerName = inputStream.readUTF(); System.out.println(playerName + " = " + score); } catch (EOFException eofe) {System.out.println(eofe);} } } catch (RecordStoreException rse) { System.out.println(rse);} catch (IOException ioe) {System.out.println(ioe);} Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 35 ENTWICKLUNG Implementation Read I public void readRecords() { try{ // Intentionally small to test code below byte[] recData = new byte[5]; int len; for (int i = 1; i <= recStore.getNumRecords(); i++) { // Allocate more storage if necessary if (recStore.getRecordSize(i) > recData.length) recData = new byte[recStore.getRecordSize(i)]; len = recStore.getRecord(i, recData, 0); System.out.println("Record ID#" + i + ": " + new String(recData, 0, len)); } }catch (Exception e){ System.err.println(e.toString()); } } Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 36 ENTWICKLUNG Implementation Read II (RecordFilter filter, public void readRecordsUpdate() RecordComparator comparator, { boolean keepUpdated) try { System.out.println("Number of records: " + recStore.getNumRecords()); if (recStore.getNumRecords() > 0) { RecordEnumeration re = recStore.enumerateRecords(null, null, false); while (re.hasNextElement()) { String str = new String(re.nextRecord()); System.out.println("Record: " + str); } } } catch (Exception e) { System.err.println(e.toString()); } } Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 37 Starten jar,jad Files Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 ENTWICKLUNG http://www.informatik.unibas.ch/lehre 38 ENTWICKLUNG Deploy Im jar File steht der Programmcode, Resourcen und das MANIFEST.MF File Manifest-Version: 1.0 MIDlet-Name: Goldminer Trium Demo MIDlet-1: Goldminer, Goldminer.png, com.macrospace.games.goldminer.demo.GoldminerMidlet MIDlet-Version: 1.2.1 Created-By: 1.3.1 (Sun Microsystems Inc.) MIDlet-Vendor: Macrospace Ltd Version MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-1.0 wird vom Java Application Manager überprüft Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 39 ENTWICKLUNG Deploy Goldminer.jad MIDlet-1: Goldminer, Goldminer.png, com.macrospace.games.goldminer.demo.GoldminerMidlet MIDlet-Jar-Size: 27088 MIDlet-Jar-URL: Goldminer.jar MIDlet-Name: Goldminer Trium Demo MIDlet-Jar-URL: http://wap.rafm.org/Goldminer.jar MIDlet-Vendor: Macrospace Ltd MIDlet-Version: 1.2.1 Version Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 40 ENTWICKLUNG Upload http://wap.rafm.org/jar.php Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 41 Starten auf eigenem Device ENTWICKLUNG http://wap.rafm.org/Goldminer.jad Departement Informatik Universität Basel Programmieren mobiler Geräte Lektion 8 http://www.informatik.unibas.ch/lehre 42