SW 04eh(full permission)


Systemy Wbudowane
Dr inż. Mariusz Fraś
MIDP / MSA
Midlety
© maf 1
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Java for Mobile Devices
" Ogólna architektura
CLDC (Connected Limited Device Configuration) 1.0, 1.1
MIDP (Mobile Information Device Profile) 1.0, 2.0, 2.1, 3.0
Pakiety obowiÄ…zkowe i opcjonalne
Aplikacje Aplikacje OEM-owe Aplikacje
MIDP natywne
Klasy
OEM-owe
MIDP
CLDC
Oprogramowanie systemowe (natywne)
Sprzęt (MIDev.)
© maf 2
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Java for Mobile Devices
" MSA  Mobile Service Architecture
Moduły
" ObowiÄ…zkowe
" Warunkowe
Podzbiór MSA
" 8 modułów
Stos MSA
" 8 modułów
podzbioru MSA
+
pozostałe
© maf 3
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Profil MIDP
" Minimalne wymagania sprzętowe specyfikacji
MIDP/JTWI/MSA
Ekran
" Rozdzielczość x głebia : 96x54x1 / 125x125x12 / 128x128x16
" proporcja 1x1 (przybliżenie)
Pamięć
" MIDP 1.0: 128kB (nieulotna  komponenty MIDP) + 32kB
(ulotna  aplikacje) + 8kB (nieulotna  dane trwałe)
" MIDP 2.0: 256kB + 128kB + 8kB
" MSA: 1MB dla aplikacji (zalecane: 2MB)
Sieć:
" komunikacja dwustronna, bezprzewodowa, przerywana, ograniczone
pasmo
We
" klawiatura jedno- lub dwuręczna (0...9, kl. sterujące i wyboru)
" ekran dotykowy
Multimedia (dzwięk) - MIDP 2.0 (2.1  poprawki)
© maf 4
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Profil MIDP
" Wymagania programowe specyfikacji MIDP
Bardzo różne środowiska programowe
" Windows Mobile, Symbian, Linux based
Określone są wymagania dla:
" ZarzÄ…dzanie aplikacjami
" Interfejs użytkownika (UI)
" Obsługa trwałej pamięci (Persistent Storage)
" Obsługa we/wy
" Funkcje sieciowe (Networking)
HTTP 1.1
WAP lub TCP/IP
" Liczniki czasowe (Timers)  min. 40 ms dla 80% przypadków
Dwuetapowa weryfikacja klas
" Preweryfikacja  po kompilacji, przed instalacjÄ… aplikacji class
" Podczas Å‚adowania klas przeglÄ…d byte-kodu
© maf 5
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Profil MIDP
" Zawartość profilu MIDP
Pakiety javax.microedition rozszerzajÄ…ce CLDC
" javax.microedition.lcdui  obsługa interfejsu użytkownika
" javax.microedition.midlet  wsparcie tworzenia aplikacji MIDP
" javax.microedition.rms  obsługa pamięci stałej urządzenia
" javax.microedition.media  obsługa multimediów (Mobile Media API)
W CLDC okrojone: java.lang, java.util, java.io, java.microedition.io
Rozszerzenia java.util (CLDC)
" Timer, TimerTask  mechanizm wywoływania zadań w odstępach czasu
Rozszerzenia java.microedition.io (CLDC)
" General Connection Framework  ukrycie szczegółów połączenia
HttpConnection  wsparcie połączeń dla protokołu HTTP
MIDP 2.0 MIDP 3.0
" Game API " Bezpieczeństwo i uruchamianie wielu
" HTTP/HTTPS midletów
" Rozszerzona obsługa ekranu
© maf 6
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Aplikacje MIDP
" Cykl życia midlet ów
3 stany działania midlet ów
" Aktywny (Active)
startApp()  wywoływana przy aktywacji
resumeRequest()  powrót z zawieszenia  informowanie o gotowości
midlet u do aktywacji
" Zawieszony (Paused)
pauseApp()  przez urządzenie (np. przychodzące połączenie)
notifyPaused()  wywoływana przez aplikację
" Zniszczony/Zakończony (Destroyed)
destroyApp()  wywoływana przy zamykaniu midlet u
notifyDestroyed()  wywoływana przez aplikację
new() destroyApp()
Paused
Destroyed
startApp() pauseApp()
Active
destroyApp()
© maf 7
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Aplikacje MIDP
" MIDlet
Klasa główna musi rozszerzać klasę MIDlet z pakietu
javax.microedition.midlet  definiuje cykl życia aplikacji
public class MojMidlet extends MIDlet {...}
Midlety mają wydzieloną własną przestrzeń w pamięci stałej
" Szkielet midletu
public class MojMidlet extends MIDlet {
public void startApp() throws MIDletStateChangeException
{...}
public void pauseApp()
{...}
public void destroyApp(boolean flaga)
{...}
public MojMIDlet()
opcjonalny konstruktor
{...}
}
© maf 8
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Aplikacje MIDP
" Szkielet midletu
Brak funkcji main !
Parametr destroyApp(boolean flaga)
" true  midlet zawsze zamykany  przy wywołaniu przez platformę
" false  wyrzucanie wyjÄ…tku MIDletStateChangeException
WyjÄ…tki startApp()
" MIDletStateChangeException  midlet przechodzi w stan
zawieszenia, możliwy jest powrót do działania
" inny  aplikacja jest zamykana z wywołaniem destroyApp()
Konstruktor
" Publiczny, bezargumentowy
" Wywoływany przed startApp()
" Przygotowanie elementów aplikacji (np. interfejsu)
© maf 9
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs MIDletów
" Interfejs użytkownika
Odmienny od AWT
2 sposoby tworzenia interfejsu wyjściowego
" High-level API  wysoki poziom abstrakcji  przenośność aplikacji
" Low-level API  precyzyjna kontrola nad graficznymi elementami i
zdarzeniami we/wy  nie ma gwarancji przenośności aplikacji
Tylko jeden midlet ma dostęp do ekranu w danym momencie
Aplikacja ma częściową kontrolę nad wyświetlaniem elementów
Interfejs wejściowy
" Nie ma przycisków
" Rolę przycisków w interfejsie pełnią tzw. polecenia/komendy
(obiekty klasy Command)
" Polecenia są obsługiwane za pomocą programowalnych klawiszy
funkcyjnych urzÄ…dzenia
" Dodawane do okna wyświetlacza
" Definiowanie i ustawianie słuchaczy zdarzeń dla poleceń
© maf 10
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs MIDletów
" Ekran
Klasa Display
" Logiczna reprezentacja ekranu
" Każdy uruchomiony midlet ma dedykowany jeden taki obiekt
Obiekt zarządzający interfejsem urządzenia  menadżer ekranu
" Obsługa zdarzeń wejścia i wyjścia
" Zarządzanie wyświetlaniem komponentów
" Identyfikacja właściwości urządzenia wyświetlającego
uzyskanie menadżera
public static Display getDisplay(MIDlet midlet)
ekranu
ustawianie wyświetlanego
public void setCurrent(Displayable komponent)
obiektu (okna ekranu)
public Displayable getCurrent()
uzyskanie wyświetlanego
okna ekranu
public boolean isColor()
informacja n.t. kolorów
public int numColors()
public boolean vibrate(int czas)
włączanie/wyłączanie
wibracji i podświetlania
public boolean flashBacklight(int czas
© maf 11
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs MIDletów
" Elementy interfejsu
2 rodzaje elementów
" Obiekty-okna (wyświetlacze)  dziedziczące po klasie Displayable
" Kontrolki  umieszczane w pojemniku Form
Displayable  klasa abstrakcyjna dla podklas wyświetlanych
obiektów interfejsu
Screen  nadklasa klas obiektów-okien (interfejsu wysokiego
poziomu)
Displayable
Low-level API
Hi-level API
Screen Canvas
klasy
klasy
graficzne
TextBox List Alert Form
graficzne
© maf 12
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Obiekty-okna / wyświetlacze
Midlet może zawierać wiele takich obiektów
" TextBox  edycja tekstu List  lista wybieranych elementów
"
" Form  złożone formularze " Alert  wyświetlanie komunikatów
Tylko jeden może być wyświetlany w danej chwili
Zajmują cały ekran
Mogą zawierać
" Nagłówek  tytuł
" obiekt klasy Ticker  pasek z przesuwajÄ…cym siÄ™ tekstem
" Polecenia  obiekty klasy Command
" SÅ‚uchacze  powiÄ…zane z poleceniami
Metody (niektóre):
public boolean isShown();
public void addCommand(Command cmd);
public void removeCommand(Command cmd);
public void setCommandListener(CommandListener lis));
public int getWidth()
public int getHeight()
© maf 13
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Przykład  midlet i prosty element ekranu
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class MojMidlet extends MIDlet {
public void MojMidlet() {
TextBox tb = new TextBox( Moj Pierwszy Midlet ,
 Hello World! , 20, 0);
}
public void startApp() {
Display ekran = Display.getDisplay(this);
ekran.setCurrent(tb);
System.out.println( Hello World! );
&
}
public void pauseApp() {& }
public void destroyApp(boolean unconditional) {& }
}
© maf 14
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Obsługa zdarzeń w API wysokiego poziomu
Funkcję przycisków w interfejsie użytkownika pełnią polecenia
 obiekty klasy Command
Polecenia są obsługiwane za pomocą klawiszy funkcyjnych
urzÄ…dzenia
Schemat obsługi
" Utworzenie obiektu polecenia
" Dodanie polecenia do obiektu-okna (obiektu klasy Displayable)
" Ustawienie słuchacza dla polecenia
Klasa polecenia
" Konstruktor
public Command(String label, int type, int priority)
Etykieta (label)  tekst polecenia (wyświetlany nad klawiszem lub w menu)
Typ i priorytet określają które komendy i jak są wyświetlane na ekranie
Typy: BACK, CANCEL, EXIT, HELP , ITEM, OK, SCREEN , STOP
© maf 15
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Obsługa zdarzeń w API wysokiego poziomu
" Tworzenie i dodawane polecenia do instancji Displayable
(obiektu-okna)
Command cmd = new Command( Tekst , Command.Typ, p);
Screen.addCommand(cmd);
Przechwytywanie zdarzeń
" SÅ‚uchacz
Instancja powiadamiana o aktywowanych poleceniach
Wymagany Interfejs CommandListener
Narzuca metodÄ™ commandAction
public void commandAction(Command cmd, Displayable d)
Porównywanie: poleceń, typów, priorytetów
" Rejestracja słuchacza
Displayablema metodę rejestrującą słuchacza
public void setCommandListener(CommandListener lis)
© maf 16
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Przykład  dodanie obiektu Command
public class MojMidlet extends MIDlet
implements CommandListener {
public void MojMidlet() {
TextBox tb = ...
Command wyjscie = new Command( Koniec ,
Command.EXIT, 1);
tb.addCommand(wyjscie);
... }
public void startApp() {
...
tb.setCommandListener(this);
... }
public void commandAction(Command c,
Displayable d) {
if (c.getCommandType() == Command.EXIT) {
destroyApp(false);
notifyDestroyed();
}}
}
© maf 17
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Okno tekstu -TextBox
Okno do wyświetlania i edytowania wielowierszowego tekstu
TextBox(String tytul, String tekst, int maxLiZn, int ograniczenia)
Ograniczenia określające typ okna
" ANY  dowolny tekst
" DECIMAL  cyfry, znak minus, separator dziesiętny
" EMAILADDR  adres e-mail
" NUMERIC  cyfry, znak minus
" PASSWORD  hasło maskowane (np. *****)
" PHONENUMBER  numer telefonu
" UNEDITABLE  wyłączenie możliwości edycji
" URL  adres w postaci URL
Metody (niektóre):
String getString();
void setString(String tekst);
void insert(String tekst, int pozycja);
void delete(int offset, int length);
int getCaretPosition();
© maf 18
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Lista -List
Okno zawierajÄ…ce listÄ™ opcji (listÄ™ wyboru)
" Implementuje interfejs Choice
" Opcje mogą być w postaci tekstowej lub graficznej
List(String tytul, int typListy, String[] elementyString,
Image[] elementyObrazki)
Typy list
" EXCLUSIVE  pojedynczy wybór
" IMPLICIT  pojedynczy wybór podświetlonego elementu poleceniem
ustalonym metodÄ… setSelectCommand
" MULTIPLE  wielokrotny wybór
Wybrane metody:
int append(String s, Image img);
int getSelectedIndex();
void setSelectCommand(Command cmd); //ustala polecenie dla
//klawisza SELECT w urzÄ…dzeniu
© maf 19
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Powiadomienie -Alert
Okno dialogowe wyświetlające komunikat i obraz
" Komunikat wyświetlany jest przez określony czas ustalany metodą
setTimeout
" Potem następuje przełączenie na inne okno wskazywane metodą
setCurrent
Alert(String tytul, String tekstAlertu, Image obrazAlertu,
AlertType typAlertu)
Typy alertów
" ALARM, CONFIRMATION, ERROR, INFO, WARNING
Przykład
ekran = Display.getDisplay(this);
okno = new Form( Okno Glowne );
img = Image.createImage( /obrazek.png );
alert = new Alert( Uwaga ,  Koniec! , img, AlertType.INFO);
alert.setTimeout(3000); // po 3 sekundach przełączenie na okno
ekran.setCurrent(alert, okno);
© maf 20
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Formularz -Form
Może zawierać elementy wywiedzione z klasy Item
(javax.microedition.lcdui.Item)
2 sposoby tworzenia
public Form(String nazwaFormularza)
public void append(Item element)
public Form(String nazwaFormularza, Item[] elementyFormularza)
Inne metody
public void insert(int indeks, Item element);
public void delete(int numerElementu);
public Item get(int numerElementu);
public void set(int indeks, Item element);
public int size();
Item
StringItem TextField DateField ChoiceGroup Gauge ImageItem
© maf 21
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Elementy formularza
Napis
StringItem(String nazwa, String tekst);
public String getText(); //pobierz tekst
public void setText(String text); //ustaw tekst
Obrazek
Przykład:
Frm = new Form(Formularz);
Image obr;
try{
obr = Image.createImage(/Obrazek.png);
}catch (java.io.IOException e){
e.printStackTrace();
obr = null;
}
Frm.append(new StringItem(null,  Napis... , Item.PLAIN));
Frm.append(new ImageItem(null, obr, ImageItem.LAYOUT_DEFAULT, null));
© maf 22
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Elementy formularza
Pole tekstowe
public TextField(String nazwa, String tekstPocz, int maxLiczbaZnakow,
int ograniczenia);
public void delete(int poczatekTekstu, int dlugosc);
public void setString(String text);
public void insert(String tekst, int gdzie);
public void setChars(char[] data, int poczatekTekstu, int dlugosc);
public void setConstraints(int typOgraniczenia);
&
" Ograniczenia
TextField.ANY
TextField.EMAILADDR
TextField.NUMERIC
TextField.PASSWORD
TextField.PHONENUMBER
TextField.URL
" Przykład:
Form.append(new TextField(URL,
 http://www.google.pl/ , 256, TextField.URL))
© maf 23
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Elementy formularza
Suwak
Gauge(String nazwa, boolean czyMozliwaZmiana, int maxWartosc,
int poczatkowaWartosc);
public int getMaxValue();
public int getValue();
public void setValue(int wartosc);
public void setMaxValue(int wartosc)
" Przykład:
Form.append(new Gauge(
 Głośność , // etykieta
true, // możliwa zmiana
9, // max wartosc
5)); // poczatkowa wartosc
© maf 24
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Elementy formularza
Grupa wyboru
public ChoiceGroup(String etykieta,
int rodzaj, String[] nazwy,
Image[] obr);
public boolean isSelected(int index);
public int getSelectedIndex();
public void set(int index,
String tekst,
Image image);
&
" Rodzaje
Choice.EXLUSIVE
- pojedynczy wybór
Choice.MULTIPLE
- możliwy wybór kilku opcji
Choice.POPUP
- po wciśnięciu rozwija się
menu
© maf 25
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs wysokiego poziomu
" Elementy formularza
Pole daty
DateField(String nazwa, int rodzaj,
TimeZone strefa_czasowa);
DateField(String nazwa, int rodzaj);
public void setDate(Date data);
public Date getDate();
public void setInputMode(int rodzaj);
public int getInputMode();
" Rodzaje:
DateField.DATE
DateField.TIME
DateField.DATE_TIME
© maf 26
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs niskiego poziomu
" Canvas
Klasa bazowa do pisania aplikacji wykorzystujÄ…cych
interfejs graficzny (GUI) niskopoziomowy
Przestrzeń po której możemy rysować (płótno)
Metody
" repaint() - zgłoszenie odmalowania
" serviceRepaints()  wymuszenie odmalowania
" paint(Graphics g) metoda w której odbywa się rysowanie
" boolean isDoubleBuffered()  test czy Canvas jest podwójnie
buforowany
Canvas
" int getWidth()
" int getHeigh()
klasy
GameCanvas
Można dołączać
klasy
graficzne
klasy
graficzne
polecenia i obsługiwać
graficzne
klasy
je słuchaczami
klasy
graficzne
graficzne
© maf 27
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs niskiego poziomu
" Graphics
Klasa służąca do rysowania prymitywów, obrazków i tekstów
" void translate(int x, int y)  ustalenie środka układu
współrz.
Rysowanie prymitywów
" setColor(int RGB)  składowe RGB: 0xRRGGBB
" setColor(int red, int green, int blue)
" drawLine(int x1, int y1, int x2, int y2)
" void setStrokeStyle(int styl)
styl linii: Graphics.SOLIDi Graphics.DOTTED
" drawRect(int x, int y, int szer, int wys)
" fillRect(int x, int y, int szer, int wys)
&
© maf 28
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs niskiego poziomu
" Graphcs (c.d.)
Rysowanie tekstu
" setFont(Font font)  ustawienie czcionki
" static Font getFont(int face, int style, int size)
 utworzenie obiektu czcionki
" drawString(String str, int x, int y, int anchor)
drawChar(char znak, int x, int y, int anchor)
 wypisanie tekstu / znaku
Obrazki
" static Image createImage(String name)
 wczytanie obrazka z pliku
" drawImage(Image img, int x, int y, int anchor)
 malowanie obrazka
" Obrazki należy umieszczać
w katalogu /res projektu
anchor - wyrównanie:
© maf 29
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs niskiego poziomu
" Obsługa zdarzeń w API niskiego poziomu
Klasa Canvas może reagować na naciśnięcie klawiszy
" Pojedyncze - przesłaniane metody:
protected void keyPressed(int keyCode)
protected void keyReleased(int keyCode)
" Dłuższe przytrzymanie
protected void keyRepeated(int keyCode)
public boolean hasRepeatEvents() //sprawdzenie możliwości
" Kody przycisków w klasie Canvas
KEY_NUMx - (x = 0 do 9)
protected void keyPressed(int keyCode)
KEY_STAR = *
{
KEY_POUND = # switch (getGameAction(keyCode)) {
case Canvas.xxx:
" Akcje gry  obsługa metodą
&
getGameAction(int kod)
break;
UP, DOWN, LEFT, RIGHT
&
FIRE
}}
GAME_A (także: B,C,D)
 uzyskanie nazwy klawisza: String getKeyName(int akcja)
© maf 30
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Interfejs niskiego poziomu
" Obsługa zdarzeń w API niskiego poziomu
W przypadku bardziej zaawansowanych urządzeń rozpoznanie
urzÄ…dzenia
" Sprawdzenie dostępności zdarzeń
Czy obsługiwany ekran dotykowy
public boolean hasPointerEvents()
Czy wspierane przesuwanie po ekranie
public boolean hasPointerMotionEvents()
Obsługa  naciśnięcia punktu ekranu
pointerPressed(int x, int y)
&
Ulepszony Canvas
" Wspomaganie dla pisania gier
Podwójny bufor
Graphics getGraphics() //uzyskanie dostępu do bufora
flushGraphics() //podmiana bufora
Status wciśniętych klawiszy  sprawdzenie naciśnięcia wielu klawiszy
int getKeyStates()
© maf 31
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" System zarzÄ…dzania rekordami RMS (ang. Record
Management System)
Zapewnia zapis danych w pamięci urządzenia
Dostępny w pakiecie javax.microedition.rms
Podstawowe cechy
" podstawowym elementem jest rekord (tablica bajtów)
" Każdy rekord ma unikalny identyfikator
" Rekordy tworzą zbiór rekordów (obiekt klasy RecordStore)
zbiór rekordów ma przypisaną nazwę
zbiór rekordów ma określonego właściciela (dany MIDlet)
zbiór rekordów ma określone uprawnienia dostępu dla innych MIDletów
MIDlet może mieć dowolną liczbę zbiorów rekordów
Schemat użycia:
" Utworzenie lub otwarcie zbioru rekordów
" Wykonanie operacji we/wy
Przeglądanie rekordów
Zapis/odczyt rekordów
Usuwanie rekordów
" Zamknięcie (i ewentualnie usunięcie) zbioru
© maf 32
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" Klasa RecordStore
Statyczna metoda do tworzenia/otwierania zbioru rekordów
static RecordStore openRecordStore(String nazwa, boolean flaga)
" flaga  czy ma być tworzenie gdy zbiór już istnieje
static RecordStore openRecordStore(String nazwa, boolean flaga,
int dostep, boolean zapis)
" dostep  uprawnienia do zbioru
RecordStore.AUTHMODE_ANY  wszystkie MIDlety
RecordStore.AUTHMODE_PRIVATE tylko MIDlet tworzący zbiór
" zapis  flaga określająca, czy inne MIDlety mogą zapisywać dane do
nowo tworzonego zbioru
Otwieranie
RecordStore zbior;
zbior = RecordStore.openRecordStore( dane ,
true,
RecordStore.AUTHMODE_ANY,
true);
© maf 33
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" Wybrane metody RecordStore
String getName()  zwraca nazwÄ™ zbioru
int getNumRecords()
byte[] getRecord(int id)  zwraca rekord o identyfikatorze id
int getSize()  rozmiar zbioru w bajtach
int getSizeAvailable()  rozmiar wolnego obszaru dla zbioru
void addRecord(byte[] buf, int pocz, int n)
 dodaje rekord na końcu zbioru  dane z bufora buf od pocz do
pocz+n-1
void setRecord(int id, byte[] buf, int p, int n) 
zamiana zawartości (indeksowanie jak wyżej)
int getNextRecordID()
" Zapis danych
byte[] rekord = new byte[128];
//tu wypełnienie tablicy rekord odpowienimi danymi
zbior.addRecord(rekord, 0, rekord.length);
© maf 34
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" Usuwanie rekordów
void deleteRecord(int id)
Uwaga!!!: identyfikator usuniętego rekordu nie będzie ponownie
użyty  ciągłość identyfikatorów rekordów zostaje przerwana
" PrzeglÄ…danie zbioru
Obiekt klasy RecordEnumeration
" Iterator umożliwiający przeglądanie rekordów w zbiorze z
uwzględnieniem nieciągłości w numeracji identyfikatorów rekordów
Utworzenie iteratora
" Metoda RecordStore.enumerateRecords
RecordEnumeration enumerateRecords(RecordFilter filtr,
RecordComparator komparator, boolean aktualizacja)
" filtr  reguła filtrowania rekordów (określa, które rekordy zbioru będą
przetwarzane)
" komparator  reguła porównywania rekordów (wpływa na kolejność
zwracania rekordów ze zbioru)
" aktualizacja  flaga ustalająca, czy iterator uwzględnia zmiany
dokonane w zbiorze rekordów podczas przeglądania
© maf 35
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" PrzeglÄ…danie zbioru (cd.)
Wybrane metody RecordEnumeration
" boolean hasNextElement()
" boolean hasPreviousElement()
" byte[] nextRecord()
" byte[] previousRecord()
" int nextRecordID()
" int previousRecordID()
" void rebuild()  aktualizuje identyfikatory rekordów w iteratorze,
aby odpowiadały numeracji rekordów w zbiorze
Przykład odczytu
RecordStore zbior = ... // otwarcie zbioru rekordów zbior
RecordEnumeration iterator; // utworzenie iteratora
iterator = zbior.enumerateRecords(null, null, false);
byte[] rekord; // tablica na dane
while (iterator.hasNextElement()) { // dopóki są rekordy
rekord = iterator.nextRecord(); // pobranie rekordu
... }
© maf 36
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" Odczyt i zapis różnych danych
Obiekty klas strumieni we i wy dla tablic bajtów
" java.io.ByteArrayInputStream
" java.io.ByteArrayOutputStream
Powiązanie ze strumieniem wejścia/wyjścia
" DataOutputStream
writeInt(lint)
writeFloat(float)
writeChar(char)
writeUTF(string)
" DataInputStream
int readInt()
float readFloat()
char readChar()
String readUTF()
© maf 37
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa pamięci nieulotnej
" Przykład
RecordStore zbior = ... // otwarcie zbioru rekordów zbior
// utworzenie strumienia wyjściowego dla tablicy bajtowej
ByteArrayOutputStream str_b = new ByteArrayOutputStream();
// utworzenie strumienia wyjściowego
DataOutputStream str_wyj = newDataOutputStream(str_b);
Int li_c = 13; str_wyj.writeInt(li_c);
String s =  Java ME ; str_wyj.writeUTF(s);
Float li_r = 3.14; str_wyj.writeFloat(li_r);
Char znak =  X ; str_wyj.writeChar(znak);
byte[] rekord = str_b.toByteArray(); // tablica ze strumienia
zbior.addRecord(rekord, 0, rekord.length); // dodanie rekordu
str_b.close(); // zamknięcie strumieni
str_wyj.close();
© maf 38
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Koncepcja połączeń sieciowych w Java ME
Wzorzec komunikacji sieciowej GCF (ang. Generic Connection
Framework) dostępny w pakiecie javax.microedition.io
Zestaw interfejsów i klas pozwalający w jednolity sposób tworzyć
połączenia i wykonywać operacje wejścia / wyjścia
" połączenia oparte na strumieniach
" połączenia oparte na datagramach
" połączenia HTTP
" połączenia oparte na gniazdach
" połączenia poprzez szeregowy port logiczny
Wszystkie obiekty połączeń implementują interfejs bazowy
Connection
Klasa Connector służy do tworzenia obiektów klas implementujących
interfejs Connection, które reprezentują połączenia
Wysyłanie i odbieranie danych odbywa się za pomocą obiektów
strumieni pobieranych z obiektu połączenia
Wykorzystanie adresów URL (protokół w adresie wskazuje typ połącz.)
© maf 39
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Interfejsy Generic Connection Framework (GCF)
© maf 40
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Rodzaje połączeń
Connection - połączenie ogólne
" Dostępna jedna metoda close()
Połączenia oparte na strumieniach, dostęp na poziomie bajtów
InputConnection  połączenie wejściowe (odbieranie danych)
OutputConnection  połączenie wyjściowe (wysyłanie danych)
UDPDatagramConnection  połączenie oparte na
datagramach, wykorzystujące protokół UDP (W MIDP 2.0)
StreamConnectionNotifier  interfejs do tworzenia
serwerów gniazdek
StreamConnection  połączenie oparte na strumieniach
" Aączy metody interfejsów InputConnection i OutputConnection,
" Przesyłane są bajty
ContentConnection  połączenie oparte na strumieniach,
przesyłane są komunikaty
© maf 41
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Rodzaje połączeń (c.d.)
HttpConnection  połączenie wykorzystujące protokół HTTP
(MIDP 1.0)
HttpsConnection  szyfrowane połączenie HTTP (MIDP 2.0)
SocketConnection  połączenie oparte na gniazdkach (ang.
socket)
" Połączenie na dowolnym porcie, z dowolną usługą
SecureConnection  połączenie oparte na gniazdkach
" Zabezpieczone przy użyciu protokołu SSL lub TLS
CommConnection  połączenie poprzez szeregowy port logiczny
(RS-232, IrDA),
" Bajty przesyłane szeregowo
" Metody:
int getBaudRate();
int setBaudRate(int rate);
© maf 42
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Schemat obsługi połączeń
Utworzenie obiektu połączenia
Uzyskanie dostępu do strumieni połączenia
Transmisja danych:
" Wysyłanie danych
" Odbiór danych
Zamknięcie strumieni połączenia
Zamknięcie połączenia
" Strumienie połączeń
Dostęp do strumienia zapewniają metody interfejsów
InputConnection i OuptutConnection
" Dostęp na poziomie bajtów
DataInputStream i DataOutputStream zapewniają dostęp
na poziomie typów danych (char, int, String, itd.)
Dostęp także za pomocą statycznych metod klasy Connector
© maf 43
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Tworzenie połączeń
Metody
static Connection open(String url)
static Connection open(String url, int tryb)
static Connection open(String url, int tryb,
boolean timeout)
" Tworzą połączenie i zwracają obiekt implementujący interfejs
dziedziczący po Connection odpowiedni dla obsługiwanego
urządzenia lub protokołu
Parametry
" url  rodzaj połączenia
protokół://nazwa_hosta:parametry
http://www.host.pl
socket://host.pl:12345
comm:0;baudrate=28800;parity=even
file://ścieżka_dostępu
© maf 44
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Tworzenie połączeń (c.d.)
static Connection open(String url, int tryb,
boolean timeout)
Parametry (c.d.)
" url  rodzaj połączenia
" tryb  tryb połączenia
Connector.READ
Connector.WRITE
Connector.READ_WRITE (wartość domyślna)
" timeout  włączenie obsługi przekroczenia limitu czasu odczytu lub
zapisu
czas nie jest specyfikowany
po jego przekroczeniu generowany jest wyjÄ…tek
InterruptedIOException
© maf 45
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Obsługa gniazda
Interfejs SocketConnection
Metody konfiguracji
" void setSocketOption(byte opcja, int wartosc)
" int getSocketOption(byte opcja)
Socket.DELAY - opóznienie zapisu w celu uniknięcia przepełnieniu bufora
(przy wolnym Å‚Ä…czu)
Socket.LINGER - czas aktywności łącza po wywołaniu metody close
(dokończenie wysyłki danych z bufora)
Socket.KEEPALIVE - podtrzymywanie połączenia, gdy dane nie są przesyłane
(dla wartości `" 0)
Socket.RCVBUF  rozmiar bufora odbiorczego w bajtach
Socket.SNDBUF  rozmiar bufora nadawczego w bajtach
© maf 46
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Przykład  wysyłka danych
SocketConnection con;
obiekt połączenia
OutputStream os;
obiekt strumieni bajt.
String url =  socket://host.pl:34567 ;
rzutowanie
try {
con = (SocketConnection) Connector.open(url);
} catch(Exception e) { tutaj kod, brak połączenia }
os = con.openOutputStream(); otwarcie strumienia
String ciag =  GET / HTTP/1.0\n\n ;
utworzenie tablicy bajtów
os.write(ciag.getBytes());
//& c.d.
os.flush();
try {
try {
if (con != null) {
if (os != null) {
con.close();
os.close();
con = null;
os = null;
}
}
} catch(IOException e) { }
} catch(IOException e) { }
© maf 47
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Połączenia HTTP
Interfejs HttpConnection
Metody
" int getResponseCode()
zwraca kod odpowiedzi serwera HTTP na wysłane żądanie
" String getResponseMessage()
zwraca odpowiedz serwera HTTP na wysłane żądanie
" String getHeaderField(String nazwa)
zwraca wartość pola nagłówka HTTP o podanej nazwie
" String getEncoding()
zwraca nazwę kodowania znaków na stronie www (pole content-encoding
nagłówka HTTP)
" String getLength()
zwraca długość pobieranego dokumentu (pole content-length)
" String getType()
zwraca typ MIME pobieranego dokumentu (pole content-type)
© maf 48
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa funkcji sieciowych
" Przykład
HttpConnection con;
obiekt połączenia
String url =  http://www.serwer.pl ;
InputStream is;
obiekt strumieni bajt.
try {
con = (HttpConnection) Connector.open(url);
} catch(Exception e)
{ & tutaj odpowiedni kod& }
spr. kodu odpow. serwera
if (con.getResponseCode() == HttpConnection.HTTP_OK) {
is = con.openInputStream();
byte[] bufor = new byte[128];
bajty mogą przychodzić w
int licznik = 0;
mniejszych porcjach niż 128
while (licznik < 128) {
int n = is.read(bufor, licznik, 128-licznik);
if (n < 0)
break;
licznik += n;
}
is.close(); // zamknięcie strumienia
String odpowiedz = newString(bufor, 0, licznik);
}
con.close(); // zamknięcie połączenia
© maf 49
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Instalacja Midleta
" Aplikacje MIDP
MIDlet Suite
" Pakiet  zestaw midlet ów dostarczanych do użytkownika i
instalowanych z pojedynczego archiwum JAR (ang. Java ARchive)
" Instalowany i usuwany jedynie jako całość (nie można usunąć
pojedynczego midletu należącego do zestawu)
" Tworzony tylko poprzez spakowanie składowych do archiwum JAR
" Uruchamiane w pojedynczej maszynie wirtualnej
" Współdzielą przestrzeń pamięci stałej
Elementy MIDlet Suite
" Application Descriptor  plik JAD
" MIDlet Suite Packaging  plik JAR
Manifest opisujący zawartość
Klasy Java midlet u(ów) i/lub klasy współdzielone przez midlet y
Pliki zasobów używane przez midlet(y)
© maf 50
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Instalacja Midleta
" Dystrybucja MIDletów
JDK + kompilator plik JAR (archiwum ZIP)
" Pliki .class
" Zasoby: ikony, pakiety, inne
" Plik manifestu: manifest.mf
Plik JAD (Java Application Descriptor)
" Plik tekstowy:
Atrybut .mf JAD Opis
W podkatalogu
MIDlet-Name + + nazwa dystrybucji (wyświetlana)
projektu
deployed
MIDlet-Version + + numer wersji w formie x.y.z
MIDlet-Vendor + + producent
Instalacja
MIDlet-n + atrybuty opisujÄ…ce n midlet'ow
" Przeniesienie
obu plików do
Microedition- + wymagana wersja Profilu
urzÄ…dzenia
Profile (np. MIDP-2.0)
USB
Microedition- + Wymagana konfiguracja
IrDA
Configuration
Bluetooth
MIDlet-Jar-URL + wskazuje lokalizacjÄ™ JAR
&
MIDlet-Jar-Size + rozmiar JAR (w bajtach)
© maf 51
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Platformy deweloperskie
" NetBeans
© maf 52
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Platformy deweloperskie
" Eclipse
+ Eclipse Mobile Tools for
Java
© maf 53
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Schemat prostego Midleta
import javax.microedition.midlet.*;
" Przykład
import javax.microedition.lcdui.*;
programu
public class MojMidlet extends MIDlet implements
Klasa główna CommandListener
{
" ekran
// initializacja zmiennej midletu typu Display
private Display wyswietlacz;
" komenda
// initializacja zmiennej dla komendy zakończenia
private Command koniec;
public MojMidlet()
Konstruktor
{
// inicjalizacja komendy DONE - koniec
koniec = new Command( Koniec ,Command.EXIT,1);
// TextBox z tekstem "Hello Midlet World!!"
TextBox textBox = new TextBox("Hello Midlet",
"Hello Midlet World!!", 256, 0);
// dodanie komendy koniec do TextBox
textBox.addCommand(koniec);
}
© maf 54
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Schemat prostego Midleta
/* Utworzenie TextBox u z tekstem Hello Midlet World
* i skojarzenie the exit command and listener.*/
public void startApp()
{
startApp
// pobranie referencji do ekranu ze statycznego
// obiektu reprezentujÄ…cego ekran
wyswietlacz = Display.getDisplay(this);
// ustawienie aktualnego ekranu midletu na textBox
wyswietlacz.setCurrent(textBox);
// dodanie słuchacza w midlecie do textbox
textBox.setCommandListener( (CommandListener) this);
}
/* pauseApp  gdy midlet jest nieaktywny. */
pauseApp
public void pauseApp()
{
...
}
© maf 55
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Schemat prostego Midleta
/* destroyApp  gdy midlet kończy działanie */
destroyApp
public void destroyApp(boolean unconditional)
{
...
}
/* metoda commandAction zdefiniowana zgodnie z
* wymaganiami interfejsu CommandListener 
SÅ‚uchacz
* przechwytuje komendy */
public void commandAction(Command komenda,
Displayable elemEkranu)
{
// jeśli komendą jest koniec
if (komenda == koniec)
{
// usuń aplikację - wywołaj destroyApp(.)
destroyApp(false);
// zawiadom platformę, że midlet zakończył się
notifyDestroyed();
}
}
} // koniec klasy głównej
© maf 56
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika


Wyszukiwarka

Podobne podstrony:
SWeh(full permission)
SWeh(full permission)
SWch(full permission)
SWch(full permission)
SWb(full permission)
SWah(full permission)
SWc(full permission)
SWch(full permission)
SWf(full permission)
SW b(full permission)
SWd(full permission)
SWah(full permission)
SWah(full permission)
wyklada ekosystem ziemi(full permission)
7 Prezentacje(full permission)
10 Konstrukcja blachowa(full permission)
5 Dokumentacja płaska(full permission)
wyklada cykl c n s(full permission)
12 Generator ram(full permission)

więcej podobnych podstron