Mérési útmutató a JAVA Micro Edition méréshez
Szoftverfejlesztés mobil végberendezésekre
Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar Híradástechnikai Tanszék Mobil Kommunikációs Laboratórium
2010. november
1. Bevezetés: néhány szó a mérésről A labor foglalkozás célja a hallgatók megismertetése a Java Micro Edition technológiával egy (vagy több) program írásán keresztül. A feladato(ka)t a hallgatók – egy vagy több fős – mérőcsoportokba osztva oldják meg. A csoportok közötti kommunikáció nem megengedett. Az óra elején a hallgatók beugró dolgozatot írnak, amely a kapott jegyet befolyásolja. A mérőcsoportok legkésőbb az idő lejártakor bemutatják a programjukat a mérésvezetőnek és az általa megadott email címre elküldik a jegyzőkönyvet, amit a programmal párhuzamosan írnak. A mérésvezető engedélyezheti a jegyzőkönyv utólagos beküldését. Programozási feladatról lévén szó, a jegyzőkönyv jelen esetben inkább fejlesztői dokumentációnak tekinthető. A jegyzőkönyvnek mindenképpen tartalmaznia kell az alábbiakat: • 1. oldal: méréssel kapcsolatos adatok: o Dokumentum címe o A mérőcsoport tagjai (név, neptun kód) o A dokumentum készítésének helye és ideje. • 2. oldaltól: o A feladat rövid leírása o Felhasznált technológiák, eszközök, ezek rövid leírása o Megvalósított program funkcionális felépítése A program részletes ismertetése o A mérőcsoport tagjai által írt forráskód, részletesen kommentezve A dokumentumban szereplő forráskódnak fordíthatónak kell lennie. o Minden, a mérési utasításban feltett kérdésre is írja le a jegyzőkönybe a választ! A mérési jegyzőkönyv rossz megjelenési színvonala a kapott osztályzatot negatív irányban befolyásolhatja. A kapott érdemjegy az alábbiak szerint lesz megállapítva: • Beugró • Órai munka • Program működése és megvalósítása • Jegyzőkönyv Ezek közül a legfontosabb a jegyzőkönyv, hiszen ebben van a forráskód is, amit a mérésvezető mérés után fog értékelni. Jegyzőkönyv nélkül a mérés nem értékelhető.
2. Java ME Technológiák A Java programozási technológiák platform független fejlesztési és futtatási környezetet biztosítanak. A nyelv szintaktikája leginkább a C++-ra hasonlít, azonban funkcionalitásában kevesebb alacsony szintű elemet tartalmaz. A Java forráskód lefordítva egy ún. bytecode-ot eredményez, ami Java virtuális gépen futtatható. A Java virtuális gép a hardware operációs rendszere fölött levő réteg, ami a bytecode-ok számára a platformfüggetlenséget biztosítja. Ezen a mérésen a továbbiakban a Java Micro Editionel vagyis a Java ME-vel (korábban J2ME) foglalkozunk, amely a dokumentum írásakor a 3.0-ás verziószámnál tart. Fejlesztőeszközként korábban a J2ME Wireless Toolkit, a dokumentum írásakor a Java ME SDK3 használata ajánlott, amibe a Wireless Toolkit integrálva lett. A Java ME platformot alapvetően olyan beágyazott eszközökre való fejlesztésre találták ki, mint a mobil telefonok, PDA-k, illetve az autóba szerelhető telematikus eszközök. A J2SE és J2EE-hez hasonlóan a Java ME is a Java Community Process™ által szabványosított API-val rendelkezik A Java ME platform biztosítja a Java technológia előnyeit e fenti eszközökön – rugalmas felhasználói interfész, robosztus biztonsági modell, hálózati protokollok széles skálája, illetve hálózati és off-line alkalmazások támogatása.
3. Java architektúrák A Java ME architektúrában különböző konfigurációkat, profilokat és opcionális csomagokat definiáltak. Ezen elemekből épül fel a teljes Java futtatókörnyezet (JRE). Minden egyes kombináció memóriára, processzor kapacitásra, illetve I/O műveletekre optimalizált – attól függően, hogy az adott eszköz melyik hardver-kategóriába tartozik. 3.1. Konfigurációk A konfigurációkban egy virtuális gépet, illetve minimális könyvtárhalmazt definiáltak. Ezek biztosítják az egy kategóriába tatozó eszközök számára az olyan alapfunkcionalitásokat, mint a hálózati kapcsolat és memóriakezelés. Jelenleg két Java ME konfiguráció létezik: a CLDC (Connected Limited Device Configuration) illetve a CDC (Connected Device Configuration).
2. ábra. A Java ME rétegei
A 2-es, archív (2002-ből) ábrán a Java Micro Edition különböző komponenseinek viszonya látható egy készüléken belül. 3.1.1. CDC (Connected Device Configuration) A CDC fejlesztését J2SE kompatibilitás és a korlátozott erőforrással rendelkező eszközök támogatása ihlette. A J2SE kompatibilitás azért fontos, hogy a fejlesztők a már meglévő tudással tudjanak új eszközökre fejleszteni (a mobil eszközön megvalósított forrás könnyen portolható legyen más eszközökre, ez azonban másodlagos szempont). A korlátozott erőforrású végberendezések támogatása pedig azért fontos, hogy ezeken az eszközökön is lehessen sokféle funkcionalitást biztosító Java programot fejleszteni. A CDC támogatja a teljes Java Virtual Machine (JVM) specifikációt, beleértve a lebegőpontos számítást a core könyvtárak szolgáltatásait (pl.: szálak támogatása, biztonság, stb.). Osztályok szintjén a CDC a J2SE könyvtárát használja, az osztályok implementációja azonban az eszköz korlátozott erőforrásaira (kevesebb memóriára) lett optimalizálva, amihez természetesen különböző módosítások kellettek. Összességében egy jól használható Java környezet ez, amihez mindössze 2MB RAM és 2MB ROM szükséges. 3.1.2. CLDC (Connected Limited Device Configuration) A CLDC a mobiltelefonok korlátolt memóriakapacitását figyelembe véve lett kifejlesztve. Ehhez a CLDC a virtuális gépet és könyvtárakat is tartalmaz, hogy még hatékonyabb legyen, az első verzióból bizonyos nagyobb erőforrás igényű jellemzők kimaradtak. A korai megvalósítások 128-256KB memóriával is beérték. Ez a jó tulajdonságuk a későbbi mobiltelefonok nagyságrendekkel több memóriája miatt gyakorlatilag szükségtelenné vált.
4. Connected Limited Device Configuration 4.1. Követelmények 4.1.1. Minimum követelmények 4.1.1.1 Hardware követelmények Legalább 160 kByte nem-felejtő, a JVM számára elérhető memória Minimum 32 kByte felejtő a JVM számára futás alatt elérhető memória (pl. heap) 4.1.2.
Szoftver követelmények Az eszközön fut operációs rendszer, mely kezeli a hardvert Az operációs rendszer biztosít legalább egy ütemezhető egységet a JVM számára Az operációs rendszernek nem szükséges támogatnia az elkülönített névtereket vagy folyamatokat és a real-time ütemezést.
4.1.3. Java ME követelmények Egy JAVA ME konfiguráció a Java technológia minimum-halmaza. Minden konfigurációban definiált tulajdonság általánosan alkalmazható kell, hogy legyen az eszközök széles skáláján. A további tulajdonságokat a profilokban definiálják. Mivel a konfiguráció célja a hordozhatóság és az interoperabilitás, a konfiguráció nem definiálhat opcionális tulajdonságokat. A JAVA ME konfiguráció értelemszerűen a Java technológia könyvtárainak és tulajdonságainak egy részhalmaza. A teljes specifikáció helyett a CLDC azt definiálja, hogy miben tér el a J2SE-től. 4.1.4.
A specifikáció által lefedett területek Java nyelv és virtuális gép A fő java könyvtárak (java.lang.*, java.util.*) I/O (java.io.*) Biztonság Hálózat
4.2. CLDC architektúra Profilok
Konfiguráció
Könyvtárak JVM
Operációs rendszer
1. ábra. Magas szintű architektúra 4.2.1. Java alkalmazás A CLDC nem céloz meg semmilyen specifikus eszköz kategóriát. Sok eszköznek fejlett grafikus interfésze van, mások csak karakteres kijelzésre alkalmasak, megint más eszközöknek egyáltalán nincs látható felhasználói interfészük. Ezért a CLDC nagyon egyszerű. Java alkalmazás akkor indítható (ugyanúgy, mint J2SE esetében), ha van main függvény: public static void main(String[] args)
JAVA ME profilok – pl. MIDP – definiálhatnak alternatív alkalmazás-modellt, melyek 4.3. JVM eltérése J2SE-től A következő tulajdonságokat teljes mértékben eltávolítottak a CLDC virtuális gépből: Felhasználó által definiált osztálybetöltők (JVMS §5.3.2) Szálcsoportok és démonszálak (JVMS §2.19, §8.12) Példányok véglegesítése (JVMS §2.17.7) Aszinkron kivételek (JVMS §2.16.1)
5. Connected Device Configuration Mivel egy JAVA ME alkalmazás mind konfigurációt, mind valamilyen profilt igényel, a CDC specifikációjakor a profilokat helyezték előtérbe. Vagyis minden CDC profil implementáció CDC osztálykönyvtár (class library) implementációt és Java virtuális gépet tartalmaz. Az opcionális csomagokat külön lehet letölteni attól függően, hogy milyen speciális profilt használunk. 5.1. CDC Class Library A CDC osztálykönyvtárak a J2SE-ből származnak, de a mobil eszközök korlátozásait figyelembe veszik. A legtöbb CDC API megegyezik a neki megfelelő J2SE API-val, a környezetre alkalmazott implementáció a mobil eszköz memória és processzorkapacitására lett hangolva. Így a J2SE-re írt alkalmazások könnyen portolhatók CDC környezetre. 5.2. CDC Profilok 5.2.1. Foundation Profile A legalapvetőbb CDC profil. Tartalmazza a legalapvetőbb alkalmazás-támogató osztályokat, mint pl. hálózat és I/O. Nem tartalmaz grafikus, illetve GUI szolgáltatásokat. 5.2.2. Personal Basis Profile Pehelysúlyú komponenseket, illetve Xlet alkalmazásokat támogat. A Personal Basis Profile tartalmazza a teljes Foundation Profile API-t. 5.2.3. Personal Profile Teljes AWT és korlátozott bean-támogatás. Ezenkívül a PP tartalmazza a teljes PBP API-t. 5.3. Opcionális csomagok RMI JDBC
6. Mobile Information Device Profile A Mobile Information Device Profile (MIDP) a CLDC-vel együtt a Java™ mobil eszközökre való futtatókörnyezete (JRE). CLDC és MIDP együtt olyan dinamikus és biztonságos platformot definiál, mely alkalmas magas szintű grafikus, hálózatot kezelő alkalmazás mobil eszközre történő fejlesztésére. A MIDP tartalmazza azokat az alapvető funkcionalitásokat, melyeket a szabványos Java környezetben futó mobil alkalmazások igényelnek. MIDP segítségével olyan alkalmazások írhatók, melyek a korszerű mobil eszközökre optimalizáltak. A MIDP lehetővé teszi hálózati alkalmazások futtatását is. MIDP alkalmazás letöltéséhez a felhasználó kiválasztja a webszerveren a letöltendő alkalmazást. Ezután a mobil eszköz letölti az alkalmazást, verifikálja és lefordítja bájtkódra és elindítja. A grafikus felhasználói interfész a kisméretű kijelzőre, illetve a bemenetet megvalósító és más natív eljárásokra méretezett. A MIDP a telefon billentyűzetének és egyéb gombok teljes kihasználásával biztosítja az intuitív navigációt és adatbevitelt. A MIDP alkalmazások kapcsolat nélkül is képesek futni, a mobil eszköz biztonságosan tároljon és helyben kezeli az adatokat. 6.1. MIDP architektúra MIDP alkalmazások
OEM specifikus alkalmazások
Natív alkalmazások
OEM specifikus osztályok
MIDP CLDC Natív rendszerszoftver MID
2. ábra. A Java ME architektúra 6.1.1. A mobil eszközzel szemben támasztott hardver követelmények Kijelző: 96x54, színmélység 1 bit, közel négyzet alakú pixel Legalább egy a következő felhasználói input eszközökből: egykezes billentyűzet, kétkezes billentyűzet, érintőképernyő 256 kB nem felejtő memória a MIDP-nek (+ mai a CLDC-nek kell), ezenkívül 8 kB memória az alkalmazásoknak 128 kB felejtő memória (heap) Hálózat: kétirányú rádiós csatorna, korlátozott sávszélesség Hang: hangok lejátszására alkalmas HW eszköz vagy valamilye SW algoritmus
6.1.2. A mobil eszközzel szemben támasztott szoftver követelmények A fenti hardver tulajdonságokkal rendelkező eszközök még mindig nagyon sokféle szoftverfuttatási lehetőséggel rendelkezhetnek. a MID környezet eszközeinek szoftverlehetőségei nagyon eltérhetnek egymástól. Pl. néhány mobil eszköz teljes operációs rendszerrel, multiprocesszing támogatással és hierarchikus fájlstruktúrával rendelkezik, míg más eszközök kis, szálalapú operációs rendszerrel rendelkeznek, fájlrendszer nélkül A szoftverben is követelményeket kell tehát támasztanunk az eszközzel szemben. Ezek a következők: minimális kernel, amely kezeli a hardvert (megszakítások, kivételek, minimális ütemezés.). A kernel képes legyen futtatni legalább egy virtuális gépet. biztosítsa a nem felejtő memóriából a való olvasás, illetve az oda történő írás lehetőségét olvasás és írási hozzáférés az eszköz rádiós hálózati kapcsolatán keresztül időkezelés minimális bitmap megjelenítése a grafikus kijelzőn legalább 1 input kezelése az előző fejezetben említettek közül az alkalmazás életciklusának kezelése A MIDP környezetben futó Java alkalmazásokat MIDleteknek nevezzük. Ha alkalmazás töltünk le a webről, akkor nem a MIDletet töltjük le és indítjuk, hanem egy ún. MIDlet suit-ot, ami egy vagy több MIDlet-et tartalmaz összecsomagolva. A MIDlet suite többnyire több, hasonló funkciót ellátó vagy együttműködő MIDlet összessége. Az egy suite-ban lévő MIDletek osztozhatnak az erőforrásokon (adat, grafika) ugyanabban a suite-ban lévő MIDletek hozzáférhetnek egy suite-beli MIDlet információihoz, míg más suite-ban lévő MIDletek erőforrásaihoz nem. 6.2. A MIDlet életciklus modellje MIDlet pédányosítása
Paused
Active
Destroyed
Garbage Colector
3. ábra. A MIDlet életciklusa
7. Feladatok 7.1. Fejlesztőkörnyezet létrehozása
meglétének
ellenőrzése,
első
forráskód
1. Ellenőrizze, hogy a számítógépen megtalálható-e a Java ME Wireless Toolkit legalább 2.5-ös verziója. Indítsa el a programot. Ekkor a 2.5.2_01-es verzió megjelenése az alábbi ábrán látható.
2. Hozzon létre egy új projektet! Az API kiválasztásánál válassza a legtöbb szolgáltatást nyújtó MID Profile-t (2.1) illetve a CLDC 1.1-es konfigurációját. Ekkor a projekt a C:\Document and Settings\[Felhasználónév]\j2mewtk\2.5.2 könyvtárban létrejön. 3. A létrejövő könyvtár forrás könyvtárában hozzon létre egy fájlt, aminek neve a mérőcsoport egyik tagjának neptun kódja, kiterjesztése: java. (Pl.: nepkod.java) 4. Másolja be a fájlba az alábbi kódot! import import import import
java.io.*; javax.microedition.io.*; javax.microedition.lcdui.*; javax.microedition.midlet.*;
public class neptun extends MIDlet implements CommandListener { public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void startApp() {} public void commandAction(Command c, Displayable s) {} }
5. Ezzel meg is van az első leforduló Java ME forráskódunk. A fejlesztő környezetben nyomja meg a build gombot! Ha a forrás nem fordul le, akkor próbálja megoldani a kapott hibaüzenet alapján a problémát! 6. Próbálja meg a forrás egyes sorai kikommentezni és írja le a mit tapasztal! Melyek a forráskód azon részei, amelyekre jelenleg nincs szükség? Miért? 7. Melyek azok a részek, amelyekre szükség van? Miért? 8. Hol van a bytekód? 7.2. Futtatható program készítése Az első feladatban egy fordítható forráskódot hoztunk létre, ami lefordul byte kóddá, azonban még működő programot nem sikerült csinálnunk. Első programunk egy olyan kis alkalmazás lesz, ami bekéri a felhasználó nevét, majd köszönti az egyént a megadott névvel. Ehhez a fájlunkat az alábbiak szerint módosítjuk: import import import import
java.io.*; javax.microedition.io.*; javax.microedition.lcdui.*; javax.microedition.midlet.*;
public class MidletClass extends MIDlet implements CommandListener { private Form mMainForm; private TextField Szovegmezo; private Command mExitCommand; public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void startApp() { mMainForm = new Form("Greetings"); Szovegmezo=new TextField("Adja meg a nevét!","",20, TextField.DECIMAL); mMainForm.append(Szovegmezo); mMainForm.setCommandListener(this); Display.getDisplay(this).setCurrent(mMainForm); mExitCommand= new Command("Exit", Command.OK, 1); mMainForm.addCommand(mExitCommand); } public void commandAction(Command c, Displayable s) { if(c==mExitCommand){notifyDestroyed();} } }
1. Fordítsa le és indítsa el a programot! Nézze meg, hogy mit csinál! 2. Értelmezze és kommentezze a forrást! A változásokat vigye fel a jegyzőkönyvbe! 3. Írjon hozzá, illetve módosítsa úgy a forráskódot, hogy a program az alábbiakat csinálja: a. Ahol most az Exit gomb ott legyen egy Ok feliratú gomb. b. Az Exit gomb felirata legyen Kilépés és kerüljön át a túloldalra. c. Az Ok gomb megnyomására jelenjen meg az alábbi felirat: i. Hello, [beírt név]! Ahol a [beírt név] természetesen a felhasználó által a textfield-be felvitt string-et jelöli!
4. A feladat megoldásához a Java ME hivatalos dokumentációja használható. 5. Illessze be a működő, kommentezett forráskódot a jegyzőkönybe! 7.3. Kiegészítő feladat A korábbiakban megismert programozási technikával készítsen számológépet! A számológépnek az alábbi funkcióknak kell megfelelnie: • Két bemeneti operandusa kell, hogy legyen, amit egy képernyőn kell bekérni a felhasználótól. • A négy alapműveletet kell tudnia elvégeznie a két bemeneten. • 0-val való osztáskor a programnak működőképesnek kell maradnia, azonban figyelmeztetnie kell a felhasználót a hibára! • Az eredmény megjelenhet az adatokat bekérő képernyőn vagy egy másik képernyőn is. • Lehetőséget kell biztosítani a felhasználónak a programból való kilépésre a telefon kikapcsolása nélkül. Ügyeljen az igényes megvalósításra! A kommentezett, futtatásra alkalmas forráskódot illessze be a jegyzőkönybe! 7.4. Általános segítség a feladat megoldásához: A program egy képernyő-felületet a Screen osztály leszármazottaiból hozhat létre, attól függően, hogy milyen felépítésű GUI-ra van szüksége. A feladat megoldásához a Form osztály specifikációját érdemes tanulmányozni. Az egyes Screenekhez az append metódussal adhatunk hozzá grafikus komponenseket. Egy képernyő-felülethez parancsot a Screen osztály addCommand metódusával adhatunk. A Command osztály példányosításakor megmondható a parancs típusa. Vannak előredefiniált parancsok, pl. EXIT, OK, CANCEL de tetszőleges parancsot is létrehozhatunk (SCREEN). A parancsok aktivizálásáról úgy értesülhetünk, hogy a Screen-be beregisztrálunk egy CommandListener-t, melyet minden parancsról értesít a Screen. A MIDletből kilépni a notifyDestroyed metódus meghívásával lehet (ld. példaprogram). 7.5. A méréshez szükséges programok: Java 2 Platform, Standard Edition (J2SE) 1.4.2 Java ME Wireless Toolkit 2.5.2.
8. Ellenőrző kérdések 1. 2. 3. 4. 5.
Hogyan valósítja meg egy Java rendszer a platformfüggetlenséget? Mi a CDC, mi a CLDC és mi a különbség a kettő között? Írja le a CDC profiljait! Rajzolja le a MIDP architektúrát! Sorolja fel a MIDP + CDC-t futtató mobil eszközzel szemben támasztott követelményeket. (HW + SW) 6. Írja le a MIDlet életciklus-modelljét.
9. Hivatkozások [1] [2]
Erdei Márk, Sója Katalin: J2ME mérés(2004).
10. Függelék 10.1. Profilok által biztosított csomagok A következő táblázat összefoglalja az egyes profilok által támogatott Java csomagokat. Package J2SE 1.3.1 FP 1.0 PBP 1.0 PP 1.0 java.applet
9
–
–
P
java.awt.*
9
–
P
P
java.beans.*
9
–
P
P
java.io
9
9
9
9
java.lang.*
9
9
9
9
java.math
9
P
P
9
java.net
9
9
9
9
java.rmi.*
9
OP
OP
OP
java.security.*
9
9
9
9
java.sql
9
OP
OP
OP
java.text
9
9
9
9
java.util.*
9
9
9
9
javax.accessibility
9
–
–
–
javax.naming.*
9
–
–
–
javax.rmi.*
9
–
–
–
javax.sound.*
9
–
–
–
javax.swing.*
9
–
–
–
javax.transaction
9
–
–
–
org.omg.*
9
–
–
–
javax.microedition.io.*
–
9
9
9
javax.microedition.xlet.*
–
–
9
9
9 P – OP
teljes támogatás, részleges támogatás nincs támogatás opcionális csomagban
10.2. A MIDP és CLDC csomagjai java.lang Interfészek Runnable Osztályok
Boolean, Byte, Character, Class, Integer, Long, Math, Object, Runtime, Short, String, StringBuffer, System, Thread, Throwable
Kivételek
ArithmeticException, ArrayIndexOutOfBoundsException, ArrayStoreException, ClassCastException, ClassNotFoundException, Exception, IllegalAccessException, IllegalArgumentException, IllegalMonitorStateException, IllegalStateException, IllegalThreadStateException, IndexOutOfBoundsException, InstantiationException, InterruptedException, NegativeArraySizeException, NullPointerException, NumberFormatException, RuntimeException, SecurityException, StringIndexOutOfBoundsException
OutOfMemoryError, VirtualMachineError Hibák java.util Interfészek Enumeration
Osztályok
Calendar, Date, Hashtable, Random, Stack, Timer, TimerTask, TimeZone, Vector
Kivételek EmptyStackException, NoSuchElementException Hibák javax.microedition.io
Interfészek
Osztályok Kivételek Hibák
CommConnection, Connection, ContentConnection, Datagram, DatagramConnection, HttpConnection, HttpsConnection, InputConnection, OutputConnection, SecureConnection, SecurityInfo, ServerSocketConnection, SocketConnection, StreamConnection, StreamConnectionNotifier, UDPDatagramConnection Connector, PushRegistry ConnectionNotFoundException
javax.microedition.lcdui Choice, CommandListener, ItemCommandListener,
Interfészek ItemStateListener Osztályok Kivételek Hibák
Alert, AlertType, Canvas, ChoiceGroup, Command, CustomItem, DateField, Display, Displayable, Font, Form, Gauge, Graphics, Image, ImageItem, Item, List, Screen, Spacer, StringItem, TextBox, TextField, Ticker
javax.microedition.lcdui.game Interfészek Osztályok GameCanvas, Layer, LayerManager, Sprite, TiledLayer Kivételek Hibák javax.microedition.media Interfészek Control, Controllable, Player, PlayerListener Osztályok Manager Kivételek MediaException Hibák javax.microedition.media.control Interfészek ToneControl, VolumeControl Osztályok Kivételek Hibák javax.microedition.midlet Interfészek Osztályok MIDlet Kivételek MIDletStateChangeException Hibák javax.microedition.pki Interfészek Certificate Osztályok Kivételek CertificateException Hibák javax.microedition.rms RecordComparator, RecordEnumeration, RecordFilter,
Interfészek RecordListener Osztályok RecordStore Kivételek Hibák
InvalidRecordIDException, RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException, RecordStoreNotOpenException