Showing posts with label Embedded. Show all posts
Showing posts with label Embedded. Show all posts

Thursday, July 16, 2015

Aplicaţii IoT cu Java ME Embedded 8 şi Eclipse

(Publicat în revista Today Software Magazine, Numărul 37, Iulie 2015: http://www.todaysoftmag.ro/article/1538/aplicatii-iot-cu-java-me-embedded-8-si-eclipse)

Aplicaţiile Java ME Embedded 8, în forma lor cea mai simplă, sunt uşor de configurat şi gestionat, aşa cum am văzut în articolul din numărul precedent al revistei Today Software Magazine. Totuşi, în cadrul proiectelor software moderne avem nevoie de unelte care să automatizeze anumiţi paşi, să ne atenţioneze atunci când suntem pe punctul de a introduce erori de programare în codul sursă, cu alte cuvinte, să ne sporească productivitatea.

La momentul scrierii acestui material, Oracle oferă suport pentru două dintre cele mai cunoscute medii integrate de dezvoltare, Eclipse şi NetBeans. În acest articol vom discuta despre uneltele pe care le avem la dispoziţie folosind Eclipse, întrucât acest IDE se bucură de un număr mai mare de utilizatori, după cum arată unele surse. Astfel, similar articolului precedent, vom arăta care sunt pachetele software pe care trebuie să le instalăm şi cum putem crea o aplicaţie Java ME Embedded 8 cu Eclipse.

Tooling pentru aplicaţii ME cu Eclipse - Plugin-uri necesare

Pentru a putea urmări paşii prezentaţi în acest articol, avem nevoie, în primul rând, de Oracle Java ME SDK 8.1, pachet software prezentat în articolul Aplicații IoT cu Java ME Embedded 8. De aceea, încurajăm cititorii să răsfoiască numărul 36 al revistei, pentru a afla mai multe despre acest SDK. Pentru a putea beneficia de toate funcţionalităţile pe care Oracle Java ME SDK 8.1 ni le pune la dispoziţie, următorul lucru pe care trebuie să-l facem este să instalăm plugin-urile Java ME SDK Tools. În plus, Oracle ne oferă o serie de proiecte demonstrative, distribuite cu ajutorul plugin-ului Java ME SDK Demos. Aceste pachete pe care tocmai le-am amintit depind de extensia ce poartă numele Mobile Tools for Java sau, pe scurt, MTJ. În mod normal, MTJ se instalează automat împreună cu plugin-urile Java ME SDK Tools, însă în cazul în care acest lucru nu se întâmplă, putem adăuga manual această extensie distribuţiei noastre Eclipse, prin intermediul opţiunii Install New Software din cadrul meniului Help. Mai multe detalii despre instalarea acestor unelte, dar şi despre instalarea Eclipse, putem găsi în documentul Oracle Java Micro Edition Software Development Kit, Developer's Guide.

Crearea unui proiect

O dată ce au fost instalate plugin-urile Java ME SDK Tools şi extensiile MTJ, putem accesa perspectiva Java ME, care ne întâmpină cu o pagină de bun venit, ilustrată în următoarea captură de ecran:

Pagina de bun venit a perspectivei Java ME

Eclipse împreună cu MTJ ne oferă câteva şabloane, care ne ajută să creăm mai rapid proiecte Java ME şi componente ale acestora. Acest lucru este demonstrat în figura următoare:

Şabloane disponibile pentru dezvoltarea aplicaţiilor Java ME

În continuare, dorim să creăm un proiect simplu cu ajutorul noilor unelte pe care tocmai le-am instalat. Pentru aceasta, alegem opţiunea Java ME Project din fereastra de tip dialog Select a wizard. Apăsând Next, ajungem la fereastra în care ni se cere să introducem un nume pentru proiectul nostru. Pentru acest exemplu ne vom folosi de codul listat şi discutat în documentul Oracle Java ME Embedded, Developer's Guide, capitolul General Purpose Input/Output. Acest exemplu ne arată cum putem accesa pinii GPIO (General Purpose Input/Output) ai unei plăcuţe de dezvoltare. La fel ca în articolul precedent, vom folosi un dispozitiv Raspberry PI Model B+.

Revenind la paşii pe care trebuie să-i urmăm pentru a crea un astfel de proiect cu Eclipse şi MTJ, introducem în câmpul Project name numele LEDSwitcher, întrucât dorim să realizăm o aplicaţie care să deschidă şi să închidă un LED (Light-emitting diode), o dată la câteva secunde. Aceeaşi fereastră ne permite să dăm un alt nume fişierului JAD (Java Application Descriptor) şi să facem alte configurări legate de proiectul Eclipse. O dată ce am dat un nume proiectului nostru, mediul de dezvoltare ne avertizează că trebuie să alegem cel puţin o configuraţie pe care va fi rulată aplicaţia. Astfel, apăsăm butonul Add... din partea mediană a ferestrei şi ni se prezintă un alt dialog, cu titlul Add Configuration. Din meniul drop-down SDK alegem Oracle Java(TM) Platform Micro Edition SDK 8.1, iar Eclipse completează automat câmpurile Configuration Name şi Device cu valoarea EmbeddedDevice1. Apăsăm butonul Finish pentru a reveni la dialogul anterior. În acest moment putem apăsa Finish în dialogul New Java ME Project deoarece vom accepta valorile prestabilite propuse de IDE.

Imediat ce proiectul a fost creat, Eclipse deschide un editor, care ne permite să edităm proprietăţi ce ţin de Application Descriptor, dar şi să facem alte configurări. Vedem acest editor ilustrat în figura următoare:

Privire de ansamblu asupra configuraţiei proiectului

Accesarea pinilor GPIO

Este timpul să prezentăm codul sursă care accesează pinii GPIO şi, pentru aceasta, creăm o clasă LEDSwitcher, care extinde clasa abstractă javax.microedition.midlet.MIDlet. În cele ce urmează, prezentăm codul sursă al acestei clase, iar apoi vom analiza câteva aspecte importante:

package ro.leje;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.microedition.midlet.MIDlet;
import jdk.dio.DeviceManager;
import jdk.dio.gpio.GPIOPin;

public class LEDSwitcher extends MIDlet {

    private static final int PIN_NUMBER = 7;
    private static final int SLEEP_TIME_MILLIS = 2000;

    private GPIOPin pin;

    public void startApp() {
        try {
            pin = DeviceManager.open(PIN_NUMBER);
            Thread.sleep(SLEEP_TIME_MILLIS);
            for (int i = 0; i < 20; i++) {
                System.out.println("Setting pin to true");
                pin.setValue(true);
                Thread.sleep(SLEEP_TIME_MILLIS);
                System.out.println("Setting pin to false");
                pin.setValue(false);
                Thread.sleep(SLEEP_TIME_MILLIS);
            }
        } catch (IOException e) {
            Logger.getLogger(LEDSwitcher.class.getName()).
                log(Level.SEVERE, null, e);
        } catch (InterruptedException e) {
            Logger.getLogger(LEDSwitcher.class.getName()).
                log(Level.SEVERE, null, e);
        }
    }

    public void destroyApp(boolean unconditional) {
        try {
            if (pin != null) {
                pin.close();
            }
        } catch (IOException e) {
            Logger.getLogger(LEDSwitcher.class.getName()).
                log(Level.SEVERE, null, e);
        }
    }
}

Cu ajutorul clasei DeviceManager, care oferă servicii de gestionare a dispozitivelor de tip Device, deschidem pinul GPIO cu numărul 7 al plăcuţei noastre Raspberry PI. Acesta este referit prin variabila pin de tip GPIOPin, căreia putem să-i setăm valoarea ca true sau false, reprezentând stările de high şi low. În metoda startApp() alternăm aceste stări de douăzeci de ori, făcând pauză de două secunde la fiecare iteraţie. În cadrul metodei destroyApp() eliberăm resursele folosite, respectiv închidem dispozitivul ce reprezintă pinul GPIO.

Dorim acum să testăm aplicaţia LEDSwitcher dar, pentru a face lucrurile mai interesante, vom încerca să o instalăm pe dispozitivul Raspberry PI. Aşa cum am văzut în articolul la care am făcut referire mai sus, trebuie să lansăm în execuţie mediul Java ME, şi putem face acest lucru conectându-ne la plăcuţă prin SSH. O dată ce am făcut acest lucru rulând scriptul usertest.sh, înregistrăm dispozitivul cu ajutorul utilitarului Device Manager pe care ni-l pune la dispoziţie SDK-ul. Faptul că RPi este înregistrat se reflectă şi în view-ul Device Selector pe care perspectiva Java ME l-a deschis automat:

*View*-ul *Device Selector*

Acum putem apăsa click-dreapta pe elementul ce reprezintă plăcuţa RPi, şi să alegem din meniul de context Run Project şi apoi numele proiectului nostru. Platforma deschide aplicaţia Java ME Embedded Emulator şi instalează aplicaţia, încercând să o pornească. În acest moment observăm că aplicaţia emulator afişează o fereastră pop-up, care ne avertizează că lansarea aplicaţiei a eşuat. Pentru a afla cauza, putem fie să analizăm view-ul Console din IDE, fie terminalul PuTTY. Amândouă ne arată că s-a aruncat o excepţie java.security.AccessControlException atunci când am încercat să deschidem dispozitivul de tip GPIOPin. De asemenea, log-ul ne oferă o informaţie importantă, prin mesajul

[CRITICAL] [SECURITY] iso=2:Permission check failed: jdk.dio.DeviceMgmtPermission "GPIO7:7" "open"

În primul articol din această serie am amintit faptul că securitatea este unul dintre cele mai importante aspecte ale creării aplicaţiilor IoT. Java ME Embedded 8 ia în serios acest lucru şi implementează mecanisme moderne pentru a asigura un nivel de securitate ridicat. Astfel, pentru a accesa pinul plăcuţei trebuie să permitem acest lucru setând permisiunea jdk.dio.DeviceMgmtPermission pentru dispozitivul GPIO7:7, cu acţiunea open.

Eclipse ne pune la dispoziţie tab-ul Security al editorului despre care am amintit mai devreme unde, în cadrul secţiunii Required Permissions, putem adăuga permisiuni, apăsând butonul Add.... Acest pas este ilustrat în următoarea captură de ecran:

Adăugarea unei permisiuni

Salvăm modificările, care se reflectă în descriptorul aplicaţiei, LEDSwitcher.jad, şi lansăm aplicaţia în execuţie, folosind acelaşi mecanism. De data aceasta, observăm că aplicaţia rulează fără probleme:

Mesajele scrise de aplicaţie în consolă

Dacă realizăm montajul folosind un LED, o rezistenţă, un breadboard şi doi conectori, obţinem configuraţia prezentată în imaginea de mai jos. Vedem, de asemenea, că LED-ul s-a aprins atunci când valoarea pinului a fost setată la true.

Montajul folosind plăcuţa *Raspberry PI*

Debugging cu Eclipse

Una dintre cele mai importante activităţi implicate în dezvoltarea produselor software este cea de debugging. Cu siguranţă fiecare inginer software care foloseşte mediul de dezvoltare Eclipse a intrat în contact cu uneltele de debugging consacrate pe care acesta ni le pune la dispoziţie.

Şi în cazul aplicaţiilor Java ME Embedded 8 putem folosi perspectiva Debug, împreună cu toate view-urile cunoscute. Este interesant faptul că putem face debugging chiar şi atunci când rulăm aplicaţia pe dispozitivul real, nu suntem obligaţi să o instalăm pe un dispozitiv emulat. Folosind fereastra de tip dialog Debug Configurations putem seta diverşi parametri, cum ar fi dispozitivul pe care dorim să rulăm aplicaţia, care este MIDlet-ul ce trebuie executat etc. Stabilind breakpoint-uri în codul sursă şi lansând aplicaţia în modul debug, execuţia se va opri la liniile pe care dorim să le investigăm.

Concluzii

Dezvoltarea aplicaţiilor IoT utilizând platforma Java ME Embedded 8 este alcătuită dintr-un complex de activităţi care aparţin mai multor discipline, printre care se numără ingineria software, bineînţeles, dar şi electronica. Realizând care este complexitatea unei astfel de configuraţii, care implică hardware diferit de maşina pe care se face dezvoltarea, putem să ne dăm seama de beneficiile multiple pe care le aduce o platformă cum este SDK-ul, dar şi uneltele de dezvoltare precum Eclipse sau NetBeans.

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.

Tuesday, January 20, 2015

Internet of Things în universul Java

(Publicat în revista Today Software Magazine, Numărul 31, Ianuarie 2015: http://www.todaysoftmag.ro/article/1244/internet-of-things-in-universul-java)

Experții din domeniul IT au numit 2014 "anul Internet of Things ", acesta fiind unul dintre cele mai fierbinți subiecte ale anului care tocmai s-a încheiat. Titlul atribuit nu este deloc surprinzător dacă luăm în considerare faptul că site-uri importante precum dzone.comjaxenter.com sau oracle.com au publicat câteva articole pe săptămână despre tehnologiile din sfera Internet of Things, iar blogger-ii nu au scăpat nicio ocazie să posteze despre ultimele lor proiecte IoT. Nici editurile nu au fost mai prejos, în 2014 fiind publicate zeci de titluri, multe altele așteptând să vadă lumina tiparului anul acesta.
Toate acestea s-au întâmplat în contextul lansării unei multitudini de noi gadgeturi sau dispozitive inteligente, dar și a numeroase platforme software sau implementări ale unor protocoale mai mult sau mai puțin cunoscute. Mulți împătimiți ai tehnologiei au auzit de produse populare, lansate în ultimii ani, precum Philips Hue sau Nest, însă începând cu 2014 e nevoie de un efort activ să putem ține pasul cu frecvența apariției de noi dispozitive, cum ar fi Sen.se Mother, Fitbit Charge sau SkyBell. IoT influențează din ce în ce mai mult domeniile din viața de zi cu zi, precum sănătatea cu dispozitive care monitorizează pacienții, îngrijire la domiciliu, prin gadgeturi pentru un stil de viață sănătos, transporturi, cu autovehicule conectate, automatizarea locuințelor, industrie etc. .
Înainte de a discuta despre modalitățile prin care comunitatea Java își poate face auzită vocea în sfera Internet of Things, suntem datori să descriem pe scurt ce înseamnă mai exact IoT.

Definiții

Internet of Things sau, pe scurt, IoT este un concept dezbătut din ce în ce mai mult în ultimii ani, dar semnificația sintagmei nu este întotdeauna pe deplin înțeleasă. CASAGRAS (Coordination and support action for global RFID-related activities and standardisation) ne dă o definiție destul de abstractă, care spune despre IoT următoarele: este "o infrastructură de rețea globală, care conectează obiectele fizice și virtuale prin intermediul exploatării capturii de date și a capacității de comunicare. Această infrastructură include dezvoltările existente și viitoare ale rețelelor și ale Internet-ului. Aceasta va pune la dispoziție modalități de identificare a obiectelor, senzori și capacitatea de conectare ca bază pentru dezvoltarea de servicii sau aplicații independente și cooperante. Acestea vor fi caracterizate printr-un grad înalt de autonomie pentru captura de date, transferul evenimentelor, conectivitatea în rețea și interoperabilitate" [1].
Definiția oferită de Stephen Haller de la SAP Research ne ajută să ne creăm o imagine mai concretă asupra Internet of Things, despre care spune că este "o lume unde obiectele fizice sunt integrate omogen în rețeaua informațională și unde aceste obiecte fizice pot deveni participanți activi în procesele business. Serviciile sunt gata să interacționeze cu aceste obiecte inteligente prin intermediul Internet-ului, să interogheze și să-și schimbe starea și orice informație asociată cu ele, luând în considerare securitatea și chestiunile ce țin de intimitate"[2].
O altă explicație este dată de Oracle, care afirmă că "Internet of Things se referă la colectarea și gestionarea cantităților masive de date provenite de la rețelele - aflate într-o rapidă expansiune - de dispozitive și senzori, procesarea acestor date și apoi partajarea lor cu alte obiecte conectate"[3]. Pentru a ne da seama care este ordinul de mărime al acestor cantități de date, ne putem uita la exemplul echipei de navigație Oracle Team USA, care lucrează cu ambarcațiuni echipate fiecare cu câte 300 de senzori, meniți să furnizeze informații despre o mulțime de parametri, cum ar fi eficacitatea reglajelor pânzelor, tăria și stabilitatea carenei sau tensiunea din catarg. Acești senzori măsoară 3000 de variabile de 10 ori pe secundă, producând 500 GB de date neprelucrate pe zi. Un alt aspect interesant este faptul că în prezent doar 11% din volumul total de date este generat de dispozitive, dar IDC estimează că până în 2020 procentul va crește la 40%[4].
Acest titlu descriptiv, care încearcă să surprindă esența următorului mare trend în IT, reprezintă în principiu efortul de a regândi relația noastră cu obiectele pe care le folosim în fiecare zi, dar și a obiectelor între ele. Conform experților, IT-ul se va îndrepta puternic în această direcție. Ca dovadă, mai multe nume sonore ale tehnologiei secolului al XXI-lea, precum Cisco sau Bosch, au întreprins studii pe această temă, ajungând la concluzia că proiectele din sfera IoT vor depăși valoarea economică de 15 trilioane de dolari, până în 2020[5]. De asemenea, analiștii de la Cisco afirmă că în 2010 existau peste 12.5 miliarde de obiecte conectate la Internet și estimează că vor exista aproximativ 25 miliarde de "lucruri" inteligente, conectate la Internet, până la finalul anului 2015. Pentru anul 2020, previziunea lor este de 50 de miliarde de "lucruri"[6].

Oracle și Java Embedded

În acest context intră în scenă Java, atât ca platformă ce are la bază Java Virtual Machine, cât și ca limbaj de programare, cu o comunitate de peste 9 milioane de utilizatori. Facem această distincție între platformă și limbaj[7] întrucât un dispozitiv care rulează JVM nu este limitat la execuția de aplicații Java; acestea pot fi, în anumite condiții, aplicații scrise cu ajutorul Scala, Clojure etc. . În trecut, programarea dispozitivelor embedded se făcea preponderent în limbaje de nivel scăzut, precum C sau limbaj de asamblare.
În acest articol vom încerca să ne facem o părere despre soluțiile propuse de Oracle pentru IoT, companie a cărei implementare a platformei Java se bucură de cea mai mare popularitate printre programatori. Totuși, în articolele viitoare vom privi mai îndeaproape și caracteristicile altor proiecte Java pentru IoT, cum ar fi cele din stiva dezvoltată de Eclipse Foundation.
În ultimii ani, Oracle a investit masiv într-o linie de produse denumite sugestiv Java Embedded, lucru ce oferă posibilitatea programatorilor Java să scrie aplicații pentru astfel de dispozitive, de la smart card-uri și module wireless, până la single board computer-e (SBC), cum ar fi Raspberry PI. Platformele Java Embedded sunt principalul lucru pe care Oracle îl oferă dezvoltatorilor embedded și prin intermediul căruia contribuie la influența pe care o are Java în sfera Internet of Things.
Viziunea Oracle pentru Java 8 a fost să lanseze, pe lângă Standard Edition (SE), încă două variante importante ale platformei, mai exact Oracle Java ME Embedded 8 și Oracle Java SE Embedded 8, la care se adaugă Java Embedded Suite. Henrik Ståhl, vicepreședinte peste product management pentru Java și IoT la Oracle, afirmă în ediția noiembrie/decembrie 2014 a revistei Oracle Java Magazine că, prin lansarea acestor variante ale platformei au "făcut disponibile pe platforme embedded, care au doar câteva sute de KB de memorie, feature-urile cu care programatorii sunt obișnuiți în Java SE"[8].


Fig. 1 Privire de ansamblu asupra platformei Oracle Java ME Embedded 8[9]

Prin lansarea noii versiuni a distribuțiilor amintite mai sus, Oracle a încercat să le aducă la un grad cât mai înalt de compatibilitate una cu cealaltă și, în același timp, să le alinieze la Java SE 8. Pentru aceasta, s-a introdus conceptul de Compact Profiles, dezvoltatorii putând alege între setul complet de API-uri Java SE și alte trei subseturi care au la dispoziție doar acele API-uri care sunt necesare pentru use case-urile relevante. Un astfel de use case poate fi rularea unei stive OSGi (Open Service Gateway initiative). Așa cum vom vedea într-un articol viitor, OSGi joacă un rol important în cadrul eforturilor făcute de Eclipse Foundation pentru implementarea unei stive complete IoT, numită Open IoT Stack for Java.
Începând cu Java 8, versiune lansată în prima parte a anului 2014, am văzut că Oracle face eforturi considerabile pentru a aduce la zi varianta Micro Edition (ME) a platformei, lucru ce confirmă implicarea corporației în războiul soluțiilor IoT. Printre îmbunătățirile aduse platformei se numără eficientizarea procesului dedeployment pe dispozitive de dimensiuni mici, cum ar fi senzorii inteligenți saugateway-urile embedded. De asemenea, API-urile au fost actualizate pentru a răspunde nevoilor de programare a dispozitivelor țintă. Prin această nouă versiune Java ME, platforma are mult mai multe lucruri în comun cu Java SE, însă funcționalități precum reflection sau expresiile lambda urmează să fie adăugate. Acest aspect este important, întrucât în felul acesta, orice programator Java se va putea implica în proiecte embedded într-un timp scurt, fără a face eforturi considerabile. În 2015, Henrik Ståhl anunță că unii producători de hardwareplănuiesc să integreze Java ME în dispozitivele lor, ceea ce va conduce la o mai mare rată de adopție a platformei.
Componentele construite cu soluțiile embedded despre care discutăm, livrate într-un context IoT, dau acces aplicațiilor business la resursele instalate în mediul înconjurător, atât pentru a primi input de la acestea cât și pentru a lansa comenzi. Un astfel de use case este orchestrarea sistemelor eterogene de control a temperaturii și a iluminării într-o clădire. Observăm că abilitatea Java ME de a controla echipamente cum ar fi senzori, valve sau servo-motoare, reprezintă unul dintre aspectele fundamentale ale obținerii unei infrastructuri IoT.
Privind lucrurile de la o oarecare distanță, putem observa că arhitectura Java ne permite să creăm aplicații pe verticală, după cum a arătat și Maulin Patel, liderul în soluții de procesare embedded de la Freescale[8]. Întâi colectăm datele de la obiectele inteligente cu Java ME, apoi trecem la Java SE pentru servicii de gateway, iar în final executăm gestiunea și procesarea datelor cu Java EE, în cloud.
Aproape de fiecare dată când se vorbește despre IoT, se aduce în discuție problema securității. Într-un mediu eterogen și deschis precum este o infrastructură Internet of Things, securitatea este esențială, dar greu de obținut. Este de ajuns ca un atacator să aibă acces la una dintre componentele soluției IoT pentru a fi capabil să exploateze posibilele breșe în sistemul defensiv al acesteia. Spre exemplu, în cazul contoarelor inteligente de utilități, cel mai interesat de compromiterea acestor unități poate fi chiar proprietarul locuinței în care au fost instalate. Astfel, potențialul atacator are chiar și acces fizic la echipament, lucru ce ridică întrebări cu privire la nivelele la care trebuie implementate mecanisme de securitate. Acum că am remarcat seriozitatea acestei chestiuni, putem veni cu o veste bună pentru dezvoltatorii IoT din universul Java, întrucât această platformă asigură securitatea datelor pe întreaga verticalitate a sistemului implementat. Securitatea este o caracteristică înglobată în arhitectura platformei, fiind dezvoltată și actualizată constant, cu fiecare nouă versiune. Vom reveni cu detalii referitoare la securitatea oferită de Java ME 8 într-unul dintre paragrafele următoare, când vom discuta câteva caracteristici tehnice ale platformei.

Java ME Embedded 8

Platforma dedicată dispozitivelor cu cele mai puține resurse, cum ar fi cardurile, se numește sugestiv, Java Card. Totuși, primul produs din familia Oracle care aduce cu adevărat o contribuție importantă în spațiul IoT este Java ME Embedded 8. Prin urmare, în continuare ne vom concentra atenția asupra acestuia. Înainte de a ne uita la câteva detalii, trebuie să menționăm Java ME Embedded constă din două versiuni: Java ME Embedded și Java ME Embedded Client.
Java ME Embedded 8 este o platformă ce poate fi folosită de către dispozitive care au mai puțin de 1 MB de memorie. Astfel, este potrivită pentru "obiecte inteligente" fără interfață grafică, care au timp îndelungat de funcționare și resurse limitate.
Așa cum putem vedea în Figura 1, la baza Java ME Embedded 8 stă mașina virtuală, pe care o găsim sub denumirea Connected Limited Device Configuration sau, pe scurt, CLDC 8. Această componentă reprezintă un sub-set al Java SE 8, dedicat dispozitivelor embedded. După cum am menționat mai sus, o dată cu versiunea 8, CLDC reprezintă un prim pas spre o mai bună aliniere cu Java Standard Edition și totodată un important salt de la CLDC 1.1.1. Așadar, avem la dispoziție adnotații,generics și multe alte caracteristici Java, familiare tuturor dezvoltatorilor. Deși s-a realizat o evoluție foarte importantă prin lansarea CLDC 8, s-a reușit menținerea compatibilității binarelor cu versiunea anterioară.
Deasupra fundației pe care o reprezintă CLDC 8 stau mai multe componente definitorii pentru platformă. Una dintre ele este Generic Connection Framework 8(GCF 8). Așa cum se poate intui, această componentă gestionează problemele de conectivitate. Acest framework este necesar întrucât în spațiul embeddedposibilitățile de conectare sunt multiple, iar dispozitivele pe care rulează aplicația noastră au interfețe variate de comunicare cu lumea exterioară. Unele pot avea capacitate de conectare prin Wi-Fi, altele de tip cellular, Bluetooth sau prin cablu. De asemenea, pentru un control optimizat al conectivității GCF 8 expune AccessPoint API. Totodată, GCF 8 vine cu suport pentru IPv6, scăpând dezvoltatorii Java ME Embedded 8 de emoțiile epuizării adreselor IPv4.
Revenind la subiectul securității în lumea Internet of Things, putem da câteva detalii despre modul în care GCF 8 rezolvă această problemă. Java ME Embedded 8 vine echipat cu implementări ale celor mai noi standarde în materie de securitate, printre care se numără Transport Layer Security 1.2 și Datagram Transport Layer Security 1.2. Astfel, Oracle îi asigură pe utilizatorii platformei de faptul că aceasta oferă "cele mai înalte nivele de criptare la nivel de rețea și autentificare" [9].
Un alt bloc constructiv al Java ME 8 este Micro Edition Embedded Profile 8 (MEEP 8). Această componentă este responsabilă cu definirea modelului, a containerului în care rulează aplicația, în general cu ciclul de viață al acesteia. Prin intermediul MEEP 8 putem partaja cod între aplicații, putem actualiza componente în sistem sau aplica patch-uri aplicației. Partajarea bibliotecilor - denumite sugestiv, LIBlets - se face tot prin intermediul MEEP 8, contribuind la minimizarea necesarului de memorie și la modularizarea aplicațiilor. În plus, MEEP 8 oferă aplicațiilor posibilitatea de a comunica între ele atât sincron (Inter-MIDlet Communication sau IMC), cât și asincron, printr-un sistem de mesagerie bazat pe evenimente.
Securitatea este un subiect important și pentru MEEP 8, deoarece se pot defini politici de securitate pentru autentificare și autorizare, în funcție de situația specifică. Astfel, încărcarea codului și execuția lui se realizează într-un mediu securizat, întrucât fiecare componentă este asociată unui client, având permisiuni specifice. Acestea trebuie verificate la fiecare încercare de acces.
O componentă de o importanță crucială pentru Java ME Embedded 8 este Device Access API, care oferă aplicațiilor acces la dispozitive periferice, cum ar fi senzori, comutatoare sau LED-uri. Această componentă exista și în versiunile anterioare, însă acum vine cu funcționalități noi, printre care late binding, care permite adăugarea de noi periferice, fără a fi necesară modificarea API-ului.
Alături de aceste blocuri constructive, Java ME Embedded 8 vine cu o multitudine de API-uri, precum cel pentru servicii web sau localizare.
Având toate aceste componente Java ME Embedded la dispoziție, este la îndemâna noastră, a dezvoltatorilor, să construim aplicații embedded, contribuind la spațiulInternet of Things.
În ajutorul nostru vine Java ME SDK 8, un toolkit complet creat pentru a întâmpina orice nevoie avem în procesul creării și întreținerii unei aplicații. Acest SDK oferă inclusiv un mediu de emulare, având posibilitatea să ne testăm aplicațiile chiar dacă dispozitivele pe care vor fi distribuite nu sunt disponibile în timpul dezvoltării. De asemenea, putem face debugging atât în modul de emulare, cât și atunci când aplicația rulează pe dispozitiv. Pentru a întregi acest set de unelte, Oracle oferă plugin-uri pentru Netbeans IDE și Eclipse IDE, care încorporează toate funcționalitățile SDK-ului. Vom discuta mai multe detalii și vom exemplifica modul de utilizare al Java ME SDK 8 într-unul dintre articolele viitoare.
Java ME Embedded Client este o implementare CDC (Connected Device Configuration) care, în principiu, este configurația destinată dispozitivelor mobile cu ceva mai multe resurse, cum ar fi smartphone-urile. Pentru Java ME Embedded Client, această configurație a fost restrânsă și optimizată, pentru a se potrivi sistemelor embedded de categorie joasă înspre medie. Deși amprenta acestei configurații este redusă, oferă mare parte din limbajul Java. Astfel, Java ME Embedded Client este destinată obiectelor inteligente cu mai puțin de 10 MB de memorie și fără interfață grafică.

Concluzii

Industria IT autohtonă nu este străină de spațiul Internet of Things, începând să fie lansate produse Made in Romania, precum Pocketo sau Tintag. De asemenea, există companii în România, implicate în proiecte care se integrează în paradigma IoT. De exemplu, regăsim astfel de proiecte la Brașov în domeniul automotive, cu al său concept de connected car . Un alt lucru îmbucurător este faptul că au început să se organizeze evenimente despre IoT, unul dintre acestea fiind ALT Festival, care a avut loc în noiembrie 2014, la Brașov.
Un obiectiv important pentru Oracle în ultima perioadă este afirmarea platformei Java în lupta care se dă între soluțiile IoT. Mai mult decât atât, corporația și-a exprimat dorința de a câștiga această bătălie, astfel încât Java să devină alegerea majorității specialiștilor implicați în astfel de proiecte. Totuși, răspunsul a venit rapid din partea oponenților, existând multe voci care și-au exprimat scepticismul cu privire la potrivirea platformei în sfera IoT. Există multe argumente, atât pro, cât și contra acestei idei, însă un lucru e cert: Java a străbătut un drum lung pentru a ajunge la gradul actual de maturitate, diversitate și aplicabilitate. Eforturile din ultimii ani au dat naștere unei noi familii de produse, care se dovedesc promițătoare și, mai mult, încep să-și dovedească valoarea în cadrul proiectelor reale IoT. Vom vedea clar acest lucru în articolul viitor, când vom atinge, prin exemple concrete, partea practică a platformei Java ME Embedded 8.

Resurse

[1] CASAGRAS, RFID and the Inclusive Model for the Internet of Things
[2] Stephen Haller, Internet of Things: An Integral Part of the Future Internet, SAP Research, 2009
[3] "The Internet of Things: Manage the Complexity, Seize the Opportunity", Oracle Corporation, 2014
[4] IDC Digital Universe Study, sponsored by EMC, December 2012
[5] Dzone Research, 2014 Guide to Internet of Things
[7] Benjamin Evans, Martijn Verburg, The Well-Grounded Java Developer, Manning, 2013
[8] "Java Development for the Internet of Things", Oracle Java Magazine, November/December 2014 Issue