450 likes | 632 Views
J2ME CLDC MIDP 1.0. Błażej Pietrzak blazej.pietrzak@cs.put.poznan.pl. 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
E N D
J2ME CLDC MIDP 1.0 Błażej Pietrzak blazej.pietrzak@cs.put.poznan.pl
Plan prezentacji • Przegląd technologii Java • J2ME CLDC MIDP 1.0 • OTA Provisioning • CLDC MIDP 1.0 API • Problemyimplementacyjne
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
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 ConnectionFramework • 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 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. • 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 atrybuty
OTA Provisioning – c.d. • Plik JAD – opcjonalne atrybuty
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 Pakiet javax.microedition.lcdui
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ń