Wednesday, June 24, 2015

Aplicații IoT cu Java ME Embedded 8

(Publicat în revista Today Software Magazine, Numărul 36, Iunie 2015: http://issuu.com/todaysoftmag/docs/tsm_36_2015_ro)

În numărul 31 al revistei am făcut o introducere în ceea ce privește subiectul Internet of Things din perspectiva platformei Java. Așa cum am promis, vom continua această discuție prezentând detaliile creării unui proiect Java ME Embedded 8. Această versiune reprezintă un important pas înainte, odată cu adoptarea CLDC 8 - care este un sub-set al Java Standard Edition - și MEEP 8 - specificație care definește un mediu puternic și flexibil pentru sisteme embedded de dimensiuni reduse. Alături de acestea, trebuie să remarcăm alinierea platformei despre care discutăm la Java SE 8.

Tooling pentru aplicaţii ME - Oracle Java ME SDK 8.1

Aplicațiile Micro Edition pot fi dezvoltate atât manual, cât și cu ajutorul unui SDK dedicat, cunoscut sub numele Oracle Java ME SDK 8.1. SDK-ul, distribuţia Java ME, documentaţia şi orice alte resurse mai sunt necesare dezvoltării aplicaţiilor embedded, se găsesc la adresa Oracle dedicată platformei.

Înainte de a începe să dezvoltăm aplicaţii embedded, Oracle recomandă, în primul rând, instalarea Oracle Java ME SDK 8.1 - pachet software care la momentul scrierii acestui articol este disponibil doar pentru sistemul de operare Windows. Următorul pas este descărcarea distribuţiei Java ME Embedded 8 destinată dispozitivului pe care dorim să rulăm aplicaţiile. Aceasta vine sub forma unei arhive ZIP şi trebuie transferată pe dispozitiv - cu ajutorul unui tool cum este PuTTY -, unde urmează să fie instalată. De asemenea, se recomandă păstrarea unei cópii pe sistemul desktop, unde se va executa dezvoltarea aplicaţiilor. Acest ultim pas nu este obligatoriu, însă este recomandat pentru cazul în care dezvoltatorul doreşte să execute comenzi pe dispozitiv cu ajutorul AMS CLI (Application Management System Command Line), prin intermediul programului Developer Agent.

Prima noastră aplicaţie Java ME

Odată ce am instalat SDK-ul şi Java ME, putem să începem dezvoltarea unei aplicaţii embedded. Sub forma ei cea mai simplă, o astfel de aplicaţie trebuie să conţină o clasă care extinde clasa abstractă javax.microedition.midlet.MIDlet, un fişier manifest şi un fişier JAD (Java Application Descriptor). Am putea scrie o astfel de aplicaţie manual, fără ajutorul unui IDE, care să automatizeze anumiţi paşi. Acesta este un bun exerciţiu pentru dezvoltatorul care intră pentru prima dată în contact cu Java ME Embedded 8. Astfel, ne propunem să creăm o simplă aplicaţie, care afişează în consolă un mesaj la pornirea aplicaţiei şi unul la oprirea acesteia.

În primul rând, creăm o clasă care extinde javax.microedition.midlet.MIDlet, implementând metodele startApp() şi destroyApp(boolean unconditional):

public class Hello extends javax.microedition.midlet.MIDlet {
    public void startApp() {
        System.out.println("Hello MIDlet");
    }
    public void destroyApp(boolean unconditional) {
        System.out.println("Goodbye MIDlet");
    }
}

Pentru a continua în aceeaşi manieră, compilăm manual clasa pe care tocmai am scris-o, cu o comandă similară celei listată aici:

javac -cp %JAVA_ME_SDK%\lib\meep_8.0.jar -d classes src\ro\leje\Hello.java

Observăm că avem nevoie de biblioteca meep_8.0.jar la compilare, întrucât aceasta defineşte clasa abstractă MIDlet. Această bibliotecă se găseşte în directorul %JAVA_ME_SDK%\lib, unde %JAVA_ME_SDK% reprezintă calea unde a fost instalat SDK-ul.

Următorul pas îl reprezintă crearea fişierului manifest, care trebuie să conţină cel puţin următoarele informaţii:

MIDlet-Name: Hello
MIDlet-Version: 1.0
MIDlet-Vendor: Today Software Magazine
MIDlet-1: Hello,,ro.leje.Hello
MicroEdition-Configuration: CLDC-1.8
MicroEdition-Profile: MEEP-8.0

Presupunând că am salvat fişierul manifest cu numele MANIFEST.MF, putem trece la următorul pas, care este crearea arhivei JAR. Această arhivă trebuie să conţină clasa compilată şi fişierul manifest. Realizăm aceasta lansând în execuţie următoarea comandă:

jar cfm build\Hello.jar MANIFEST.MF -C classes .

Odată ce am creat fişierul Hello.jar, pentru această aplicaţie mai avem nevoie de un singur lucru, şi anume descriptorul aplicaţiei, cunoscut şi sub numele de fişier JAD (Java Application Descriptor). Acesta se aseamănă cu fişierul manifest, conţinând următoarele linii obligatorii:

MIDlet-Name: Hello
MIDlet-Version: 1.0
MIDlet-Vendor: Today Software Magazine
MIDlet-1: Hello,,ro.leje.Hello
MIDlet-Jar-Size: 1076
MIDlet-Jar-URL: Hello.jar
MicroEdition-Profile: MEEP-8.0

Observăm că unul dintre atributele obligatorii ale fişierului JAD este dimensiunea în bytes a arhivei. Salvăm acest fişier cu numele Hello.jad în acelaşi director cu arhiva JAR.

Rularea aplicaţiei cu un emulator

În acest moment avem o aplicaţie Java ME Embedded 8 completă, pe care o putem lansa în execuţie. Cea mai simplă modalitate pentru a face acest lucru este folosirea emulator-ului pe care ni-l pune la dispoziţie SDK-ul. Presupunând că am adăugat în PATH calea %JAVA_ME_SDK%\bin şi că directorul curent este directorul build al proiectului nostru, putem lansa următoarea comandă:

emulator -Xdevice:EmbeddedDevice1 -Xdescriptor:Hello.jad

Cu ajutorul opţiunii -Xdevice specificăm numele dispozitivului pe care dorim să rulăm aplicaţia. EmbeddedDevice1 este un dispozitiv emulat, configurat automat în momentul în care instalăm SDK-ul. Cea de-a doua opţiune prezentă în comanda pe care am executat-o este -Xdescriptor, prin intermediul căreia specificăm locaţia şi numele descriptorului aplicaţiei noastre.

Putem observa rezultatul rulării aplicaţiei în următoarea figură:

Aplicaţia Hello în emulator

Mesajul Hello MIDlet este afişat la pornirea MIDlet-ului, iar mesajul Goodbye MIDlet la oprirea acestuia, cu ajutorul combinaţiei de taste Ctrl + C.

Rularea aplicaţiei pe dispozitiv

O altă modalitate de a rula aplicaţia este prin instalarea acesteia pe dispozitivul ţintă. Pentru acest articol am folosit o plăcuţă de dezvoltare Raspberry PI Model B+, dotată cu un dongle Wi-Fi. De asemenea, menţionăm faptul că platforma are deja instalat un sistem de operare Linux, ceea ce facilitează munca noastră cu acest hardware. Având această configuraţie la îndemână putem accesa de la distanţă sistemul Raspberry PI, cu ajutorul unui program precum PuTTY.

Accesăm plăcuţa cunoscându-i IP-ul şi un user cu drepturi de root. Odată ce ne-am autentificat, schimbăm directorul curent, pentru a ne situa în directorul bin al distribuţiei Java ME Embedded 8 instalată. Acest lucru este ilustrat în următoarea captură de ecran:

Accesarea plăcuţei de dezvoltare cu PuTTY

Figura ne arată faptul că următorul pas a fost rularea script-ului usertest.sh cu ajutorul comenzii sudo ./usertest.sh. Acest script a lansat în execuţie Java runtime, care permite accesul la AMS. Platforma ascultă pe portul 2201 şi ne permite să ne conectăm de la distanţă pentru a face managementul aplicaţiilor ME.

Înainte de a putea continua, trebuie să înregistrăm dispozitivul cu ajutorul aplicaţiei Device Connections Manager. De vreme ce avem instalat SDK-ul, ar trebui să găsim în SysTray o iconiţă intitulată Oracle Java(TM) ME SDK 8.1 Device Manager. Făcând click pe aceasta, deschidem managerul de conexiuni, unde putem adăuga plăcuţa noastră, pe care o identificăm după IP. Odată ce am înregistrat dispozitivul, ar trebui să avem în fereastra activă ceva similar figurii următoare:

Înregistrarea unui dispozitiv

Acum putem instala pe Raspberry PI aplicaţia pe care am creat-o intr-o secţiune anterioară. Avem la dispoziţie câteva modalităţi pentru a face aceasta, una dintre ele fiind cu ajutorul utilitarului Device Selector, care este la dispoziţia noastră, bineînţeles, datorită faptului că am instalat SDK-ul. Deschizând această aplicaţie, observăm o listă cu toate dispozitivele instalate la momentul curent. Predefinit, avem la dispoziţie trei dispozitive emulate: EmbeddedDevice1, EmbeddedDevice2 şi QualcommIoEDevice. Alături de acestea, putem vedea plăcuţa Raspberry PI, pe care tocmai am înregistrat-o, cu numele EmbeddedExternalDevice1. Dorim să rulăm aplicaţia Hello pe acest dispozitiv, aşa că facem click-dreapta şi alegem Run JAR or JAD..., după cum este ilustrat şi în figura următoare:

Rularea aplicaţiei pe dispozitiv

Alegând de pe disk fişierul Hello.jad cu ajutorul ferestrei de tip Open care a apărut, platforma lansează în execuţie managerul de aplicaţii, care instalează pachetul nostru software pe plăcuţă, lucru pe care îl putem vedea în următoarea captură de ecran:

Managerul de aplicaţii

Faptul că aplicaţia noastră Java ME Embedded 8 rulează într-adevăr pe dispozitiv ni-l demonstrează consola PuTTY, unde putem vedea output-ul pornirii şi opririi aplicaţiei:

Output-ul aplicaţiei în consolă

Observăm faptul că în captura de ecran anterioară este listat şi mesajul care trebuie afişat la distrugerea aplicaţiei. Aceasta pentru că înainte de a face captura am apăsat butonul Remove, prezent în interfaţa aplicaţiei de management.

Aşadar, oricare ar fi modalitatea aleasă pentru a rula aplicaţii Java ME Embedded 8 fie pe dispozitive, fie într-un emulator, acesta este un proces relativ facil. Mai există o cale de a rula aplicaţii embedded pe dispozitive, cu ajutorul liniei de comandă AMS, prin intermediul utilitarului Developer Agent, însă această metodă este în fază de concept în această versiune a platformei.

Pe parcursul acestui articol am urmărit paşii creării, instalării şi rulării unei aplicaţii minimale, efectuând manual fiecare sarcină. Totuşi, platforma ne pune la dispoziţie o serie de unelte care vin în întâmpinarea nevoilor dezvoltatorilor şi ţintesc sporirea productivităţii acestora. Într-un articol viitor ne propunem să prezentăm procesul dintr-o altă perspectivă, automatizat cu ajutorul acestor unelte.

Concluzii

Dezvoltarea aplicaţiilor Java ME Embedded 8 poate fi un proces interesant şi distractiv, dar uneori dificil şi frustrant. Din păcate, materialele de studiu dedicate Java ME Embedded 8 sunt puţine. Până în momentul de faţă există o singură carte publicată care abordează subiectul dezvoltării aplicaţiilor Java ME Embedded 8. De asemenea, majoritatea articolelor existente pe această temă au o abordare generală, prezentând în linii mari trăsăturile acestei noi platforme. Deocamdată, thread-urile dedicate pe forumuri sunt relativ puţine, însă putem observa interesul din ce în ce mai mare al utilizatorilor, dornici să înveţe cum să folosească noua versiune. Cele mai consistente resurse pe care le avem la dispoziţie sunt ghidurile oficiale compilate de către Oracle, care pot fi descărcate de pe site-ul oficial al platformei.

No comments:

Post a Comment