Programarea dispozitivelor cu resurse limitate

Programarea dispozitivelor cu resurse limitate. 1

1. Scopul lucrării 1

2. Noţiuni preliminare. 1

Instalare J2ME.. 3

3. Construirea unei aplicaţii MIDlet 4

4. Construirea unei aplicaţii MIDlet folosind Wireless Toolkit 6

5. Ciclul de viaţă al aplicaţiilor MIDlet 10

6. Interfeţe grafice. 11

7. Comunicarea folosind protocoale de comunicaţie în reţea. 19

 

1. Scopul lucrării

           

Scopul acestei lucrări este insuşirea tehnicilor de programare folosind Java 2 Micro Edition pentru dispozitive cu resurse limitate. Se va urmări înţelegearea modului de construire a unei aplicaţii j2ME pentru configuratia CLDC.

 

2. Noţiuni preliminare

 

Tehnologia Java 2 Micro Edition reprezintă un subset al Java 2 Standard Edition, şi este destinată programării dispozitivelor cu resurse limitate cum ar fi telefoane mobiel, PDA-uri. J2ME este format dintr-o maşină virtuală construită special pentru a rula pe  dispozitive cu resurse limitate, şi un set de librării (Java API) ce oferă facilităţile necesare construirii de aplicaţii java.

 

OBSERVATIE: Programatorul de dispozitive nu trebuie să se ocupe de instalarea unei maşini virtuale pe dispozitiviul mobil, de obicei acestea venind cu o maşină virtuală preinstaltă.

 

În figura 1 sunt prezentate cele trei componente ale J2ME.

 

 

Figura 1. Structura J2ME.

 

O configuraţie este formată dintr-o maşină virtuală java (special concepută pentru a putea rula pe anumite dispozitive) şi un set de clase de bază optimizate pentru a rula pe un set de dispozitive cu anumite caracteristici.

 

În prezent sunt definite două configuraţii:

-          Conected Device Configuration – este destinată dispozitivelor cu resurse importante, având nevoie de minim 512K ROM, 256K RAM şi care suportă o implementare completă a JVM.

-          Connected, Limited Device Configuration – este destinată dispozitivelor cu resurse mai limitate : 128k – 512k ROM, capacităţi de alimentare cu energie limitate, conectivitate continuă sau intermitentă la anumite tipuri de reţele, interfaţă grafică cu capacităţi limitate ( sau fără interfaţă grafică).

 

Sun a dezvoltat o maşină virtuală nouă pentru a rula aplicaţii J2ME pe dispozitive cu microprocesoare pe 16 şi 32 de biţi. Acestă maşină virtuală poartă numele KVM şi este destinată în special pentru configuraţia CLDC având nevoie de numai 40K memorie, putând de asemenea fi ajustată în funcţie de restricţiile dispozitivului pe care urmează să ruleze.

 

Un profil reprezintă o colecţie de clase (Java API) pe care dezvoltatorul le poate folosi pentru a construi aplicaţii.

 

În prezent sunt definite două profile:

-          Foundation Profile – acest profil necesită configuraţia CDC

-          MID Profile – acest profil necesită configuraţia CLDC

 

Pachetele opţionale reprezintă librării de clase ne standard care oferă acces la anumite resurse specifice ale dispozitivului, şi pe care dezvoltatorul trebuie sa le instaleze separat.

 

Figura 2. Tehnologiile Java

 

 

În mod tradiţional un dispozitiv vine cu o configuraţie şi un profil preinstalat.

 

Procesul de construire a unei aplicaţii J2ME cuprinde următoarele etape: construire arhitectură aplicaţie, codare, compilare, preverificare, împachetare, testare şi instalare.

 

Instalare J2ME

 

Înainte de a începe dezvoltarea de aplicaţii J2ME (denumite şi MIDlet-uri), va trebui instalată, pe calculatorul pe care urmează să se dezvolte aplicaţia, unealta J2ME Wireless Toolkit 2.2.

 

Observatie: Pe maşina de dezvoltarea va trebui să fie instalat J2SE 1.4.2 sau mai mare.

 

Observaţie: Dacă se doreşte dezvoltarea de aplicaţii J2ME direct din mediul Eclipse se poate instala plug-inul Eclipse ME. Plug-inul se găseşte aici sau poate fi downloadat de pe site-ul oficial http://eclipseme.org.

3. Construirea unei aplicaţii MIDlet

 

Aplicaţiile MIDlet sunt diferite de aplicaţiile standard java. Aplicaţiile MIDlet trebuie să extindă clasa abstractă MIDlet din pachetul javax.microedition.midlet (în mod similar cu crearea applet-urilor, pentru crearea cărora trebuie extinsă clasa Applet sau JApplet).

 

În listing-ul următor este prezentată structura minimală a unei aplicaţii de tip MIDlet.

 

package lab.scd.j2me;
 
import java.util.Date;
 
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
 
public class DateTimeApp extends MIDlet {
 
  Alert timeAlert;
 
  public DateTimeApp() {
    timeAlert = new Alert("Alarm!");
    timeAlert.setString(new Date().toString());
  }
 
  public void startApp() {
    Display.getDisplay(this).setCurrent(timeAlert);
  }
 
  public void pauseApp() {
  }
 
  public void destroyApp(boolean unconditional) {
  }
}

 

Editaţi codul anterior în cadrul unui fişier cu numele DateTimeApp.java şi salvaţi fişierul într-un director a cărui structură are forma ...\lab\scd\j2me (de exempli: d:\temp\lab\scd\j2me\DateTimeApp.java).

 

Compilarea unei aplicaţii MIDlet se face în mod similar cu o aplicaţie obisnuită folosindu-se acelaşi utilitar javac.exe (pentru mediul windows), doar că va trebui specificat parametrul –bootclasspath care va indica calea către librăriile J2ME ce vor fi folosite pentru compilare (daca nu se specifică acest parametru aplicaţia va fi compilată în mod J2SE)

 

d:\temp>javac-bootclasspath ..\lib\cldcapi11.jar;..\lib\midpapi20.jar com\j2me\part1\DateTimeApp.java

 

Preverificarea este o etapă ce trebuie realizată înainte de instalarea unei aplicaţii MIDlet pe un dispozitiv mobil. În cadrul acestei etape este verificată integritatea şi corectitudinea aplicaţiei MIDlet şi respectăspecificaţiile maşinii virtuale pe care va fi rulată. Această verificare este realizată pentru toate tipurile de aplicaţii java, dar pentru că maşina virtuală pentru dispozitive mobile ar resurse limitate sarcina verificării revine programatorului, şi aceasta se realizează înainte de instalarea pe dispozitiv.

 

Wireless Toolkit conţine în directorul \bin utilitarul preverify.exe ce este utilizat pentru realizarea acestei etape. Comanda ce trebuie executată pentru a verifica un MIDlet este:

 

d:\temp>preverify.exe -classpath ..\lib\cldcapi11.jar; ..\lib\midpapi20.jar com.j2me.part1.DateTimeApp

 

În urma executării comenzii se va genera o versiunea „preverificată” a DateTimeApp.class într-un director numit output.

 

Împachetarea aplicaţiei şi pregătirea acesteia pentru a fi instalată presupune parcurgerea următorilor paşi:

 

Se construieşte fişierului Manifest.mf cu următorul conţinut:

 

MIDlet-Name: DateTimeApp
MIDlet-Version: 1.0.0
MIDlet-Vendor: Your Name

 

Acest fişier va trebui construit în directorul .../output.

 

Se construieşte arhiva jar ce conţine aplicaţia şi fişierul manifest:

 

d:\temp\output>jar cvfm DateTimeApp.jar Manifest.mf .\com

 

Se construieşte un fişier DateTimeApp.jad cu următorul conţinut:

 

MIDlet-1: DateTimeApp, , com.j2me.part1.DateTimeApp
MIDlet-Name: DateTimeApp
MIDlet-Version: 1.0.0
MIDlet-Vendor: Your Name
MIDlet-Jar-URL: DateTimeApp.jar
MIDlet-Jar-Size:
MicroEdition-Profile: MIDP-2.0
MicroEdition-Configuration: CLDC-1.1

 

Se salvează fişierul DateTimeApp.jad în acelaşi director cu arhiva jar (în directorul ...\output). După cum se observă atributul MIDlet-Jar-Size nu este completat. Valoarea acestui câm trebuie să fie identică cu dimensiunea fişierului cu extensia .jar. Aceasta poate diferi de la o maşină la alta, astfel încât în momentul parcurgerii acestor paşi va trebui să citiţi valoarea exactă a dimensiunii fişirului jar şi sa completaţi acest atribut cu valoare corespunzătoare (în octeţi).

 

De exemplu pe maşina pe care a fost compilată şi verificată aplicaţia dimensiunea fişierului .jar este de 1487 octeţi.

 

În acest moment este finalizată etapa de împachetare a aplicaţiei, aceasta fiind pregătită pentru a fi rulată.

 

Testarea aplicaţiei MIDlet se face înainte de încărcarea acesteia pe dispozitivul mobil. Testarea se realizează pe un emulator ce simulează funcţionalităţile dispozitivului pe care urmează să fie încărcată aplicaţia. Acest emulator face parte din Wireless Toolkit. Pentru lansarea în execuţie a emulatorului şi testarea aplicaţie se execută comanda:

 

D:\temp\output>emulator.exe -Xdescriptor DateTimeApp.jad

 

După testarea aplicaţiei pe emulator se poate trece la ultimul pas.

 

Instalarea aplicaţiei MIDlet pe dispozitivul mobil se poate face în două moduri, fie printr-o conexiune directă între dispozitiv şi calculator utilizând unul dintre mecanismele de comunicaţie disponibile (bluetooth, USB, COM, etc...) fie prin Internet (aceasta presupune că dispozitivul mobil are acces la Internet).

 

4. Construirea unei aplicaţii MIDlet folosind Wireless Toolkit

 

Unealta Wireless Toolkit automatizează paşii prezentaţi anterior pentru construirea unei aplicaţii MIDlet, oferind programatorului o interfaţă grafică prin intermediul cărei poate să construiască aplicaţii de tip MIDlet putând efectua toţi paşii prezentaţi în capitolul anterior.

 

Lansarea în execuţie a interfeţei Wireless Toolkit se face executând fişierul ktoolbar.exe din directorul bin (din directorul de instalare al Wireless Toolkit). În urma lansării va fi afişată fereastra:

 

 

În continuare v-om crea acelaşi proiect ca şi în capitolul anterior pentru a vede modul în care unealta Wireless Toolkit ajută dezvoltatorul în procesul de construire a unei aplicaţii.

 

Se selecează opţiunea New Project... şi în fereastra care apare se introduce numele proiectului: DateTimeApp şi MIDlet Class Name: lab.scd.j2me.DateTimeApp.

 

În următoarea fereastră se pot seta parametrii MIDlet-ului, printre care şi platforma de destinaţie pentru care va fi construit acesta.

 

 

Se apasă butonul OK şi proiectul va fi generat.

 

 

Având în vedere ca se va construi aceiaşi aplicaţie ca şi în capitolul anterior, se va refolosi codul sursă DateTimeApp.java şi va fi copiat acest fişier în directorul proiectului în ...\DateTimeApp\src\lab\scd\j2me\.

 

În acest moment aplicaţia MIDlet este finalizată. Prin apăsarea butonului Run, din cadrul ferestrei principale a Wireless Toolkit se vor executa automat paşii de compilare, preverificare şi rulare în cadrul emulatorului.

 

Dacă aplicaţia a rulat corect pe emulator se poate realiza ultimul pas de inpachetare şi construire a fişierului jad. Pentru aceasta se selecteaza opţiunea Create Package.

 

 

În acest moment aplicaţia MIDlet este pregătită pentru a fi încărcată pe dispozitivul mobil.

 

5. Ciclul de viaţă al aplicaţiilor MIDlet

 

Ciclul de viaţă al MIDlet-urilor este gestionat de către Aplication Management System (AMS) – acesta fiind o aplicaţie aflată pe dispozitivul mobil care gestionează proceslee de download, instalare, rulare şi ştergere a MIDlet-urilor pe dispozitivul mobil.

 

În momentul în care utilizatorul selectează un MIDlet pentru a fi executat, AMS îl lansează în execuţie şi îl pune în starea Paused. În continuare AMS mută MIDlet-ul din starea Paused în starea Active şi îl notifică prin apelarea metodei startApp(). În mod similar sunt invocate metodele pauseApp() şi destroyApp() în momentul în care aplicaţia este dusă în starea de pauză sau distrusă.

 

Folosind diagramele de Masini cu Stări Finite reprezentarea stărilor unui MIDlet şi tranziţiile posibile sunt reprezentate în figura următoare:

 

Stările unui MIDlet reprezentate utilizând FSM.

 

O atenţie deosebită trebuie acordată tranziţiei stărilor pentru un MIDlet. De exemplu în condiţiile rulării aplicaţiei pe un telefon mobil, în momentul recepţionării unui apel, aplicaţia MIDlet este automat trecută în starea Paused. Aplicaţia va trebui să îşi salveze starea şi să îşi poată continua execuţia din punctul în care a rămas în momentul în care va reveni în starea Active.

 

 

 

6. Interfeţe grafice

 

Acest capitol prezintă modul în care pot fi construite interfeţe grafice în cadrul aplicaţiilor de tip midlet pentru dispozitive mobile folosind MIDP 2.0.

 

Clasele pentru construirea interfeţelor grafice sunt localizate în MIDP 2.0 în cadrul pachetelor: javax.microedition.lcdui şi javax.microedition.lcdui.game. Clasele esenţiale sunt listate în figura x şi figura y:

 

Figura x.

 

Figura y.

 

Utilizarea clasei Alert

 

Obiectele de tip Alert se recomandă a fi folosite pentru pentru afişarea de informaţii sau mesaje de eroare ce rămân pe ecran o perioadă scurtă de timp.

 

Setarea titlului alertei se face în cadrul constructorului.

 

Mesajul afişat de alertă este setat folosind metoda setString() sau prin intermediul constructorului.

 

Tipurile de alerte ce pot fi afişate sunt: ALARM, CONFIRMATION, ERROR, INFO, şi WARNING.

 

Metoda setTimeout(int time) poate fi folosită pentru a seta timpul cât alerta este vizibilă pe ecran. Dacă este setată ca valoare de timp constanta definită Alert.FOREVER atunci fereastra de tip alertă devine modală şi permanentă pe ecran.

 

Asocierea unei imagini la alerta se face folosind metoda setImage(Image img).

 

import javax.microedition.lcdui.Alert;

import javax.microedition.lcdui.Display;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

 

 

public class mymidlet extends MIDlet {

 

      public mymidlet() {

      }

 

      protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

      }

 

      protected void pauseApp() {

      }

 

      protected void startApp() throws MIDletStateChangeException {

            // TODO Auto-generated method stub

            Alert a = new Alert("message displayed by java midlet");

            a.setTimeout(Alert.FOREVER); 

            Display.getDisplay(this).setCurrent(a);

      }

}

 

Utilizarea clasei List

 

Listele modelează componente grafice ce permit selectarea uneia sau mai multor opţiuni dintr-o listă. Optiunile pot fi de tip „radio button” sau de tip „check box”.

 

Programul următor exemplifică modul în cre pot fi construite şi utilizate obiectele de tip List.

 

import javax.microedition.lcdui.List;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
 
public class ListExample extends MIDlet {
 
        List fruitList1;
        List fruitList2;
 
        public ListExample() {
          fruitList1 = new List("Select the fruits you like",
                                 Choice.MULTIPLE);
          fruitList1.append("Orange", null);
          fruitList1.append("Apple", null);
          fruitList1.insert(1, "Mango", null); 
            // inserts between Orange and Apple
 
          String fruits[] = {"Guava", "Berry", "Kiwifruit"};
          fruitList2 =
            new List(
                               "Select the fruits you like - List 2",
              Choice.IMPLICIT,
              fruits,
              null);
        }
 
        public void startApp() {
               Display display = Display.getDisplay(this);
               display.setCurrent(fruitList1);
 
               try{
                 Thread.currentThread().sleep(3000);
               } catch(Exception e) {}
 
               display.setCurrent(fruitList2);
        }
 
        public void pauseApp() {
        }
 
        public void destroyApp(boolean unconditional) {
        }
}

 

Utilizarea clasei TextBox

 

Clasa TextBox reprezintă componente grafice prin intermediul cărora poate fi preluat text de la utilizator. Prin intermediul metodelor definite în cadrul clsei pot fi aplicate diferite constrângeri asupra obiectelor de tip TextBox.

 

Programul următor exemplifică utilizarea clasei TextBox.

 

import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
 
public class TextBoxExample extends MIDlet {
 
        private TextBox txtBox1;
        private TextBox txtBox2;
 
        public TextBoxExample() {
               txtBox1 = new TextBox(
                       "Your Name?", "", 50, TextField.ANY);
 
               txtBox2 = new TextBox(
                       "Your PIN?",
                       "",
                       4,
                 TextField.NUMERIC | TextField.PASSWORD);
        }
 
        public void startApp() {
               Display display = Display.getDisplay(this);
               display.setCurrent(txtBox1);
 
               try{
                 Thread.currentThread()Sleep(5000);
               } catch(Exception e) {}
 
               txtBox1.setString("Bertice Boman");
 
               try{
                 Thread.currentThread()Sleep(3000);
               } catch(Exception e) {}
 
               // inserts 'w' at the 10th index to make the
               // name Bertice Bowman
               txtBox1.insert("w", 10);
 
               try{
                 Thread.currentThread()Sleep(3000);
               } catch(Exception e) {}
 
 
               display.setCurrent(txtBox2);
        }
 
        public void pauseApp() {
        }
 
        public void destroyApp(boolean unconditional) {
        }
}

 

Utilizarea clasei Form

 

Clasa Form oferă posibilitaea de grupare a mai multor elemente grafice de tip Item. Adăugarea de obiecte Item se face folosind metoda add(index i, Item i).

 

Item-urile care pot fi adăugate în cadrul unui Form sunt: StringItem, DateItem, TextField, ChoiceGroup, Spacer, Gauge, ImageItem, CustomItem.

 

Programul următor exemplifică folosirea Item-urilor de mai sus cu excepţia Item-ului CustomItem.

import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Spacer;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.ChoiceGroup;
 
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
 
public class FormExample extends MIDlet {
 
        private Form form;
        private Gauge gauge;
        private Spacer spacer;
        private ImageItem imageItem;
        private TextField txtField;
        private DateField dateField;
        private StringItem stringItem;
        private ChoiceGroup choiceGroup;
 
        public FormExample() {
               form = new Form("Your Details");
 
               // a StringItem is not editable
               stringItem = new StringItem("Your Id: ", "WXP-890");
               form.append(stringItem);
 
               // you can accept Date, Time or DateTime formats
               dateField = new DateField("Your DOB: ", DateField.DATE);
               form.append(dateField);
 
               // similar to using a TextBox
               txtField = new TextField(
                       "Your Name: ", "", 50, TextField.ANY);
               form.append(txtField);
 
               // similar to using a List
               choiceGroup = new ChoiceGroup(
                       "Your meals: ",
                       Choice.EXCLUSIVE,
                       new String[] {"Veg", "Non-Veg"},
                       null);
               form.append(choiceGroup);
 
               // put some space between the items to segregate
               spacer = new Spacer(20, 20);
               form.append(spacer);
 
               // a gauge is used to show progress
               gauge = new Gauge("Step 1 of 3", false, 3, 1);
               form.append(gauge);
 
               // an image may not be found,
               // therefore the Exception must be handled
               // or ignored
               try {
                       imageItem = new ImageItem(
                               "Developed By: ",
                               Image.createImage("/duke.gif"),
                               ImageItem.LAYOUT_DEFAULT,
                               "DuKe");
                       form.append(imageItem);
               } catch(Exception e) {}
        }
 
        public void startApp() {
               Display display = Display.getDisplay(this);
               display.setCurrent(form);
        }
 
        public void pauseApp() {
        }
 
        public void destroyApp(boolean unconditional) {
        }
}

 

Interacţiunea cu utilizatorul

 

Aplicaţiile de tip Midlet interacţionează cu utilizatorul prin intermediul comenzilor. O comandă este echivalentă unui buton sau a unei opţiuni de meniu dintr-o aplicaţie obişnuită. Comenzile sunt încapsulate în cadrul obiectelor de tip Command. Comenzile pot fi ataşate componentelor grafice din cadrul midlet folosind metoda addCommand(Command c). Un element de interfaţă grafică poate avea asociat mai multe comenzi.

 

În momentul construirii obiectelor de tip Command pot fi specificaţi următorii parametri: nume scurt al comenzii, nume extins al comenzii (opţional), tipul comenzii şi prioritatea. Prin asocierea la o comandă a unui tip, dispozitivul ce rulează aplicaţia va putea mapa la comenzi anumite taste funcţionale. De exemplu o comandă cu tipul Command.OK va fi mapată la tasta OK. Restul tipurilor care pot fi asociate unei comenzi sunt: BACK, EXIT, HELP, ITEM, SCREEN şi STOP. Prioritatea unei comenzi specifică gradul de importanţă al comenzii respective şi in funcţie de aceasta dispozitivul va decide modul de afişare a comenzilor.

 

Tratarea evenimentelor generate ca urmare a acţionării unei comenzi este realizată de către implementatori ai interfeţei CommandListener ce conţine metoda commandAction(Command c, Displayable d). Înregistrarea unui ascultător de evenimente se face folosind comanda addComandListener(CommandListener l).

 

import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Spacer;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.ChoiceGroup;
 
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Command;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.CommandListener;
 
public class FormExample
  extends MIDlet
  implements CommandListener {
 
        private Form form;
        private Gauge gauge;
 
        private Spacer spacer;
        private ImageItem imageItem;
        private TextField txtField;
        private DateField dateField;
        private StringItem stringItem;
        private ChoiceGroup choiceGroup;
 
        public FormExample() {
               form = new Form("Your Details");
 
               // a StringItem is not editable
               stringItem = new StringItem("Your Id: ", "WXP-890");
               form.append(stringItem);
 
               // you can accept Date, Time or DateTime formats
               dateField =
                 new DateField("Your DOB: ", DateField.DATE);
               form.append(dateField);
 
               // similar to using a TextBox
               txtField = new TextField(
                       "Your Name: ", "", 50, TextField.ANY);
               form.append(txtField);
 
               // similar to using a List
               choiceGroup = new ChoiceGroup(
                       "Your meals: ",
                       Choice.EXCLUSIVE,
                       new String[] {"Veg", "Non-Veg"},
                       null);
               form.append(choiceGroup);
 
               // put some space between the items
               spacer = new Spacer(20, 20);
               form.append(spacer);
 
               // a gauge is used to show progress
               gauge = new Gauge("Step 1 of 3", false, 3, 1);
               form.append(gauge);
 
               // an image may not be found,
               // therefore the Exception must be handled
               // or ignored
               try {
                       imageItem = new ImageItem(
                               "Developed By: ",
                               Image.createImage("/duke.gif"),
                               ImageItem.LAYOUT_DEFAULT,
                               "Duke");
                       form.append(imageItem);
               } catch(Exception e) {}
 
               // create some commands and add them
               // to this form
               form.addCommand(
                       new Command("EXIT", Command.EXIT, 2));
               form.addCommand(
                       new Command("HELP", Command.HELP, 2));
               form.addCommand(
                       new Command("OK", Command.OK, 1));
 
               // set itself as the command listener
               form.setCommandListener(this);
        }
 
        // handle commands
        public void commandAction(
               Command com, Displayable dis) {
 
               String label = com.getLabel();
 
               if("EXIT".equals(label))
                 notifyDestroyed();
               else if("HELP".equals(label))
                 displayHelp();
               else if("OK".equals(label))
                 processForm();
        }
 
        public void displayHelp() {
               // show help
        }
 
        public void processForm() {
               // process Form
        }
 
        public void startApp() {
               Display display = Display.getDisplay(this);
               display.setCurrent(form);
        }
 
        public void pauseApp() {
        }
 
        public void destroyApp(boolean unconditional) {
        }
}

 

7. Comunicarea folosind protocoale de comunicaţie în reţea

 

În cadrul aceste secţiuni este exemplificat modul în care poate fi folosit J2ME pentru a implementa aplicaţii Midlet ce rulează pe telefoane mobile şi comunică cu servere de internet prin intermediul protocolului de comunicaţie TCP\IP.

 

La fel ca şi în cazul aplicaţiilor standar, în cazul aplicaţiilor mobile se foloseşte conceptul de socket ce reprezintă un capăt de conexiune prin intermediul căruia datele sunt transmise şi recepţionate de către servere aflate la distanţă.

 

Paşii necesari pentru a realiza comunicarea prin socket-uri în cadrul aplicaţiilor mobile J2ME sunt următorii:

-          Deschiderea conexiunii prin apelarea metodei statice Connector.connect(„socket://123.23.2.12:888”). Această metodă returnează un obiect de tip OutputConnection (ce permite doar transmiterea de date), StreamConnection (ce permite comunicaţie bidirecţională) sau InputConnection (ce permite doar operaţii de recepţionare de date).

-          Construirea fluxurilor de intrare ieşire de tip InputStream şi OutputStream.

-          Transmiterea şi recepţionarea datelor prin intermediul fluxurilor construite.

-          Închiderea fluxurilor după terminarea comunicaţiei.

 

import javax.microedition.io.*;

import java.io.*;

 

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.StringItem;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

 

 

public class SocketTest extends MIDlet {

 

      String connectString = "socket://127.0.0.1:888";

      StreamConnection streamConnection = null;

      DataInputStream dis = null;

      DataOutputStream dos = null;

     

      Display deviceDisplay;

      Form iniScreen;

      Form responseScreen;

      StringItem responseFiled;

     

     

      public SocketTest() {

            deviceDisplay = Display.getDisplay(this);

            responseScreen = new Form("Response from server:");

            iniScreen = new Form("Networking App");

            iniScreen.append(new StringItem(null,"Connecting to:"+connectString));

      }

 

      protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

      }

 

      protected void pauseApp() {

      }

 

      protected void startApp() throws MIDletStateChangeException {

            try{

             deviceDisplay.setCurrent(iniScreen);

             

             //connect to server

             streamConnection =

                  (StreamConnection) Connector.open(connectString);

             

             //create IO streams

             dos = streamConnection.openDataOutputStream();

             dis = streamConnection.openDataInputStream();

             

             iniScreen.append(new StringItem(null,"Connection to server ok."));

             

             //send data

             iniScreen.append(new StringItem(null,"Send data..."));

             dos.writeChars("Hello\n\r");

             dos.flush();

             

             iniScreen.append(new StringItem(null,"Receive data..."));

             //receive data

              StringBuffer sb = new StringBuffer();

            int inputChar;

            while ( (inputChar = dis.read()) != -1) {

              sb.append((char) inputChar);

            }

           

            //display the results on the screen

            responseFiled = new StringItem(null, sb.toString());

            responseScreen.append(responseFiled);

           

            deviceDisplay.setCurrent(responseScreen);

             

            }catch(Exception e){

                  System.err.println("App error:" + e);

                  iniScreen.append(new StringItem(null,"Error connecting:"+e.getMessage()));

            }finally{

                  try {

                        if(dis!=null )dis.close();

                        if(dos!=null) dos.close();

                        if(streamConnection!=null) streamConnection.close();

                  } catch (Exception e) {

                        System.err.println("App error while clossing conenctions:" + e);

                        iniScreen.append(new StringItem(null,"Error clossing connection:"+e.getMessage()));

                  }

                 

            }

      }

}