Programmieren mobiler Geräte - High Performance and Web

Werbung
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://[email protected]/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
Herunterladen