de Cătălin Horghidan, Software Developer CodeWarrior Debugger Tools
Freescale Semiconductor România
Partea a doua
Java Micro Edition
Înainte de a prezenta suportul software, este important să explicăm unele concepte Java ME. Această versiune de Java se adresează platformelor hardware cu resurse limitate. Întrucât aceste platforme pot avea resurse hardware foarte diferite, s-a trecut la gruparea acestora pe baza unor specificații. De aceea, din perspectiva Java ME, pentru o platformă hardware este important de cunoscut configurația și profilul suportat.
O configurație pentru un grup de platforme hardware este descrisă de un set de biblioteci de bază (sau API-uri de bază) și un set minimal de caracteristici pentru mașina virtuală. De exemplu, configurația CLDC (Connected Limited Device Configuration) se aplică dispozitivelor cu resurse restrânse, iar CDC (Connected Device Configuration) unor platforme mai puternice. Un profil reprezintă un set de API-uri pentru un grup de dispozitive și folosește capabilitățile unei configurații. Opțional, o platformă hardware mai poate avea și un set propriu de biblioteci ce expun periferice precum Bluetooth, Wi-Fi sau module criptografice. FRDM-K64F este suportată de Java Micro Edition începând cu versiunea 8.1, iar la începutul acestei toamne a fost lansată și versiunea 8.2. Aceasta aduce multiple îmbunătățiri mașinii virtuale, cum ar fi extinderea memoriei Heap de la 60KB la aproximativ 150KB – vezi figura 3. Mașina virtuală ce rulează pe FRDM-K64F este o implementare de Oracle HotSpot bazată pe configurația CLDC 8. Această configurație reprezintă un subset al Java SE 8 la nivel de limbaj, API și mașina virtuală – [25]. Acest lucru înseamnă că începând cu Java ME 8 putem, de exemplu, declara tipuri generice sau folosi colecții de date (Collections) din Java SE.
Mașina virtuală este construită peste sistemul de operare mbed OS și ocupă aproximativ 900KB din cei 1MB disponibili intern pe microcontroler. Din această cauză, aplicațiile Java ME sunt salvate pe cardul SD. Mașina virtuală pentru FRDM-K64F se instalează fie manual (ca orice aplicație mbed prin simpla copiere a binarului pe discul MSD), fie prin intermediul utilitarului Device Connection Manager, instalat odată cu Java ME SDK 8.x – [23].
Profilul actual suportat este MEEP 8 (minimal) la care se adaugă următoarele extensii: Device I/O API, System Configuration API și Generic Connection Framework (prin pachetul javax.microedition.io) – [24]. Device I/O API înseamnă accesul la următoarele periferice și porturi: GPIO, UART, I2C, DAC/ADC, SPI, contorul de pulsuri, PWM și unele resurse de pe placă (LED-uri și senzori – accelerometru și magnetometru). Generic Connection Framework permite crearea unei conexiuni folosind următoarele protocoale: HTTP, HTTPS, Socket, SecureSocket și TLSv1.1. Pentru o conexiune SSL sau HTTPS este necesară generarea unor certificate digitale și importarea lor pe cardul SD (mai precis in <sd>java_main.ks, ‘ks’ vine de la keystore). Pentru importare, pachetul Java ME al FRDM-K64F conține un utilitar numit ‘MEKeyTool.jar’.
Menționăm ca pentru obținerea unui certificat digital “auto-semnat” se poate folosi utilitarul ‘keytool’ din JDK sau Openssl.
Pentru a încărca o aplicație Java ME (sau MIDlet) trebuie făcută în prealabil o parte de configurare pentru a înregistra placa la un manager de conexiuni – figura 2. Înregistrarea se poate face fie prin portul serial mbed (SDAUSB) fie prin TCP.
Implicit, mașina virtuală (mbed) folosește DHCP pentru a obține un IP – detaliile legate de rețea sunt trimise imediat după reset pe portul serial mbed. Odată înregistrat, dispozitivul apare în lista din fereastra Device Selector a managerului de dispozitive. Acesta reprezintă un agent instalat împreună cu Java ME SDK ce monitorizează conexiunea cu dispozitivele externe și gestionează încărcarea aplicațiilor pe acestea.
Odată înregistrat, avem la dispoziție trei opțiuni de încărcare a unei aplicații pe dispozitiv: printr-un utilitar din linia de comandă, folosind fereastra Device Selector (meniul contextual conține opțiune Run JAR or JAD…) sau un IDE dacă vrem să compilăm aplicația – [23]. Java ME 8 se integrează ușor cu Eclipse și NetBeans™. Modulul de instalare Java ME pentru cele două medii integrate de dezvoltare se poate descărca de pe pagina SDK-ului – [26]. După instalare, mediul de dezvoltare va conține o fereastră asemănătoare cu Device Selector. După lansarea comenzii, managerul de dispozitive va încărca fereastra utilitarului pentru instalarea și gestionarea aplicației pe dispozitiv – figura 3. Pe lângă funcțiile de management a aplicației, mai este afișată în timp real memoria Heap liberă pentru aplicație.
Trebuie menționat că versiunea actuală de JVM nu permite depanarea aplicațiilor întrucât nu conține un debugger de Java. Execuția aplicațiilor poate fi urmărită doar prin intermediul mesajelor de trasare trimise la ieșirea standard.
Mașina virtuală are grijă să transmită aceste mesaje fie pe portul serial mbed fie managerului de dispozitive – figura 3.
Microsoft Azure for IoT
Placa de dezvoltare FRDM-K64F este mai nou certificată pentru conectarea la platforma de cloud computing Microsoft Azure – [31]. Nu vom insista cu detalii despre ce înseamnă Microsoft Azure însă trebuie spus că este o platformă integrată de servicii în cloud ce oferă infrastructura necesară pentru aplicațiile Web, Enterprise și mai nou Internet of Things. Ca idee generală, serviciul IoT din Microsoft Azure funcționează astfel: datele brute din rețeaua locală de noduri sunt transmite prin intermediul gateway-ului unui serviciu Azure IoT Hub apoi la acest concentrator se leagă mai multe servicii de procesare, analiza și stocarea de date din cadrul platformei. Practic, întreaga aplicație Web, mobile sau Enterprise care controlează și monitorizează datele venite de la noduri poate fi instalată în cloud. Securitatea comunicației cu gateway-urile (un Azure IoT Hub poate deservi mai multe gateway-uri) se realizează folosind protocoalele HTTPS și AMQP (Advanced Message Queuing Protocol).
Conform proiectului azure-iot-sdks de pe platforma Github [27], dezvoltarea de aplicații client pentru Azure IoT Hub se poate realiza folosind .NET Framework, Java, Node.js și C. În cadrul ultimei opțiuni intră și suportul pentru FRDM-K64F – vezi [29]. Acest suport are la bază tot mbed OS, iar componentele software (bibliotecile software Azure IoT și exemplele de clienți Azure IoT) sunt disponibile online – vezi [30].
Întrucât ni s-a părut foarte interesantă experiența avută cu Azure IoT vom detalia pașii prin care o placă FRDM-K64F ajunge să trimită date în cloud. Pentru o înțelegere mai clară asupra infrastructurii se poate urmări figura 4.
Primul pas îl reprezintă crearea unui Azure IoT Hub. Aici trebuie menționat că pentru evaluarea serviciului se poate crea o subscripție gratuită limitată la 3000 de mesaje și 10 clienți IoT pentru un Azure IoT Hub.
Următorul pas este înregistrarea FRDM-K64F la Device Explorer. Există două variante prin care se poate realiza acest lucru: folosind utilitarul Device Explorer (doar pentru Windows) sau utilitarul din linia de comanda oferit de Node.js™ (suportă mai multe sisteme de operare). Important în acest pas este generarea unei comenzi de conectare folosită de către aplicația de pe FRDM-K64F să comunice (în siguranță) cu un Azure IoT Hub. Pentru acest lucru este necesară comanda de conectare la Azure Iot Hub (obținută din pagina Web și conține o cheie criptografică partajată). După conectarea utilitarului la IoT Hub se poate genera comanda de conectare a aplicației client de pe FRDM-K64F. Următorul pas este compilarea aplicației client. Pentru FRDM-K64F, câteva exemple de clienți se găsesc pe platforma mbed – [30]. Înainte de compilare, codul sursă trebuie actualizat astfel încât să conțină comanda de conectare la Azure IoT Hub generată la pasul anterior. Pentru a investiga eventualele probleme de conectare la Azure IoT Hub (folosește SSL), se pot verifica mesajele de trasare trimise pe portul serial mbed. Odată transmise, mesajele vor apărea și în pagina Web a portalului Microsoft Azure. Un exemplu de aplicație ce consumă datele venite la un Iot Hub se poate găsi aici: [28].
Concluzii
Așa cum am văzut, se bucură de un suport software excelent din partea Freescale și a comunităților ARM mbed, Java ME sau mai nou Microsoft Azure. După cum menționam şi în introducere, FRDM-K64F este singura placă de dezvoltare cu nucleu ARM Cortex-M4 oferită drept exemplu de client capabilă să comunice în mod securizat cu infrastructura Microsoft Azure IoT. De asemenea, se află într-un grup restrâns de platforme hardware suportate de Java Micro Edition 8. Suportul avansat oferit de Java ME 8 precum și noutățile prezente în Java ME 8 (un subset al Java SE 8) permit dezvoltarea mai rapidă a aplicațiilor IoT.
Putem concluziona că FRDM K64F este o platformă ideală pentru evaluare și proiectare a aplicațiilor Internet of Things.
Teste
În completarea acestui articol prezentăm o serie de teste efectuate pentru a observa viteza de transfer a datelor în rețea suportate de FRDM-K64F. Acestea nu reprezintă teste oficiale de performanță și trebuie considerate din perspectiva unui dispozitiv cu resurse limitate. Menționăm că placa de dezvoltare dispune de un microcontroler Freescale Kinetis cu nucleu ARM Cortex-M4 la 120MHz și Floating Point Unit, memorie Flash de 1MB și 256KB de SRAM. Acesta mai deține o unitate de accelerare criptografică mmCAU (memory mapped cryptographic acceleration unit) și un modul 10/100 Ethernet MAC. Modulul mmCAU suportă accelerarea următorilor algoritmi criptografici: DES, 3DES, AES, MD5, SHA-1 și SHA-256. Unele teste au ca referință un sistem embedded mai puternic. Acesta este un Wanboard Solo cu procesor de aplicații i.MX6 SoloLite la 800Mhz și 512MB ce rulează un Linux® Ubuntu 14.04 LTS.
1. TCPEchoServer. O aplicație mbed ce implementează un server TCP care reflectă înapoi mesajul
trimis de client. Acest test verifică viteza brută de transfer pentru mesaje de mărimi diferite.
2. HTTP server. FRDM-K64F rulează o aplicație de server HTTP demonstrativă
(httpsrv_wolfssl_frdm64f) bazată pe Freescale MQX RTOS.
Observație: Pentru fișiere mari, FRDM-K64F pierde mult timp în principal din cauza memoriei heap și a citirilor repetate de pe sistemul de fișiere aflat în memoria Flash internă. Însă, având în vedere că avem de-a face cu un sistem embedded cu un consum de ordinul miliamperilor (poate fi alimentat și de la o sursă mobilă de curent), viteza de transfer este suficientă pentru conectarea la Internet.
3. HTTPS server. FRDM-K64F rulează o aplicație de server HTTPS demonstrativă (httpsrv_wolfssl_ frdm64f) bazată pe Freescale MQX RTOS.
Referințe
FRDM-K64F
[1] Kinetis K6x MCU Family, http://cache.freescale.com/files/microcontrollers/doc/fact_sheet/KINK6XFS.pdf
[2] http://cache.freescale.com/files/32bit/doc/user_guide/FRDMK64FUG.pdf
[3] http://cache.freescale.com/files/microcontrollers/doc/ref_manual/K64P144M120SF5RM.pdf
KSDK
[4] http://mcuoneclipse.com/2014/04/20/binary-files-for-the-mbed-bootloader-with-eclipse-and-gnu-arm-eclipse-plugins/
[5] http://www.freescale.com/OPENSDA
[6] https://developer.mbed.org/handbook/CMSIS-DAP
[7] Open-source CMSIS-DAP software project: github.com/mbedmicro/CMSIS-DAP.
[8] https://developer.mbed.org/handbook/SerialPC
[9] Kinetis SDK v.1.3 API Reference Manual, http://cache.freescale.com/files/soft_dev_tools/doc/support_info/KSDK13APIRM.pdf
[10] http://www.freescale.com/ksdk
[11] http://www.freescale.com/kds
[12] http://gnuarmeclipse.github.io/
[13] http://openocd.org/
[14] http://cache.freescale.com/files/soft_dev_tools/doc/support_info/KSDK13GSUG.pdf
mbed
[15] https://developer.mbed.org/
[16] https://developer.mbed.org/handbook/Homepage
[17] https://developer.mbed.org/handbook/mbed-Compiler
[18] https://developer.mbed.org/handbook/Exporting-to-Eclipse-IDEs
[19] https://developer.mbed.org/handbook/mbed-SDK
[20] https://developer.mbed.org/platforms/
[21] http://threadgroup.org/
[22] https://developer.mbed.org/blog/entry/Announcing-our-plans-for-mbed-v30/
Java ME
[23] https://docs.oracle.com/javame/8.2/get-started-freescale-k64/
[24] https://docs.oracle.com/javame/8.2/release-notes-freescale-k64/
[25] http://docs.oracle.com/javame/config/cldc/opt-pkgs/api/cldc/api/index.html
[26] http://www.oracle.com/technetwork/java/embedded/javame/javame-sdk/downloads/index.html
Azure IoT
[27] https://github.com/Azure/azure-iot-sdks
[28] https://azure.microsoft.com/en-us/documentation/samples/iot-hub-c-mbed-temperature-anomaly/
[29] https://github.com/Azure/azure-iot-sdks/blob/master/c/doc/run_sample_on_freescale_k64f_mbed.md
[30] https://developer.mbed.org/users/AzureIoTClient/
[31] https://azure.microsoft.com/en-us/marketplace/certified-iot-program/
[32] https://github.com/Azure/azure-iot-sdks/blob/master/tools/DeviceExplorer/doc/how_to_use_device_explorer.md
Apache Bench
[33] https://httpd.apache.org/docs/2.2/programs/ab.html
Freescale Semiconductor România S.R.L. – București
www.freescale.ro