J2ME CLDC MIDP 1.0
description
Transcript of J2ME CLDC MIDP 1.0
J2ME CLDC MIDP 1.0
Błażej Pietrzak [email protected]
Plan prezentacji
Przegląd technologii JavaJ2ME CLDC MIDP 1.0OTA ProvisioningCLDC MIDP 1.0 APIProblemy
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 propertiesjava.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 ConnectionFramework– 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 przynajmniejBasic 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 atrybutyAtrybut 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 atrybutyAtrybut 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 jadMIDlet-Name: SampleMIDlet-Version: 1.0MIDlet-Vendor: BPMicroEdition-Profile: MIDP-1.0MicroEdition-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żytkownikaCommand
API – interfejs użytkownikaCommand – 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 int compare(byte[] arg1, byte[] arg2){ if (arg1[0] > arg2[0]) { return 1; } if (arg1[0] == arg2[0]) { return 0; } if (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 Applicationshttp://java.sun.com/products/midp/midp-wirelessapps-wp.pdf
• Applications for MIDshttp://java.sun.com/products/midp/midpwp.pdf
• MIDP 1.0 Style Guidehttp://java.sun.com/j2me/docs/zip/style-guide-html.zip
• Forum Nokiahttp://www.forum.nokia.com/
• Motocoderhttp://developers.motorola.com/developers/default.asp
Koniec
Dziękuję za uwagę i oczekuję pytań