Utilizarea Limbajului Java In Telefonia Mobila
CUPRINS
CAPITOLUL I : LIMBAJUL DE PROGRAMARE JAVA……………………….4
Introducere în lumea Java……………………………………………………..4
Caracteristicile limbajului Java………………………………………………6
CAPITOLUL II : INTRODUCERE ÎN J2ME…………………………………………9
Introducere în java 2 platform……………………………………………….9
Descriere J2ME………………………………………………………………….11
Organizarea J2ME……………………………………………………………..12
Configurații……………………………………………………………….13
Profile……………………………………………………………………….16
Pachete opționale……………………………………………………….18
Aplicații…………………………………………………………………….18
CAPITOLUL III : MIDLET-URI…………………………………………………………19
Suite de midlet-uri……………………………………………………………..19
Modul de lucru…………………………………………………………………..20
Structura unui midlet………………………………………………………….20
Crearea unui midlet simplu (1) ……………………………………………21
OTA – Over the Air …………………………………………………………..26
Ciclul de viață al unui midlet……………………………………………….27
Interfața grafică………………………………………………………………….28
3.7.1.1 Clasa Displayable………………………………………………………..28
3.7.1.2 Clasa Screen……………………………………………………………….28
3.7.1.3 Clasa Canvas………………………………………………………………30
3.8 Imagini………………………………………………………………………………31
3. 9 Asigurarea persistenței datelor………………………………………………32
3.9.1 Tabele de persistență………………………………………………………32
3.9.2 Gestiunea tabelelor………………………………………………………..32
3.9.3 Gestiunea articolelor………………………………………………………33
3.9.4 Scrierea și citirea tipurilor primitive…………………………………34
3.9.5 Enumerarea articolelor unei tabele de persistență………………34
3.10 Crearea unei suite de midlet-uri (2)……………………………………….35
CAPITOLUL IV : PROGRAMAREA ÎN REȚEA FOLOSIND MIDP……..36
Generic Connection Framework……………………………………………..36
Tipuri de conexiuni……………………………………………………………….38
Crearea unei conexiuni…………………………………………………………..38
Wireless Messaging API (WMA)……………………………………………42
4.4.1 Caracteristici WMA…………………………………………………………42
4.4.2 Crearea unei conexiuni……………………………………………………..43
4.4.3 Trimiterea unui mesaj text………………………………………………..43
4.4.4 Trimiterea unui mesaj binar………………………………………………44
4.4.5 Recepționarea mesajelor………………………………………………….44
4.4.6 Procesarea masajelor……………………………………………………….45
4.4.7 Segmentarea și reasamblarea……………………………………………45
4.4.8 Bluetooth……………………………………………………………………….46
4.4.9 JXTA…………………………………………………………………………….47
4.4.10 Push Regisory…………………………………………………………………47
4.4.11 Înregistrarea……………………………………………………………………48
CAPITOLUL V : Crearea de aplicații multimedia folosind J2Me………………50
5.1 Mobile Media API………………………………………………………………….50
5.2 Crearea unui Player…………………………………………………………………52
5.2.1 Redarea audio…………………………………………………………………..52
5.2.2 Redarea video…………………………………………………………………..53
CAPITOLUL VI : XML ÎN J2ME…………………………………………………………54
Tipuri de parsere…………………………………………………………………..55
JAXP…………………………………………………………………………………..55
Crearea unui parser……………………………………………………………….55
Crearea unui DocumentHandler………………………………………………56
CONCLUZII……………………………………………………………………………………….57
Capitolul I
Limbajul de programare Java
1.1 Introducere în lumea Java
În 1990, unei echipe de programatori condusă de James Gosling i-a fost încredințat un proiect destinat controlului aparaturii electronice. Gosling și echipa sa lucrând la compania Sun Microsystems au început proiectarea sistemului utilizând C++, unul dintre limbajele cele mai răspândite, datorită naturii sale de limbaj orientat pe obiecte.
Din păcate Gosling a realizat destul de repede că acest limbaj nu era potrivit pentru aplicația propusă. Principalele probleme de care aceștia s-au lovit au fost aspectele complicate ale limbajului C++ în lucrul cu clase și modul de gestionare a memoriei. Decizia lui Gosling s-a materializat prin crearea unui nou limbaj, simplificat care să evite problemele întâlnite în cadrul libajului C++.
Pe de altă parte Gosling a dorit simplificarea limbajului C++, păstrând elementele
sintactice de bază, dar și particularitățile de limbaj orientat pe obiecte. Astfel, atunci când
acesta a conturat noul limbaj a folosit C++ ca model, modificând toate elementele
limbajului C++ care nu au putut conduce la bune rezultate în cadrul proiectului său,
destinat controlului aparaturii electronice. Numele limbajului creat de Gosling în cadrul
proiectului său a fost Oak – Stejar. (Ca o anecdotă se spune că numele Oak i-a venit lui
Gosling atunci când, gândindu-se la proiect, privea în gol un stejar care se vedea de la
fereastra biroului său.)
Oak a fost folosit prima dată în așa-numitul proiect Green, proiect în care se încerca
controlul tuturor sistemelor electronice utilizate într-o casă. Acest sistem de control
permitea utilizatorului să comande o listă de dispozitive, cum ar fi televizoarele, lumina,
video recorder-ul, telefonul, toate prin intermediul unui minicomputer numit *7 (Star
Seven). Sistemul *7 folosea un ecran touch-sensitive care oferea utilizatorului posibilitatea de a selecta și controla dispozitivele incluse în cadrul aplicației.
Observație:
Ecranul proiectului *7 includea o serie de figuri animate, printre care și Duke (acum considerat ca mascota programului Java ) .Pe site-ul Sun Microsystems se întâlnesc o mulțime de Duke, acesta fiind
și personajul principal în multe applet-uri Java, de pe server-ul companiei Sun.
Următorul pas al limbajului Oak a fost un proiect Video-On-Demand (VOD), în care
limbajul a fost folosit ca bază pentru soft-ul care controla un sistem de televiziune
interactiv. Chiar dacă nici *7 nici proiectul VOD nu au condus la forma actuală a
limbajului Java, ele au oferit limbajului Oak o șansă să se dezvolte și să se maturizeze.
Șansa limbajului Java s-ar putea datora tocmai faptului că acesta nu a fost dezvoltat în
laboratoarele unei universități sau companii orientată excusiv pe programare, ci într-un
mediu în care inginerii electroniști, automatiști erau dominanți. Pentru a explica această
idee trebuie să remarcăm faptul că dacă un programator descoperă o problemă de
programare acesta se va orienta spre o altă metodă sau artificiu care să soluționeze
problema. Un inginer nu poate să își permită ca în cazul unui bug al programului să
lanseze o altă variantă, cu indicativ superior , variantă care să explice de ce toaster-ul
controlat de prima variantă s-a ars!!!!! În aceste condiții soluția acestuia este să elimine
acele elemente generatoare de erori, prin simplificare și robustețe a programelor.
Pe de altă parte, numeroasele variante constructive de aparatură electronică, trebuiau
controlate utilizând un pachet soft cu o portabilitate deosebită, care să poată rula în
aceleași condiții pe toată diversitatea de microchip-uri implicate în aparatura electronică
casnică.
Între timp Sun a descoperit că numele "Oak" a fost deja folosit de un alt produs soft, ceea ce a condus la schimbarea numelui in Java.(Tot ca o anectodă se pare că numele Java nu a implicat un efort intelectual prea mare din partea celor care l-au ales, acest nume fiind primul care inclus în baza de căutare nu era rezervat).
Cel mai important aspect al limbajului , Java este că acesta este o platforma neutra, ceea ce înseamna că programele dezvoltate sub acest limbaj pot rula pe orice calculator, fara nici o schimbare. Aceasta independență de platformă s-a datorat formatului special pe care îl au programele Java compilate. Acest format numit byte-code, poate fi citit si executat pe orice computer care dispune de interpretorul Java. Desigur că interpretorul Java trebuie scris special pentru sistemul sub care rulează.
În 1993, după ce World Wide Web-ul a transformat Internet-ul bazat pe fișiere text, într-un mediu bogat în grafică, echipa Java a realizat că limbajul lor este perfect pentru
programarea în Web. Ei au pus la punct conceptul de Web applets, care sunt de fapt mici
programe ce pot fi incluse în paginile Web , mergând chiar mai departe la creearea unui
browser Web în anul 1994 numit inițial WebRunner, redenumit apoi HotJava .
În a doua jumatate a anului 1995, Sun Microsystems a lansat în mod oficial limbajul Java. Acest "nou" limbaj a fost rapid îmbrațișat ca o puternică unealtă în dezvoltarea aplicațiilor Internet. Netscape Communications, cel care a lansat popularul Netscape Navigator Web browser, a adăugat suportul Java începând cu varianta Netscape Navigator 2.0. Alți developeri de soft Internet au urmat cu repeziciune, printre aceștia numărându-se fără îndoiala și Microsoft, care a oferit suportul java începând cu varianta Internet Explorer 3.
Dupa mai mult de 5 ani de căutari , Java și-a găsit în sfârșit locul.
1.2 Caracteristicile limbajului Java
Oricine își pune întrebarea "De ce Java este considerat un instrument atât de puternic
pentru dezvoltarea aplicațiilor Internet?". Așa cum s-a arătat anterior Java este o versiune
simplificată a limbajului C++. Oricine a încercat să învețe C++ s-a lovit de faptul că așa
zisa simplificare a limbajului C a condus la apariția unor dificultăți chiar și pentru
programatorii profesioniști ai limbajului C.
Abstractizarea in limbaj de programare poartă denumirea de obiect, iar funcțiile fiecărui obiect se numesc metode.
Printre limbajele orientate pe obiecte se numără Pascal, C++, Visual Basic etc. Caracteristica ce deosebește Java din acest punct de vedere de aceste limbaje este că totul (sau aproape totul) este un obiect, pâna și programul in sine!
Potrivit lui Sun Microsystems, Java este "simplu, limbaj orientait C++ ca model, modificând toate elementele
limbajului C++ care nu au putut conduce la bune rezultate în cadrul proiectului său,
destinat controlului aparaturii electronice. Numele limbajului creat de Gosling în cadrul
proiectului său a fost Oak – Stejar. (Ca o anecdotă se spune că numele Oak i-a venit lui
Gosling atunci când, gândindu-se la proiect, privea în gol un stejar care se vedea de la
fereastra biroului său.)
Oak a fost folosit prima dată în așa-numitul proiect Green, proiect în care se încerca
controlul tuturor sistemelor electronice utilizate într-o casă. Acest sistem de control
permitea utilizatorului să comande o listă de dispozitive, cum ar fi televizoarele, lumina,
video recorder-ul, telefonul, toate prin intermediul unui minicomputer numit *7 (Star
Seven). Sistemul *7 folosea un ecran touch-sensitive care oferea utilizatorului posibilitatea de a selecta și controla dispozitivele incluse în cadrul aplicației.
Observație:
Ecranul proiectului *7 includea o serie de figuri animate, printre care și Duke (acum considerat ca mascota programului Java ) .Pe site-ul Sun Microsystems se întâlnesc o mulțime de Duke, acesta fiind
și personajul principal în multe applet-uri Java, de pe server-ul companiei Sun.
Următorul pas al limbajului Oak a fost un proiect Video-On-Demand (VOD), în care
limbajul a fost folosit ca bază pentru soft-ul care controla un sistem de televiziune
interactiv. Chiar dacă nici *7 nici proiectul VOD nu au condus la forma actuală a
limbajului Java, ele au oferit limbajului Oak o șansă să se dezvolte și să se maturizeze.
Șansa limbajului Java s-ar putea datora tocmai faptului că acesta nu a fost dezvoltat în
laboratoarele unei universități sau companii orientată excusiv pe programare, ci într-un
mediu în care inginerii electroniști, automatiști erau dominanți. Pentru a explica această
idee trebuie să remarcăm faptul că dacă un programator descoperă o problemă de
programare acesta se va orienta spre o altă metodă sau artificiu care să soluționeze
problema. Un inginer nu poate să își permită ca în cazul unui bug al programului să
lanseze o altă variantă, cu indicativ superior , variantă care să explice de ce toaster-ul
controlat de prima variantă s-a ars!!!!! În aceste condiții soluția acestuia este să elimine
acele elemente generatoare de erori, prin simplificare și robustețe a programelor.
Pe de altă parte, numeroasele variante constructive de aparatură electronică, trebuiau
controlate utilizând un pachet soft cu o portabilitate deosebită, care să poată rula în
aceleași condiții pe toată diversitatea de microchip-uri implicate în aparatura electronică
casnică.
Între timp Sun a descoperit că numele "Oak" a fost deja folosit de un alt produs soft, ceea ce a condus la schimbarea numelui in Java.(Tot ca o anectodă se pare că numele Java nu a implicat un efort intelectual prea mare din partea celor care l-au ales, acest nume fiind primul care inclus în baza de căutare nu era rezervat).
Cel mai important aspect al limbajului , Java este că acesta este o platforma neutra, ceea ce înseamna că programele dezvoltate sub acest limbaj pot rula pe orice calculator, fara nici o schimbare. Aceasta independență de platformă s-a datorat formatului special pe care îl au programele Java compilate. Acest format numit byte-code, poate fi citit si executat pe orice computer care dispune de interpretorul Java. Desigur că interpretorul Java trebuie scris special pentru sistemul sub care rulează.
În 1993, după ce World Wide Web-ul a transformat Internet-ul bazat pe fișiere text, într-un mediu bogat în grafică, echipa Java a realizat că limbajul lor este perfect pentru
programarea în Web. Ei au pus la punct conceptul de Web applets, care sunt de fapt mici
programe ce pot fi incluse în paginile Web , mergând chiar mai departe la creearea unui
browser Web în anul 1994 numit inițial WebRunner, redenumit apoi HotJava .
În a doua jumatate a anului 1995, Sun Microsystems a lansat în mod oficial limbajul Java. Acest "nou" limbaj a fost rapid îmbrațișat ca o puternică unealtă în dezvoltarea aplicațiilor Internet. Netscape Communications, cel care a lansat popularul Netscape Navigator Web browser, a adăugat suportul Java începând cu varianta Netscape Navigator 2.0. Alți developeri de soft Internet au urmat cu repeziciune, printre aceștia numărându-se fără îndoiala și Microsoft, care a oferit suportul java începând cu varianta Internet Explorer 3.
Dupa mai mult de 5 ani de căutari , Java și-a găsit în sfârșit locul.
1.2 Caracteristicile limbajului Java
Oricine își pune întrebarea "De ce Java este considerat un instrument atât de puternic
pentru dezvoltarea aplicațiilor Internet?". Așa cum s-a arătat anterior Java este o versiune
simplificată a limbajului C++. Oricine a încercat să învețe C++ s-a lovit de faptul că așa
zisa simplificare a limbajului C a condus la apariția unor dificultăți chiar și pentru
programatorii profesioniști ai limbajului C.
Abstractizarea in limbaj de programare poartă denumirea de obiect, iar funcțiile fiecărui obiect se numesc metode.
Printre limbajele orientate pe obiecte se numără Pascal, C++, Visual Basic etc. Caracteristica ce deosebește Java din acest punct de vedere de aceste limbaje este că totul (sau aproape totul) este un obiect, pâna și programul in sine!
Potrivit lui Sun Microsystems, Java este "simplu, limbaj orientat pe obiect (object-oriented language ), de tip static, compilator, neutru arhitectural, cu execuție pseudo-paralelă, curat din punct de vedere al fișierelor utilizate, robust, sigur, extensibil." Chiar dacă această descriere se vrea atotcuprinzătoare, nu ajută prea mult în clarificarea locului acestui limbaj. În continuare toți termenii enumerați, vor fi explicați pe larg, pentru a lămuri avantajele pe care le oferă Java:
Simplitate >
-Proiectanții limbajului Java au eliminat în mod deliberat multe din facilitățile ce nu au fost necesare în cadrul altor limbaje de programare de nivel înalt. Spre exemplu, Java, nu permite utilizarea pointerilor matematici, structuri implicite sau reuniuni, operatori de overloading, templates, fișiere de tip header sau succesiuni multiple.
Limbaj orientat pe obiect >
-Ca și C++, Java utilizează clase pentru a organiza codul în module logice. În timpul rulării, un program creează obiecte din clasele declarate anterior. Clasele Java pot moșteni structuri din cadrul altor clase. Nu este însă permis moștenirea multiplă, alături de metode multiple, respectiv câmpuri din mai mult de o singură clasa.
Tip static >
-Toate obiectele utilizate într-un program trebuie declarate anterior utilizării. Aceasta permit compiler-ului Java să localizeze și să raporteze conflictele.
Compilator >
-Înainte de a rula un program scris în limbajul Java, programul trebuie compilat utilizând un compilator Java. Dupa compilare rezultă un fișier "bytecode", similar fișierelor scrise în cod mașină, putând fi executat sub orice sistem de operare care dispune de un interpreter Java. Acest interpreter citește fișierul bytecode și transformă comenzile bytecode în comenzi mașina care pot fi executate direct de mașinile care ruleaza programul Java. Se poate spune ca Java este atât un complilator cât și un interpretor.
Execuție multi-intrări >
-Programele Java pot conține mai multe intrări de execuție care permit programelor să execute anumite task-uri în mod concurent. Spre exemplu, un astfel de program poate afișa o imagine pe ecran, în timp ce așteaptă sau acceptă de la tastatură caractere. Toate aplicațiile au cel puțin o intrare, reprezentată de calea principală de execuție a programului.
Curat >
-Programele Java colectează singure datele sau fișierele adiționale utilizate, astfel încât acestea nu necesită ștergerea altor obiecte care au utilizat memoria. Acest lucru oferă o degrevare totală a programatorului în ceea ce privește problemele de management a memoriei.
Robust >
-Deoarece interpreter-ul Java verifică toate operațiile sistem realizate de un program Java, acestea nu pot bloca sau cauza căderea unui sistem. Atunci când o eroare serioasă este descoperită, programul Java creeaza o excepție, avertizare. Această excepție poate fi capturată și apoi modificat programul astfel încât acesta să ruleze fară a risca ca sistemul să fie blocat.
Sigur >
-Sistemul Java nu numai că verifică toate accesele la memorie, dar asigură și faptul că nici un virus nu este inclus într-un applet care rulează. Deoarece pointerii nu sunt utilizați, in cadrul limbajului Java, programele nu pot avea acces la alte zone ale sistemului la care acestea nu sunt autorizate.
Extensibil >
-Programele Java suportă metodele native, care sunt funcții scrise în alte limbaje, uzual în C++. Acest suport permite programatorilor să scrie funcții care vor fi executate mai rapid decât functiile echivalente scrise în Java. Metodele native sunt legate dinamic de programele Java. Acest lucru implică faptul că acestea sunt asociate unor programe cu rulare în timp real. Cum limbajul Java suferă permanent transformări în ceea ce privește viteza, în viitor, se preconizează că aceste metode nu vor mai fi necesare.
Ușor de înțeles >
-Limbajul Java este bazat pe o tehnologie dezvoltată de-a lungul mai multor ani.
Din acest motiv, Java poate fi rapid și ușor ințeles de oricine care are un minim de experiență cu limbajele de programare moderne cum ar fi C++.
Așa cum se desprinde din enumerarea caracteristicilor limbajului Java, acesta este un
mediu relativ simplu, oferind totodată facilitățile superioare caracteristice limbajelor
avansate cum ar fi C++. Datorită caracteristicii sale de a colecta toate obiectele utilizate în cadrul execuției, programatorii se pot concentra asupra dezvoltării programelor și nu vor mai pierde timp prețios în a vâna greșelile de tipul Hard-To-Find Memory-Allocation.
Caracteristicile mediului Java, cum ar fi natura de program orientat pe obiect, ca și
abilitatea de a asigura mai multe intrări în execuție, asigură limbajului o deosebită putere
și mai ales actualitate.
CAPITOLUL II
INTRODUCERE ÎN J2ME
2.1 Introducere în java 2 platform
Platforma Java 2 conține următoarele elemente:
Limbajul de programare Java care este asemanator cu C++ dar diferă fundamental. În timp ce C++ foloseste pointeri care nu oferă siguranță și programatorul este nevoit sa aloce și dezaloce memoria, Java folosește pointeri siguri, și memoria nefolosită este dezalocată automat. În plus Java scoate moștenirea multiplă (o sursă de confuzie și ambiguitate în C++) în favoarea unei construcții mai bune – interfața.
O mașina virtuala care este fundamentul platformei Java. Aceasta arhitectură oferă câteva caracteristici atractive: mașina virtuală poate fi implementată să ruleze pe diverse sisteme de operare și configurații hardware cu aplicații Java compatibile și consistente pentru multe implementari. În plus, mașina virtuală oferă un control strict a fișierelor executate, facilitând o execuție sigură a unui cod în care nu te poti încrede.
Un set de interfețele de programare a aplicațiilor (API) finalizează platforma Java. Acestea suportă aproape orice ți-ai dori ca o aplicație să facă, de la interfața cu utilizatorul pâna la criptografie.
Luate împreună, limbajul Java, mașina virtuală Java și Java APIs formează platforma Java. Mai mult, platforma Java este proiectată să servească o mare varietate de echipamente harwdware, de la smart cards pâna la servere. De aceea platforma Java vine în trei variante:
Java 2 Stabdard Edition (J2SE) este proiectat pentru calculatoare personale. De cele mai multe ori ruleaza pe OS X, Linux, Solaris sau Windows.
Java 2 Enterprise Edition (J2EE) este o platformă pentru aplicații multiutilizator de gen enterprise. Se bazeaza pe J2SE și adaugă API pentru partea de server-client.
Java 2 Micro Edition (J2ME) este un set de tehnologii care și specificații dezvoltate pentru dispozitive mici ca pagere, telefoane mobile. J2ME folosește parți din J2SE, de exemplu o mașina virtuală mai mică și un API mai sarac.
Fig.1 Platforme Java
O privire mai detaliată asupra J2ME
Platforma J2ME nu reprezintă o specificație singulară pentru un anume tip de aplicație. În schimb, este un set de tehnologii și specificații concepute pentru diverse părți ale pieței de dispozitive mici. În primul rând, este vorba de o configurație la care se adaugă un profil ce definește setul de funcții al dispozitivelor specifice.
Nucleul platformei J2ME este format din două configurații diferite: Connected Device Configuration (CDC) și Connected Limited Device Configuration (CLDC). O configurație definește partea centrală a bibliotecilor tehnologiei Java și capabilitățile mașinii virtuale. CLDC este concepută pentru dispozitive portabile, precum telefoane mobile obișnuite, în timp ce CDC este concepută pentru dispozitive mobile mai avansate, precum Comunicatoarele Nokia, Sony Ericsson, LG ș.a.m.d.
Crearea de aplicații prin raportare la propriul telefon mobil
Configurațiilor li se suprapun profile care definesc setul de funcții de bază și interfețele de programare a aplicațiilor (API) în cadrul unei categorii de dispozitive specifice. Mobile Information Device Profile (MIDP), care se găsește pe multe modele Nokia, este un profil destinat dispozitivelor ce folosesc CLDC. Le permite dezvoltatorilor să folosească elemente ale interfeței de utilizator de la diferite modele de telefoane și ale hardware-ului, precum lumini, sunet și vibrații.
2.2 Descriere J2ME
J2ME nu definește un nou limbaj de programare ci adaptează tehnologia Java sistemelor dedicate. J2ME păstrează compatibilitatea cu J2SE ori de câte ori este posibil. Pentru a se adresa dispozitivelor mici și a răspunde la limitările lor, J2ME uneori redefinește J2SE API și adaugă noi interfețe – dar evoluția J2ME constă mai mult din omiterea de parți în plus din J2SE decât adăugarea de noi caracteristici. J2ME oferă o varietate de configurații, profile si pachete opționale.
Fig.2 Platforma Java 2 Micro Edition
După cum arată fig.2, mediile de aplicații Java pentru echipamente electronice includ EmbeddedJava, PersonalJava, J2ME și Java Card. EmbeddedJava si PersonalJava, tehnologii mai vechi bazate pe J2SE, sunt complet separate de familia J2ME și acum au intrat în stagiul de scoatere din funcțiune. Mediul J2ME este împarțit în două ramuri: Connected Device Configuration(CDC) pentru programarea de echipamente mai mari ca și puternicii asistenți digitali (PDA) și Connected Limited Device Configuration (CLDC) care se adresează echipamentelor cu resurse mai limitate, ca telefoanele mobile. CDC 1.0 este bazat pe si compatibil cu J2SE 1.3, în timp ce CDC 1.1 este bazat pe si compatibil cu J2SE 1.4. Mulți utilizatori noi ai J2ME cred că J2ME este acelasi lucru cu Mobile Information Device Profile(MIDP), pentru că MIDP este primul și cel mai popular J2ME API. Totuși, după cum se vede din fig.2 MIDP este doar o componentă a J2ME.
2.3 Organizarea J2ME
Tehnologia Java a parcurs un drum lung din zilele limbajului Oak și mediile EmbeddedJava si PersonalJava. J2ME a evoluat într-o arhitectură organizată pentru echipamente electronice, incluzând seturi de Java API pentru PDAuri și sisteme dedicate, și pentru dispozitive mai restrânse ca facilitați ca și celulare și echipamente fară ecran sau posibilitate de interacțiune cu utilizatorul.
JCP a definit nu numai componentele lui J2ME, dar și arhitectura platformei. J2ME este o platforma cu mai multe straturi care cuprinde: configurații, profile și pachete opționale. O configurație ca și CLDC deține servicii fundamentale pentru o mare varietate de echipamente. Un profil ca si MIDP suportă servicii de nivel mai înalt pentru clase mai specifice de echipamente. Un pachet opțional adaugă servicii specializate care sunt folositoare pentru mai multe dispozitive, dar nu sunt necesare pe toate din ele. Această organizare promovează reutilizarea și eficiența, dând posibilitate programatoru- lui să foloseasca o stivă de funcții care se potrivesc atât cu posibilitațile echipamentului programat cât și cu cerintele funcționale ale programului.
Fig.3 Componente J2ME
2.3.1 Configurații
O configurație este componenta cea mai de jos din mediul J2ME. Aceasta include mașina virtuala și un set de clase derivate din J2SE. Fiecare configurație este dedicată pentru o familie mai mare de echipamente cu facilitați similare. În momentul actual există două configurații definite: Connected Limited Device Configuration (CLDC) și Connected Device Configuration (CDC).
Fig.4 Configurații în J2ME
Connected Limited Device Configuration (CLDC)
CLDC nu necesita multe resurse. CLDC 1.0 suportă echipamente cu un procesor de 16 sau 32 biți cu cel puțin 160KB de memorie nevolatilă și cel puțin 32KB memorie volatilă , în total 192 KB. Consumul de energie este mic, echipamentele sunt alimentate de obicei de la baterii. Conexiunea în rețea poate să fie intermitentă și de mica viteză. În inima acestei configurații se află o mașina virtuală Java. CLDC definește un subset de pachete Java familiare pentru programatorii J2SE si adaugă clase speciale pentru echipamentele restricționate. În plus s-a introdus pachetul Generic Connection Framework (GCF) – javax.microedition.io, pentru a implementa operațiile de I/O în echipamentele care nu au suficienta memorie pentru a folosi pachtele java.net sau java.io.
Connected Device Configuration (CDC)
CDC e proiectat pentru echipamente mult mai puternice ca cele pe care CLDC le suportă, ca și celularele din clasa high-end și PDA, și sistemele dedicate: televiziune care oferă facilitați de rețea, sisteme de navigare în mașina. Echipamentele care suportă CDC au procesoare pe 32 biti, au cel puțtin 2MB de memorie principală și cel puțin 2.5 MB de memorie ROM și posibilitați de legare în retea.
2.3.2 Profile
Configurațiile nu oferă clase pentru managementul ciclului de viața al aplicației, pentru interfața cu utilizatorul, pentru a menține și modifica date locale în echipamente sau pentru a accesa date care sunt pe un server din rețea. Acest tip de funcționalitate este prezentat de profiluri sau de pachete opționale. Un profil adaugă clase specifice domeniului setului de clase prezentat de configurație, clase care sunt orientate spre folosirea echipamentelor și oferă funcționalitatea, care lipsește din configurație. În acest moment există două profiluri bazate pe CLDC: Mobile Information Device Profile(MIDP 1.0, 2.0) și Information Module Profile(IMP). Trei profile sunt bazate pe CDC: Foundation Profile(FP), Personal Basis Profile(PBP) si Personal Profile(PP).
Fig.5 Profile bazate pe CLDC
MIDP a fost primul profil J2ME și este cel mai matur și mai bine dezvoltat, cu milioane de utilizări în toată lumea, în primul rând pe PDAuri și telefoane celulare. Țintele pentru IMP sunt echipamentele asemănătoare ca și caracteristici cu cele pentru MIDP, dar care nu au interfața cu utilizatorul: sisteme dedicate, aplicații industriale și aplicații de securitate. IMP 1.0 este un subset a MIDP 1.0, din care s-a scos API pentru interfața cu utilizatorul, în principal javax.microedition.lcdui. Aplicațiile IMP se numesc Imlets, dar ele sunt de fapt niste MIDlets: sunt subclase ale acestuia, au aceleași pachete, securitate și ciclu de viața ca și MIDleturile.
2.3.3 Pachete opționale
Pachetele opționale sunt niste componente foarte importante pentru arhitectura J2ME. Ele pot fi privite ca extensii a profilelor. Ele oferă funcționalitate în zone de funcționalitate relativ înguste de care unele echipamente au nevoie și altele nu, ca și transmitere mesaje, multimedia și servicii de locație. Cu pachetele opționale acoperind astfel de cerințe, profilele se pot concentra să ofere funcționalitatea care este folosită de toate dispozitivele. Toate pachetele opționale sunt definite de JCP, astfel devenind API standard. Există un număr mare de pachete opționale, unele pentru CLDC, unele pentru CDC, unele pentru ambele. Unele din cele mai interesante sunt:
Java API pentru Bluetooth (JABWT)
Wireless Messaging API (WMA)
Mobile Media API (MMAPI)
Web Services API pentru J2ME (WSA)
Security and Trust Services API (SATSA)
2.3.4 Aplicații
Categorii de aplicații:
* Aplicații locale (independente) – nu necesită surse externe de date sau comunicații prin rețea (jocuri,programe utilitare: agendă,calculator, etc)
* Aplicații de rețea – conțin atât componente locale cât și la distanța, aflate pe servere Web (client de e-mail).
Considerații generale
Crearea unei aplicații performante J2ME este o "artă" ce trebuie să țină cont de:
-memoria (volatilă sau persistentă) este limitată drastic ;
-procesoare lente ;
-lipsa unui sistem de fișiere clasice ;
-limitări, eventual severe, ale conectivității ;
-modalitatea de instalare a aplicației .
CAPITOLUL III
MIDlet-uri
Midlet-urile sunt aplicații create pentru:
-Configurația CLDC (Connected Limited Device Configuration)
-Profilul MIDP (Mobile Information Device Profile)
Software-ul necesar este alcatuit din :
-JDK 1.3+
-Wireless Toolkit
MIDlet API
1) Pachete CLDC
java.lang J2SE
java.io J2SE
java.util J2SE
javax.microedition.io
2) Pachete MIDP
javax.microedition.midlet
javax.microedition.lcdui
javax.microedition.rms
3.1 Suite de midlet-uri
Midlet-urile sunt distribuite sub forma unor suite. Acestea sunt formate din unul sau mai multe midlet-uri, arhivate împreună, care:
-fie oferă o serie de funcții similare (cum ar fi o colecție de jocuri) ;
-fie lucrează împreună, fiind module ale unui sistem mai complex ;
-au acces la aceleași resurse (imagini, date, etc.) ;
-pot comunica prin setarea/obținerea unor informații dintr-o zonă comună de memorie ;
3.2 Modul de lucru
Un midlet este format din unul sau mai multe ecrane (screens). Acestea pot fi :
-structurate – au o anumită funcționalitate, sunt portabile, nu permit accesul direct la acran sau la mecanisme low-level.
-nestructurate (canvas-uri) – permit controlul ecranului la nivel de pixel, tratarea evenimentelor generate de ap˘asarea tastelor, etc.
Fiecare ecran are asociată o serie de comenzi (abstract commands). Acestea permit utilizatorului navigarea între ecrane și execuția unor acțiuni
specifice.
3.3 Structura unui midlet
public class MyMIDlet extends MIDlet
{
public MyMIDlet()
{
// Crearea de ecrane
// Crearea si asocierea de actiuni ecranelor
// Stabilirea claselor de tip listener pentru actiuni
}
public void startApp()
{
// Setarea eranului initial/curent
// Pornirea unor fire de executie
}
public void pauseApp ()
{
// Eliberarea temporara a unor resurse
// Oprirea unr fire de executie
}
public void destroyApp(boolean unconditional)
{
// Eliberarea tuturor resurselor
// Salvarea starii persistente a aplicatiei
}
}
3.4 Crearea unui midlet simplu (1)
Crearea unui midlet presupune parcurgerea următoarelor etape :
1.Crearea unui proiect nou:
New Project:
Hello
Wtk22/apps/Hello
[bin]
[lib]
[res]
[src]
project.properties
2. Scrierea codului
3. Compilarea
4. Preverificarea
5. Arhivarea
6. Execuția (testarea)
7. Instalarea
1 Crearea unui proiect nou
Se creeaza noul proiect urmărind pașii indicați !
2 Scrierea codului
Fiecare midlet trebuie să extindă clasa abstractă MIDlet, aflată în pachetul javax.microedition.midlet, la fel ca în cazul creării unui applet, pentru care se folosea clasa java.appletApplet.
Un simplu midlet trebuie să suprascrie trei metode din această clasă abstractă:
startApp(), pauseApp() și destroyApp(Boolean unconditional).
Un exemplu de middlet este următorul:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class test extends MIDlet implements CommandListener {
private String text1;
private Form form;
private Command iesire = new Command("Iesire", Command.EXIT, 1);
private Display afisaj;
public void test02()
{
form = new Form("Viper");
afisaj = Display.getDisplay(this);
form.append("Primul test :\n");
text1 = " Salut,Alex !";
form.append(text1);
form.addCommand(iesire);
form.setCommandListener(this);
// stabileste afisarea la formularul declarat
afisaj.setCurrent(form);
}
public void startApp()
{
test02();
}
public void pauseApp() { }
public void destroyApp(boolean unconditional)
{
// eliberam memoria ocupata de formular
form = null;
}
public void commandAction(Command c, Displayable d)
{
if (c==iesire)
{
// distruge acestă formular
destroyApp(true);
// Notify the application management software that this MIDlet
// has entered the destroyed state
notifyDestroyed();
}
}
}
Midletul va afișa pe ecranul emulatorului următorul text (fig.6):
3 Compilarea
Compilarea unui midlet nu este foarte diferită de compilarea unei aplicații Java normale.Se va folosi javac din kitul standard Java ca și compilator, cu diferența că trebuie schimbată calea in timpul compilării programului.Acest lucru realizează schimbarea claselor Java de baza pe care compilatorul Java le utilizează pentru a compila midletul.
4 Preverificarea
Inainte de a instala clasa Midlet, este necsar ca aceasta sa fie preverificata.
Verificarea codului de bit (verification of byte code) este o etapă realizată de Mașina Virtuala Java, înainte de a rula vre un fișier class,pentru a se asigura că fișierul class este corect din punct de vedere structural și conceptual.
Dacă un fișier class eșuează în această verificare, acesta este respins iar Mașina Virtuală se închide, indicand o violare a securității sau a integrității din partea fișierului class.
5 Arhivarea
Arhivarea Midletului pentru a fi gata de testare și instalare, este un proces care cuprinde mai mulți pași.
Primul pas este crearea unui filier Manifest. Acesta descrie conținutul fișierului jar (Java Archieve) care va fi creat în pasul următor.
Al doilea pas este crearea unui fișier cu extensia .jad .Un filier descriptor al aplicației java (Java Application Descriptor – JAD) pointează către locația midletului pe care îl descrie astfel încat un dispozitiv J2ME să îl poată instala.
6 Execuția (testarea)
Înainte de instalarea midleturilor, acestea trebuie testate folosind un dispozitiv emulator comun de bază care mimează funționalitatea unui dispozitiv din calculator.
Acest emulator face parte din Wireless Toolkit și furnizează funcționalitatea care este prezentă la majoritatea dispozitivelor pentru care midletul este creat.
7 Instalarea
Există două posibilitați de a instala midletul pe telefonul mobil.
Prima dintre ele este prin intermediul unei conexiuni între mobil și calculator printr-un cablu USB sau o conexiune prin Blootooth.
A doua posibilitate de a instala midletul pe telefonul mobil este prin intermediul internetului, premițand astfel ca midletul să poată fi utilizat de oricine are o conexiune la internet.
Pentru a putea instala un midlet prin internet este nevoie de un acces la un server web cu o adresă IP reală sau un nume de domeniu real.
a) Instalarea pe un serverWeb
Se parcurg următoarele etape :
1. Copierea fișierelor aplicației (games.jar și games.jad) pe server
2. Configurarea tipurilor MIME recunoscute de server:
jar – application/java-archive
jad – text/vnd.sun.j2me.app-descriptor
3. In games.jad:
MIDlet-Jar-URL: games.jar
…devine…
MIDlet-Jar-URL:
http://YourWebServerAddress:port/pathTo/games.jar
4. Creare unei pagini Web:
<html> <body>
<a href=http://YourWebServerAddress:port/pathTo/games.jad >
Suita de jocuri minunate! </a>
</body> </html>
b) Instalarea pe un dispozitiv mobil
Testarea aplicației poate fi făcută cu WTK, pur și simplu accesând din browser legătura de pe pagina Web către midlet.
Dispozitivele ce oferăa suport pentru J2ME conțin un manager de aplicații Java (JAM), responsabil cu descărcarea, instalarea și configurarea programelor
J2ME.
Pentru a simula comportamentul unui JAM, poate fi folosit utilitarul emulator din distribuția WTK: emulator -Xjam.
3.5 OTA – Over The Air
Definiție:
O.T.A.Inseamna, in traducere directa “prin aer" , și se referă la transferul direct de date prin rețeaua de telefonie mobilă la aparatul mobil. Poate fi vorba de date de configurare pentru utilizarea diferitelor servicii sau de software, jocuri si multe altele.
Fig.7 OTA –Over the Air
3.6 Ciclul de viață al unui midlet
Dispozitivele mobile, indiferent dacă sunt emulatoare sau reale, interacționeză cu un midlet folosind propriul lor software,numit Application Management Software (AMS) .
Acesta este responsabil cu inițializarea, deschiderea, pauza, resunimg și distrugerea midletului. AMS poate fi folosit și pentru instalarea și ștergerea unui midlet.
Pentru a facilita acest management, un midlet poate avea una dintre cele 3 stări controlate prin intermediul metodelor din clasa Midlet, metode pe care orice midlet le extinde și suprascrie.
Fig.8 Ciclul de viață al unui midlet
3.7 Interfața grafică
Interfața grafică cu utilizatorul a fost implementată ținând cont de particula- ritațile fizice ale dispozitivelor mobile.
Specificațiile CLDC nu au nici o referire la GUI, ele fiind
definite în MIDP.
Pachetele care oferă suport pentru crearea GUI:
javax.microedition.lcdui
javax.microedition.lcdui.game
Gestiunea ecranului propriu-zis și a celorlalte mecanisme fizice accesibile ale dispozitivului se face prin intermediul clasei Display, aceasta fiind responsabilă, și de gestiunea screen-urilor aplicației.
3.7.1 Clasa Displayable
Este supeclasa abstractă a ecranelor, definind funcționalitatea comună a acestora:
-pot avea un titlu ;
-pot avea un ticker (un text ce se deplasează în mod continuu pe ecran) ;
-pot avea zero sau mai multe comenzi ;
-pot avea un CommandListener ;
Implementările de bază ale acestei clase sunt:
Screen – ecrane structurate
Canvas – ecrane nestructurate
3.7.1.1 Clasa Screen
Este superclasa abstractă a ecranelor structurate, implementările directe fiind:
Alert – Mesaje de avertizare, erori, etc.
List – Ecran pentru selectarea unei opțiuni dintr-o mulțime prestabilită.
TextBox – Ecran pentru introducerea unui text.
Form – Permite crearea de ecrane compuse din alte componente, cum ar fi imagini (Images) sau articole derivate din Item: ChoiceGroup, CustomItem, DateField, Gauge, ImageItem, Spacer, StringItem, TextField .
Crearea form-urilor
Articolele unui ecran Form sunt referite prin indexul lor (care reprezintă un număr între 0 și size() – 1), gestiunea lor fiind realizată prin intermediul metodelor: append, insert, set, delete.
Poziționarea articolelor se face pe linii, după un algoritm prestabilit. In cazul în care articolele nu incap în ecran, va fi creată automat o bară verticală de derulare.
Ex: Form = new mainForm;
mainForm.append("Introduceti datele:");
mainForm.append(new TextField("Nume", "", 50, TextField.ANY));
mainForm.append(new DateField("Data", DateField.DATE));
Tratarea evenimentelor generate de modificare conținutului unui articol se face prin implementarea interfeței ItemStateListener.
Interfața ItemStateListener
Metoda interfeței este:
itemStateChanged(Item item).
Form mainForm = new Form("Hello");
StringItem s = new StringItem(null, "Hello world");
TextField tf = new TextField("Nume", "", 50, TextField.ANY);
…
mainForm.append(s);
mainForm.append(tf);
mainForm.setItemStateListener(new ItemStateListener()
{
public void itemStateChanged(Item item)
{
s.setText("Hello " + tf.getString());
}
});
3.7.1.2 Clasa Canvas
Este clasa de bază pentru aplicații care necesită desenare la nivel de pixel și tratarea unor evenimente low-level ( -> jocuri !!)
-Desenarea se face în metoda paint
-Tratarea evenimentelor se face în metode specifice cum ar fi: keyPressed, keyRepeated, keyReleased, etc.
Derivată din Canvas, este clasa GameCanvas care oferă facilități suplimen- tare pentru dezvoltarea de jocuri.
Definirea comenzilor :
Comenzi abstracte – high-level: Command
-Etichetă: nume scurt / lung
-Tip: BACK, CANCEL, EXIT, HELP, ITEM, OK, SCREEN, STOP
-Prioritate: număr întreg; cel mai mic număr – cea mai importantă comandă.
Dispunerea comenzilor pe ecran va ține cont de tipurile
și prioritățile acestora.
Adăugare de comenzi pentru un ecran: addCommand.
Tratarea evenimentelor generate de acționarea comenzilor: CommandListener.
Interfața CommandListener
Metoda interfeței este:
commandAction(Command c, Displayable s).
public class MyListener implements CommandListener
{
public void commandAction(Command c, Displayable s)
{
if (c.getCommandType() == Command.EXIT)
notifyDestroyed();
if (c.getLabel().equals("Play"))
letsPlayTheGame();
}
…
}
3.8 Imagini
Imaginile sunt utilizate prin intermediul clasei Image.
Formatul admis este PNG (Portable Network Graphics)
Crearea unei imagini se realizează prin metoda: Image.createImage,
conținutul imaginii putând fi:
-preluat din resursele midletului (imutable)
-creat explicit din program (mutable)
Imaginile pot fi utilizate ca :
*componente în cadrul form-urilor
Form mainForm = new Form("Hello");
Image img = Image.createImage("/Taz.png");
mainForm.append(img) ; // sau
ImageItem item = new ImageItem("Poza", img, Item.LAYOUT_CENTER, "mainForm.append(item) ;
*desenare în canvas-uri
public void paint(Graphics g)
{
Image img = Image.createImage("/Taz.png");
g.drawImage(0, 0, HCENTER | VCENTER);
}
*double-buffering
Image img = Image.createImage(width, height);
Graphics gmem = img.getGraphics();
gmem.drawLine(0, 0, 10, 10);
3.9 Asigurarea persistenței datelor
Record Management System (RMS)
Prin clasele sale, RMS oferă suportul pentru asigurarea persistenței unor informații între două execuții succesive ale unui midlet.
Memorarea datelor este realizată într-o tabelă de persistență, formată din articole. Fiecare articol este compus din:
– ID ,care reprezintă valoarea asignată automat, care identifică în mod unic articolele din tabela de persistență ;
– conținut care reprezintă un tablou de octeți, unde lungimea acestuia
putând varia de la un articol la altul.
3.9.1 Tabele de persistență
Importul acestora se realizează cu ajutorul liniei de comandă comandă javax.microedition.rms.RecordStore
Un midlet poate crea oricîte tabele de persistență, fiecare fiind identificată prin numele său, care trebuie să fie unic în cadrul suitei.
Fiecare midlet dintr-o suită poate avea acces la tabelele celelalte. Aceeași tabelă poate fi utilizată concurent de mai multe midleturi, implementarea clasei RecordSet asigurând sincronizarea accesului.
Detectarea modificărilor se realizează în felul următor :
– se obține numărului versiunii ;
– se setează un RecordListener.
3.9.2 Gestiunea tabelelor
Operațiile ce pot fi efectuate sunt : creare / ștergere, deschidere / închidere, etc.
import javax.microedition.rms.*;
RecordStore rs = null;
try
{
boolean createIfNecessary = true;
rs = RecordStore.openRecordStore("mydata", createIfNecessary);
…
rs.closeRecordStore();
}
catch( RecordStoreNotFoundException e )
{
// tabela nu exista
catch( RecordStoreNotOpenException e )
{
// tabela nu este deschisa
}
catch( RecordStoreException e ){
// alta eroare (spatiu insuficient, etc.)
}
3.9.3 Gestiunea articolelor
byte[] data = {0, 1};
try
{
int id = rs.addRecord( data, 0, data.length );
…
int numBytes = rs.getRecord(id, data, 0 );
rs.deleteRecord(id);
}
catch( RecordStoreFullException e )
{
// spatiu insuficient
}
catch( InvalidRecordIDException e )
{
// id-ul specificat nu exista
}
catch( RecordStoreException e )
{
// general error
}
3.9.4 Scrierea și citirea tipurilor primitive
a) Scrierea
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
out.writeUTF("Hello");
out.writeInt(123);
byte data[] = baos.toByteArray();
rs.addRecord( data, 0, data.length );
b) Citirea
byte data[];
rs.getRecord(id, data, 0);
ByteArrayInputStream bais = new ByteArrayInputStream();
DataInputStream in = new DataInStream(bais);
String s = in.readUTF();
int n = in.readInt(123);
3.9.5 Enumerarea articolelor unei tabele de persistență
public RecordEnumeration enumerateRecords(
RecordFilter filter,
RecordComparator comparator,
boolean keepUpdated)
RecordEnumeration – interfață ce descrie un enumerator bidirecțional pentru parcurgerea enumerării.
RecordFilter – interfață pentru filtrarea enumerării conform unor criterii proprii.
RecordComparator – interfață pentru compararea / sortarea articolelor din enumerare.
3.10 Crearea unei suite de midlet-uri (2)
Pentru crearea unei suite de midlet-uri se parcurg următorii pași :
1. Crearea unui proiect nou
2. Scrierea surselor
3. Arhivarea – Project/Package/Create package
-compilarea
-preverificarea
-arhivarea (.jar)
-crearea unui fișier descriptor (.jad)
4. Testarea
5. Instalarea
Observație: Nu toți pașii sunt obligatorii în crearea unui midlet !
CAPITOLUL IV
PROGRAMARE ÎN REȚEA FOLOSIND MIDP
Modelele folosite sunt :
1) WAP (Wireless Application Protocol) – protocol ce permite comunicarea cu un server Web (prin intermediul unui gateway) și transferul de informații în format WML (Wireless Markup Language).
2) i-mode (DoCoMo) – tehnologie proprietară ce permite acces permanent la Internet de pe un telefon mobil.
3) Java – comunicare directă cu orice server Web, folosind diverse protocoale de rețea (TCP, UDP, etc.)
4.1 Generic Connection Framework(GCF)
GCF definește fundamentele pentru dezvoltarea aplicațiilor de rețea pentru dispozitive mobile, oferind suport pentru toate tipurile de comunicare fie pe bază de pachete, fie pe bază de fluxuri.
Inițial, modelul GFC a fost definit în configurația CLDC (Connected Limited Device Configuration), în pachetul javax.microedition.io.
Fig.9 Ierarhia claselor și interfețelor
Formatul geneal al unui URL este următorul :
protocol:adresa;parameteri
-protocol – metoda de acces: ftp, http, etc
,unde -adresa – numele complet sau IP-ul resursei, portul, utilizator, parola, calea locală, etc.
-parameteri – perechi de forma ;nume=valoare.
Exemple
http://java.sun.com/developer
datagram://address:port#
comm:0;baudrate=9600
file:/myFile.txt
4.2 Tipuri de conexiuni
4.3 Crearea unei conexiuni
Se realizează cu ajutorul clasei Connector.
Aceasta este o clasă de tip Factory, în sensul că va instanția un obiect în funcție de schema (protocolul) specificată în URL.
Pentru a realiza o conexiune, avem la dispoziție doua metode:
– Metoda Connector.open
String url = "socket://www.j2medeveloper.com:80";
c = (SocketConnection)Connector.open(url);
s = c.openInputStream();
– Metode de crearea directă a unor fluxuri specifice
String url = "socket://www.j2medeveloper.com:80";
s = (InputStream)Connector.openInputStream(url);
Fig.10 Conexiuni suportate de MIDP
HttpConnection
HTTP este un protocol bazat pe paradigma cerere-răspuns, în car parametrii cererii trebuie trimiși înaintea cererii propriu-zise. Conexiunea poate exista în
una din stările:
Setup – In această stare pot fi apelate doar metodele: setRequestMethod și setRequestProperty
Connected – Metode cum ar fi openInputStream, openDataInputStream determină tranziția din starea Setup în starea Connected
Closed
Citirea unui fișier
String url = "http://www.infoiasi.ro/˜acf/hello.txt"
StreamConnection c = null;
InputStream s = null;
StringBuffer b = new StringBuffer();
try
{
c = (StreamConnection)Connector.open(url);
s = c.openInputStream();
int ch;
while((ch = s.read()) != -1)
{
b.append((char) ch);
}
System.out.println(b.toString());
}
finally
{
if(s != null)
s.close();
if(c != null)
c.close();
}
Programare low-level
Incepând cu MIDP 2.0 a fost introdus suport pentru programare de rețea low-level, folosind socket-uri și datagrame. Interfețele adăugate în javax.microedition.io sunt:
pentru protoculul socket: SocketConnection, ServerSocketConnection
Connector.open("socket://host:port") -> SocketConnection
Connector.open("socket://:port") -> ServerSocketConnection
pentru protoculul datagram:
UDPDatagramConnection
Connector.open("datagram://host:port") -> UDPDatagramConnection
Interfața ServerSocketConnection
…
ServerSocketConnection server =
(ServerSocketConnection) Connector.open("socket://:2500");
SocketConnection client =
(SocketConnection) server.acceptAndOpen();
client.setSocketOption(DELAY, 0);
client.setSocketOption(KEEPALIVE, 0);
DataInputStream dis = client.openDataInputStream();
DataOutputStream dos = client.openDataOutputStream();
String result = is.readUTF();
os.writeUTF(…);
is.close();
os.close();
client.close();
server.close();
…
Interfața SocketConnection
…
SocketConnection client =
(SocketConnection) Connector.open("socket://" + hostname + ":" + port);
client.setSocketOption(DELAY, 0);
client.setSocketOption(KEEPALIVE, 0);
InputStream is = client.openInputStream();
OutputStream os = client.openOutputStream();
os.write("some string".getBytes());
int c = 0;
while((c = is.read()) != -1) {
// do something with the response
}
is.close();
os.close();
client.close();
…
4.4 Wireless Messaging API (WMA)
4.4.1 Caracteristici WMA
WMA oferă suport pentru trimiterea / recepționarea de mesaje text sau binare, cum ar fi SMS-uri (Short Message Service).
WMA este un pachet opțional (javax.wireless.messaging), bazat pe Generic Connection Framework (GCF), ce extinde profile create
pe configurația CLDC.
WMA este definită ca un pachet opțional al J2ME.
Fig.11 Componentele WMA
WMA API
4.4.2 Crearea unei conexiuni
Crearea unei conexiuni se realizează prin :
-Modul client – doar pentru a trimite mesaje (MessageConnection)Connector.open("sms://+5121234567:5000");
-Modul server – pentru a trimite / recepționa mesaje
(MessageConnection)Connector.open("sms://:5000");
Tipuri de protocoale
– sms
– cbs
4.4.3 Trimiterea unui mesaj text
public void sendTextMessage(MessageConnection mc,
String msg,
String url)
{
try
{
TextMessage tmsg =
(TextMessage)mc.newMessage(MessageConnection.TEXT_MESSAGE);
tmsg.setAddress(url);
tmsg.setPayloadText(msg);
mc.send(tmsg);
}
catch(Exception e)
{
System.out.println("sendTextMessage " + e);
}}
4.4.4 Trimiterea unui mesaj binar
public void sendBinaryMessage(MessageConnection mc,
byte[] msg,
String (url)
{
try
{
BinaryMessage bmsg =
(BinaryMessage)mc.newMessage(MessageConnection.BINARY_MESSAGE);
bmsg.setAddress(url);
bmsg.setPayloadData(msg);
mc.send(bmsg);
}
catch(Exception e)
{
System.out.println("sendBinaryMessage " + e);
}
}
4.4.5 Recepționarea mesajelor
Implementarea interfeței MessageListener
public class WMAMIDlet extends MIDlet implements MessageListener {
…
public void notifyIncomingMessage(MessageConnection conn) {
// Procesare mesaj
}
}
Înregistrarea ascultătorului
public void startApp()
{
…
MessageConnection mc = (MessageConnection)Connector.open("sms://:
mc.setMessageListener(this);
…
}
4.4.6 Procesarea mesajelor
Este realizată uzual într-un fir de execuție.
public void run()
{
…
Message msg = mc.receive();
if (msg instanceof TextMessage)
{
TextMessage tmsg = (TextMessage)msg;
String data = tmsg.getPayloadText();
}
if (msg instanceof BinaryMessage)
{
BinaryMessage bmsg = (BinaryMessage)msg;
byte[] data = bmsg.getPayloadData();
}
}
4.4.7 Segmentarea și reasamblarea
Segmentarea și reasamblarea (SAR) este o caracteristică a unor protocoale de transport care permite divizarea unui mesaj mare într-o secvență ordonată de mesaje de dimensiuni mai mici (unități de transmisie).
Exemplu: 1 segment SMS – 160 caractere.
Pot exista limitări asupra dimensiunii unui mesaj sau a numărului de segmente. Standard, există 3 segmente.
MessageConnection mc = … ;
TextMessage tmsg = … ;
int segcount = mc.numberOfSegments(tmsg);
if (segcount == 0)
{
// alert the user
}
4.4.8 Bluetooth
Bluetooth reprezintă o tehnologie wireless pentru distanțe scurte, cu costuri reduse, pentru crearea de rețele personale (PAN – Personal Area Network). O astfel de rețea (piconet) este creată dinamic într-un spațiu restrâns, în care devine automat posibilă comunicarea între diferite dispozitive mobile (telefoane, PDA-uri) – unul din ele va fi master, celelalte (cel mult 7), fiind de tip
slave. De asemenea, Bluetooth permite conectarea mai multor piconet-uri.
Java APIs for Bluetooth Wireless Technology (JABWT) permite dezvoltarea de aplicații Java bazate pe tehnologia Bluetooth. JABWT include, de asemenea, obiectul de schimb API-uri. OBEX este un API de nivel înalt și de protocol pentru schimbul de obiecte, cum ar fi carti de vizita electronice și calendarul elemente transmise în vCard și vCalendar formate. On Bluetooth, object exchange occurs over RFCOMM. Pe Bluetooth, obiect de schimb se produce de peste RFCOMM. OBEX a fost inițial introdusă de Infrared Data Association (IrDA), și poate fi pus în aplicare în partea de sus a protocolului IrDA, TCP / IP, și altele.
Fig.12 Stiva de Bluetooth
4.4.9 JXTA
JXTA reprezintă un set de protocoale de rețea open-source peer-to-peer (P2P) care permit comunicarea între orice tipuri de dispozitive conectate în
rețea: stații PC, servere, telefoane, PDA-uri, etc.
JXTA poate fi utilizat din orice limbaj, sistem de operare, dispozitiv fizic sau protocol de transport.
Comunicarea este realizată prin mesaje XML.
JXME (JXTA – J2ME) reprezintă setul de protocoale.
JXTA destinat J2ME pentru configurația CLDC și profilul MIDP.
4.4.10 Push Registry
Conceptul de "Push" se referă la mecanismul sau abilitatea unei aplicații de a primi și procesa asincron informații, având avantajul de a reduce substanțial utilizarea resurselor dispozitivului pe care rulează programul respectiv. Folosind regiștri de tip "Push" este
posibil ˘a activarea midlet-urilor:
– pe baza unui timer
– prin rețea
Utilitatea: aplicații pentru e-mail, agenda, etc.
Fig.13 Elementele Push Registry
4.3.11 Înregistrarea
Aceasta poate fi:
Elementele Push Registry Statică – în fișierul descriptor (.jad) al suitei de midleturi pot fi înregistrate doar activări prin rețea.
MIDlet-Push-<n>: <ConnectionURL>, <MIDletClassName>,
<AllowedSender>
MIDlet-Push-1: socket://:79, com.sun.example.SampleChat, *
MIDlet-Push-2: datagram://:50000, com.sun.example.SampleChat, *
Elementele Push Registry Dinamică – folosind Push Registry API pot fi înregistrate la momentul execuței (runtime) atât activări prin rețea cât și pe bază de timer.
PushRegistry.registerAlarm
PushRegistry.registerConnection
Activarea pe bază de timer
private void scheduleMIDlet(long deltatime)
throws ClassNotFoundException,
ConnectionNotFoundException,
SecurityException
{
String midlet = this.getClass().getName();
Date alarm = new Date();
long t = PushRegistry.registerAlarm(midlet, alarm.getTime() + deltatime);
}
…
public void destroyApp(boolean uc) throws
MIDletStateChangeException {
// Eliberare resurse
…
// Inregistrarea activarii
scheduleMIDlet(defaultDeltaTime);
display = null;
}
Activarea prin rețea
…
String midletClassName = this.getClass().getName();
String url = "socket://:5000";
String filter = "*";
try {
ServerSocketConnection ssc =
(ServerSocketConnection)Connector.open(url);
PushRegistry.registerConnection(url, midletClassName, filter);
SocketConnection sc =
(SocketConnection)ssc.acceptAndOpen();
InputStream is = sc.openInputStream();
…
}
catch(SecurityException e) { … }
catch(ClassNotFoundException e) { … }
catch(IOException e) { … }
…
CAPITOLUL V
Crearea de aplicații multimedia
folosind J2ME
5.1 Mobile Media API
Mobile Media API (MMAPI) este un pachet opțional pentru dezvoltarea de aplicații multimedia folosind J2ME.
Implementarea standard pentru CLDC/MIDP este inclusă în J2ME Wireless Toolkit.
Este un pachet opțional pentru dezvoltare.
javax.microedition.media
javax.microedition.control
javax.microedition.protocol
Caracteristici
-Suport pentru generarea de tonuri, redarea și înregistrarea semnalelor audio ¸si video
-Clase specializate pentru dispozitive cu capacități limitate
-Independență de protocol sau conținut
-Extensibilitate – pot fi adăugate noi facilit ˘a¸ti, formate,
tipuri de control
Procesare multimedia
Există două parți ale procesării multimedia:
-La nivel de protocol – citirea datelor dintr-o sursă (fișier, flux) într-un sistem de procesare.
Clasa responsabilă: DataSource.
-La nivel de conținut – parsarea, decodificarea și redarea informației într-un dispozitiv fizic audio sau video.
Clasa responsabilă: Player.
MMAPI oferă și un mecanism de tip factory,și anume, clasa Manager, ce permite crearea obiectelor Player din obiecte de tip DataSource, sau InputStream .
Fig.14 Arhitectura MMAPI
5.2 Crearea unui Player
Player player = Manager.createPlayer(String url);
//url este de forma: <protocol>:<adresa>
Ciclul de viață:
UNREALIZED -> REALIZED -> PREFETCHED <-> STARTED -> CLOSED
realize() prefetch() start() close()
Tipuri de control – Pentru fiecare tip media, metoda
getControl returnează un obiect capabil să controleze redarea:
MIDIControl, VolumeControl, VideoControl, etc.
5.2.1 Redarea audio
…
Player p;
VolumeControl vc;
try
{
p = Manager.createPlayer("http://server/somemusic.mp3");
p.realize();
// get volume control for player and set volume to max
vc = (VolumeControl) p.getControl("VolumeControl");
if(vc != null)
{
vc.setVolume(100);
}
// the player can start with the smallest latency
p.prefetch();
// non-blocking start
p.start();
}
catch(IOException ioe) { … }
catch(MediaException e) { … }
…
Citirea datelor dintr-un flux
…
RecordStore store;
int id;
// play back from a record store
try
{
InputStream is = new ByteArrayInputStream(store.getRecord(id));
Player player = Manager.createPlayer(is, "audio/X-wav");
p.start();
}
catch (IOException ioe) { … }
catch (MediaException me) { … }
…
5.2.2 Redarea video
…
Player p;
VideoControl vc;
try
{
p = Manager.createPlayer("http://server/somemovie.mpg");
p.realize();
// get video control
vc = (VideoControl) p.getControl("VideoControl");
….
p.start();
}
catch(IOException ioe) {}
catch(MediaException me) {}
…
CAPITOLUL VI
XML în J2ME
Scurte caracteristici ale XML-ului :
– Tehnologie pentru aplicații Web.
– Organizare structurată a informației.
– Separă conținutul de prezentare.
– Asigură portabilitatea datelor.
– Simplifică tranzacțiile / căutarea pe Web.
– Folosește taguri și atribute.
– Permite definirea de tag-uri proprii.
– Standard pentru reprezentarea bazelor de date de dimensiuni mici ¸si medii pe Web
Fig.15 Rolul XML
6.1 Tipuri de parsere
Model – citesc întreg documentul în memorie
Push – parsează documentul și generează evenimente
Pull – citesc fragmente succesive ale documentului
Exemple: JAXP, ASXMLP, kXML, MinML, NanoXML, Tiny XML, XParseJ (6 – 14 kB)
6.2 JAXP
JAXP reprezintă un pachet opțional J2ME oferit pentru configurația CLDC și profilul MIDP, fiind un subset al JAXP J2SE.
Caracteristici:
– suportă modelul SAX ;
– nu suportă modelul DOM
– suportă spații de nume
– este format din pachetele: javax.xml.parsers, org.xml.sax, org.xml.sax.helpers
– este inclus în J2ME Wireless Toolkit.
6.3 Crearea unui parser
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
InputSource source = new InputSource("<text>Salut</text>");
/* sau
RecordStore store;
int id;
…
InputStream is = new ByteArrayInputStream(store.getRecord(id));
InputSource source = new InputSource(is);
/*
DocumentHandler handler = new MyHandler() ;
parser.parse(source, handler);
6.4 Crearea unui DocumentHandler
public class MyHandler extends DefaultHandler
{
public void startDocument() {}
public void endDocument() {}
public void startDocument() {}
public void startElement(String uri,
String localName, String qName,
Attributes attributes) {}
public void endElement(String uri,
String localName, String qName) {}
public void characters(char[] ch, int start, int length) {}
public void error(SAXParseException e) {}
public void fatalError(SAXParseException e) {}
public void warning(SAXParseException e) {}
}
Concluzie
Fara indoiala, Java este un limbaj foarte viabil. Limbajele de programare de pâna acum aveau nevoie de noi biblioteci complicate pentru a realiza ceea ce Java are incorporat: facilitați Internet, multitasking, securitate s.a.m.d. . A învatat din experiențele nefericite demonstrând de exemplu că se poate programa foarte bine si fara pointeri (desi nici utilitatea acestora nu poate fi contestata). A introdus noi standarde în programare și se menține tot timpul în pas cu ultimele noutati.
Cu Java s-a reușit o integrare coerenta a celor mai diverse domenii (lista de mai sus), o metoda simplă de adaugare a noilor standarde și o mare usurința a programării, lăsând informaticienii să se concentreze mai mult asupra structurii aplicației. Toate acestea conduc la afirmația vicepreședintelui de la Sun, Larry Weber: "Java este un limbaj de generatia a V-a".
Deși Java mai are unele puncte slabe (unul ar fi viteza mică de execuție, codul Java fiind interpretat în codul mașinii pe care se ruleaza, multitudinea de instrucțiuni care se execută pentru menținerea componentelor programului–colectorul de resturi, suportul pentru firele de execuție s.a.m.d. – care micșorează și mai mult viteza) rezolvarea lor este numai o chestiune de timp. De exemplu, în privința vitezei de execuție, Sun a propus o soluție care se numește just-in-time compiler, acesta fiind responsabil de compilarea codului Java ajuns pe calculatorul utilizatorului în codul mașinii sale, diferența de viteză dintre compilare și interpretare fiind foarte mare.
În concluzie, Java este un limbaj care merită să fie invațat, atât din cauza viitorului luminos care i se deschide cât și din cauza faptului că a aparut relativ recent – aceasta fiind deci perioada în care se formează viitorii mari maeștri ai programării in Java – .
Dacă aceste argumente sunt de ajuns pentru a vă trezi interesul, atunci următorul pas ar fi obținerea instrumentelor de programare in Java.
Referintă clasică în acest domeniu rămâne site-ul firmei Sun cu al său JDK (Java Development Kit), accesibil la http://java.sun.com . Pachetul JDK pentru majoritatea platformelor este deasemenea disponibil pe ftp la ftp.javasoft.com in directorul /pub.
Daca mediul linie de comandă al pachetului original nu vă satisface, puteți alege alte pachete, construite bineînțeles peste pachetul original JDK, cum ar fi:
– Java Workshop, creată de Sun, disponibilă la http://www.sun.com/sunsoft/Dev\ eloper-products/java/Workshop/ ;
– Symantec Cafe și Symantec Visual Cafe for Java, dezvoltate de firma Symantec, disponibile la http://caf‚.symantec.com;
– Visual J++, dezvoltată de firma Microsoft; Mai sunt multe alte medii de dezvoltare Java, cum ar fi JavaBuilder, PowerJ, SuperCede, VisualAge for Java etc dar alegerea celui potrivit pentru dumneavoastra ar trebui facută după acu- mularea unor noțiuni de bază Java.
BIBLIOGRAFIE
1) E.Petac – “Sisteme moderne de comunicații – Note de curs”
2) Cristian Frăsineanu – “Curs practic de Java”
3) http://thor.info.uaic.ro/~acf/tap/j2me1_slide.pdf
4) http://thor.info.uaic.ro/~acf/tap/j2me2_slide.pdf
5) http://java.sun.com
6) http://andreea.uv.ro/dir/Vostinar/Referat/referat.htm
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Utilizarea Limbajului Java In Telefonia Mobila (ID: 149329)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
