J2ME - Instytut Informatyki Politechniki Poznańskiej

Download Report

Transcript J2ME - Instytut Informatyki Politechniki Poznańskiej

J2ME CLDC MIDP 1.0
Błażej Pietrzak
[email protected]
Plan prezentacji
Przegląd technologii Java
J2ME CLDC MIDP 1.0
OTA Provisioning
CLDC MIDP 1.0 API
Problemy
implementacyjne
Przegląd technologii Java
Skróty
• CLDC – Connected Limited Device
Configuration
• CDC – Connected Device Configuration
• KVM – Kilobyte Java Virtual Machine
• JVM – Java Virtual Machine
• MID – Mobile Information Device
• MIDP - Mobile Information Device Profile
Stos J2ME
Stos J2ME - Konfiguracje
CLDC – Charakterystyka
urządzeń
• 160kB – 512 kB pamięci dla platformy
Java
• Procesor 16-bit lub 32-bit
• Niskie zużycie energii
• Dostęp do sieci, często bezprzewodowej,
o niskiej przepustowości
(często 9600 bps i niższej)
CLDC – Zakres
• Podstawowe biblioteki Java
– java.lang.*, java.util.*
• Wejście / Wyjście
– java.io.*
• Sieć (tylko interfejs)
– Generic Connection
Framework
• Bezpieczeństwo
• Lokalizacja
(ang. Internationalization)
– zapis/odczyt Unicode ze strumieni
CLDC – Zakres c.d.
• System properties
java.lang.System.getProperty(key)
microedition.platform
microedition.encoding
microedition.configuration
microedition.profiles
CLDC – Bezpieczeństwo
• Weryfikacja pobranych klas
• Aplikacje uruchamiane są w
piaskownicy (ang. Sandbox)
• Klasy w chronionych
pakietach systemowych nie
mogą być nadpisane przez
aplikacje
CLDC – Ograniczenia
Ograniczenia w stosunku do J2SE
– Brak danych typu
zmiennoprzecinkowego
• float
• double
– Brak finalizacji (ang. finalization)
instancji klas
• Object.finalize() nie istnieje
– Obsługa błędów
• brak większości podklas java.lang.Error
• Błędy są obsługiwane w sposób zależny
od urządzenia
CLDC – Ograniczenia c.d.
– Brak Java Native Interface (JNI)
– Brak class-loaders zdefiniowanych
przez użytkownika
– Brak mechanizmu refleksji (ang.
reflection)
– Brak obsługi grup wątków i wątków
demonów
– Brak słabych referencji (ang. weak
references)
CLDC/KVM – Weryfikacja klas
CLDC/KVM – Weryfikacja klas
c.d.
• Do klasy dodany jest atrybut „stack
map” nie występujący w J2SE
• Zwiększony rozmiar klasy o około 5%
• Szybciej niż w J2SE
• mniejsze zużycie pamięci niż w J2SE
• ten sam poziom bezpieczeństwa co
w J2SE
• Klasy mogą nadal być uruchamiane
w J2SE
MIDP – Charakterystyka MID
Wyświetlacz (wymagania minimalne)
– Rozmiar 96x54 pikseli
– Głębia koloru 1-bit
– Kształt piksela (Aspect ratio) około 1:1
Wejście
– One-handed keyboard
(ITU-T phone keypad)
– Two-handed keyboard (QWERTY keyboard)
– Ekran dotykowy
MIDP - Zakres
• Interfejs użytkownika
– Structured (Screen)
• wysokopoziomowy dostęp
• większa przenoszalność
– Unstructured (Canvas)
• niskopoziomowy dostęp
• mniejsza przenoszalność
• Generic Connection
Framework
– protokół http
MIDP – Zakres c.d.
• Dostęp do pamięci „stałej”
urządzenia
– Record Store
– Dane zapisywane w postaci
rekordów
– Możliwość prostego filtrowania
rekordów
• Cykl życia aplikacji
– MIDlet
• System properties
– microedition.locale
OTA Provisioning
• MIDlet Suite - dystrybucja aplikacji
J2ME
– *.jad JAva Descriptor
– *.jar JAva aRchive
OTA Provisioning – c.d.
OTA Provisioning – c.d.
OTA Provisioning – c.d.
• HTTP 401 (unauthorized) lub 407
(proxy authentication required)
• Implementacja przynajmniej
Basic Authentication Scheme
• cookie jako identyfikator sesji
• MIME
text/vnd.sun.j2me.app-descriptor
jad
• Kodowanie przynajmniej UTF-8
OTA Provisioning – c.d.
• Identyfikacja urządzenia
– User-Agent
– Accept-Language
– Accept
OTA Provisioning – c.d.
• Plik JAD – wymagane atrybuty
Atrybut
Opis
MIDlet-Name
Nazwa MIDlet Suite
MIDlet-Version
Numer wersji MIDlet Suite
MIDlet-Vendor
Organizacja
MIDlet-<n>
Nazwa, ikona, klasa <n> MIDletu
MIDlet-Jar-URL
URL, z którego można pobrać plik jar
MIDlet-Jar-Size
Liczba bajtów pliku jar
MicroEdition-Configuration
Wymagany profil J2ME
MicroEdition-Profile
Wymagana konfiguracja J2ME
OTA Provisioning – c.d.
• Plik JAD – opcjonalne atrybuty
Atrybut
Opis
MIDlet-Data-Size
Minimalna liczba bajtów pamięci
MIDlet-Delete-Confirm
Treść pytania przy usuwaniu MIDlet
Suite
MIDlet-Description
Opis MIDlet Suite
MIDlet-Icon
Ikona MIDlet Suite
MIDlet-Info-URL
URL do dodatkowej informacji
MIDlet-Install-Notify
Status pobierania MIDlet Suite
OTA Provisioning – c.d.
• Fragment przykładowego pliku jad
MIDlet-Name: Sample
MIDlet-Version: 1.0
MIDlet-Vendor: BP
MicroEdition-Profile: MIDP-1.0
MicroEdition-Configuration: CLDC-1.0
...
MIDlet-1: Sokoban, /icons/Sokoban.png,
com.bp.sokoban.Sokoban
MIDlet-2: HttpTest,,com.bp.http.HttpTest
API - MIDlet
Pakiet javax.microedition.midlet
API – interfejs użytkownika
Command
API – interfejs użytkownika
Command – c.d.
API – interfejs użytkownika
Pakiet javax.microedition.lcdui
API – Hello World
API – HelloWorld.jad
MIDlet-1: Hello World, , HelloWorldMIDlet
MIDlet-Jar-Size: 100
MIDlet-Jar-URL: HelloWorld.jar
MIDlet-Name: HelloWorld
MIDlet-Vendor: BP
MIDlet-Version: 1.0
text: JUG rulez!
API – HelloWorldMIDlet.java
public class HelloWorldMIDlet extends MIDlet {
private Displayable form
= new HelloWorldForm(getAppProperty("text"));
public HelloWorldMIDlet() {
form.setCommandListener(
new HelloWorldListener(this));
}
protected void startApp()
throws MIDletStateChangeException {
Display.getDisplay(this).setCurrent(form);
}
protected void pauseApp() { }
public void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
notifyDestroyed();
}
API – HelloWorldForm.java
import javax.microedition.lcdui.*;
public class HelloWorldForm extends Form {
public static final String EXIT = "Wyjście";
public HelloWorldForm(String text) {
super("Hello World");
append((text == null) ? "" : text);
addCommand(new Command(EXIT, Command.EXIT, 1));
}
}
API – HelloWorldListener.java
public class HelloWorldListener
implements CommandListener {
private HelloWorldMIDlet owner = null;
public HelloWorldListener(HelloWorldMIDlet owner) {
this.owner = owner;
}
public void commandAction(Command c, Displayable d){
if (c.getLabel().equals(HelloWorldForm.EXIT)) {
try {
owner.destroyApp(false);
} catch (MIDletStateChangeException ex) { }
}
}
}
API – Generic Connection
Framework
Pakiet javax.microedition.io
API – Generic Connection
Framework – Przykłady
Connection conn =
Connector.open({scheme}:[{target}][parms]);
• Pliki
(StreamConnection)
Connector.open(„file://bp.txt”);
• HTTP
(HttpConnection)
Connector.open(„http://localhost:8080/”);
• Sockets
(DatagramConnection)
Connector.open(„socket://129.14.11.2:9000”);
API – Record Store
pakiet javax.microedition.rms
API – RecordStore – Przykład
public class FilterComparator
implements RecordFilter, RecordComparator {
public boolean matches(byte[] candidate) {
return (candidate[0] == ‘A’ ?
false : true;
}
public
if
if
if
}
}
int compare(byte[] arg1, byte[] arg2){
(arg1[0] > arg2[0]) { return 1; }
(arg1[0] == arg2[0]) { return 0; }
(arg1[0] < arg2[0]) { return –1; }
API – RecordStore – Przykład
public void openRecordStore(String name) {
try {
recordStore =
RecordStore.openRecordStore(name,
true);
} catch (RecordStoreException ex) { }
}
API – RecordStore – Przykład
public void addPerson(String name, int age) {
ByteArrayOutputStream baos
= new ByteArrayOutputStream();
DataOutputStream outputStream
= new DataOutputStream(baos);
try {
outputStream.writeInt(age);
outputStream.writeUTF(name);
} catch (IOException ex) { }
byte[] b = baos.toByteArray();
try {
recordStore.addRecord(b, 0, b.length);
} catch (RecordStoreException ex) { }
}
API – RecordStore – Przykład
public void printPeople(RecordFilter filter,
RecordComparator comparator) {
RecordEnumeration re = null;
ByteArrayInputStream bais = null;
DataInputStream inputStream = null;
try {
re = recordStore.enumerateRecords(filter,
comparator, true);
while (re.hasNextElement()) {
int id = re.nextRecordId();
bais = new ByteArrayInputStream(
recordStore.getRecord(id));
inputStream = new DataInputStream(bais);
...
API – RecordStore – Przykład
try {
int age = inputStream.readInt();
String name = inputStream.readUTF();
} catch (EOFException ex) { }
....
Implementacja
Problemy
–
–
–
–
–
–
–
Rozmiar pamięci
Szybkość działania
Rozmiar kodu
Rozmiar ekranu
Klawiatura
Błędy w implementacji KVM
Garbage Collector
Literatura
• Mobile Information Device Profile (MIDP) 1.0 Final
http://jcp.org/aboutJava/communityprocess/final/jsr037/index.html
• MIDP APIs for Wireless Applications
http://java.sun.com/products/midp/midp-wirelessapps-wp.pdf
• Applications for MIDs
http://java.sun.com/products/midp/midpwp.pdf
• MIDP 1.0 Style Guide
http://java.sun.com/j2me/docs/zip/style-guide-html.zip
• Forum Nokia
http://www.forum.nokia.com/
• Motocoder
http://developers.motorola.com/developers/default.asp
Koniec
Dziękuję za uwagę i oczekuję pytań 