34
SVEU ˇ CILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RA ˇ CUNARSTVA ZAVRŠNI RAD br. 4467 Podrška za programski okvir IoTivity na ure ¯ dajima s Androidom Martin Gluhak Zagreb, lipanj 2016.

Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Embed Size (px)

Citation preview

Page 1: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

SVEUCILIŠTE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RACUNARSTVA

ZAVRŠNI RAD br. 4467

Podrška za programski okvirIoTivity na uredajima s Androidom

Martin Gluhak

Zagreb, lipanj 2016.

Page 2: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

i

Page 3: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

iii

Page 4: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

SADRŽAJ

1. Uvod 1

2. Programski okvir IoTivity 22.1. Arhitektura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2.1.1. Usluga MultiPHY Easy Setup . . . . . . . . . . . . . . . . . 5

3. Instalacija IoTivity biblioteke za Android 6

4. Upravljanje resursima 104.1. Podešavanje platforme . . . . . . . . . . . . . . . . . . . . . . . . . 10

4.2. Izvedba klijentske strane . . . . . . . . . . . . . . . . . . . . . . . . 11

4.2.1. Traženje resursa . . . . . . . . . . . . . . . . . . . . . . . . 11

4.2.2. Slanje zahtjeva . . . . . . . . . . . . . . . . . . . . . . . . . 13

4.2.3. Promatranje resursa . . . . . . . . . . . . . . . . . . . . . . . 14

4.3. Izvedba poslužiteljske strane . . . . . . . . . . . . . . . . . . . . . . 14

4.3.1. Registriranje resursa . . . . . . . . . . . . . . . . . . . . . . 14

4.3.2. Upravljac entiteta . . . . . . . . . . . . . . . . . . . . . . . . 15

4.3.3. Odgovaranje na zahtjev . . . . . . . . . . . . . . . . . . . . . 15

4.3.4. Promatranje resursa . . . . . . . . . . . . . . . . . . . . . . . 16

4.4. Usluge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4.4.1. Usluga Resource Encapsulation . . . . . . . . . . . . . . . . 17

4.4.2. Usluga Scene Manager . . . . . . . . . . . . . . . . . . . . . 18

5. Povezivanje s Linuxom 20

6. Povezivanje s Arduinom 216.1. Primjer aplikacije za upravljanje Arduinom . . . . . . . . . . . . . . 22

6.1.1. Arhitektura aplikacije . . . . . . . . . . . . . . . . . . . . . . 24

iv

Page 5: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

7. Zakljucak 26

Literatura 27

v

Page 6: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

1. Uvod

Internet stvari (engl. Internet of Things) oznacava povezivanje fizickih uredaja te

njihovo upravljanje i razmjenu podataka pomocu ugradene elektronike i programa. Sve

je veca potražnja za takvim "pametnim" uredajima koji olakšavaju i moderniziraju sva-

kodnevan život ljudi. Programski okvir IoTivity pojednostavljuje izradu aplikacija za

takve uredaje i implementira nove tehnološke standarde Interneta stvari. Ti standardi

obuhvacaju nacin mrežne komunikacije izmedu uredaja, vrstu spremnika za prenoše-

nje podataka, nacin na koji su pripadne mogucnosti predmeta formalizirane kao resursi

te mnogo drugih norma. Standard ce idealno u buducnosti olakšati te poboljšati kva-

litetu komunikacije izmedu uredaja, neovisno koliko oni bili tehnološki napredni ili

veoma jednostavni sa slabim sklopovljem. Prednost korištenja programskog okvira

u Internetu stvari je mogucnost izrade aplikacija na više razlicitih operacijskih sus-

tava koristeci istu programsku arhitekturu prilagodenu ciljnoj platformi. U radu je

isprobana komunikacija aplikacije za operacijski sustav Android s poslužiteljima na

operacijskom sustavu Linux i Arduino. Isprobani su osnovni oblici komunikacije sa

predmetima aktuatora i senzora ugradenih na povezani uredaj.

Postoje i alternative koje rješavaju problem Interneta stvari, poput programskog

okvira AlliJoyn, koje koriste drugacije standarde od IoTivityja, no još nijedan nije

opceprihvacen te se u nastavku svi podaci ticu iskljucivo standarda korištenog u IoTi-

vityju.

1

Page 7: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

2. Programski okvir IoTivity

IoTivity je programski okvir otvorenog koda za Internet stvari koji omogucava po-

vezivanje više uredaja te njihovo medusobno komuniciranje. Projekt je sponzoriran od

strane OIC-a (engl. Open Interconnect Consortium), industrijske grupe velikih kom-

panija, ciji je cilj razraditi standard za uredaje povezane Internetom stvari. OIC su

osnovale tvrtke Intel, Samsung Electronics i Broadcom 2014. godine. Programski ok-

vir je napisan u programskim jezicima C i C++ te podržava operacijske sustave Linux,

Android, Arduino, Tizen i Yocto.

Slika 2.1: IoTivity logo

2.1. Arhitektura

Arhitektura IoTivity projekta sastoji se od više povezanih slojeva od kojih svaki

obavlja neku posebnu zadacu. Najniži je sloj povezivanja koji apstrahira funkcional-

nosti mogucih nacina prijenosa, npr. Bluetooth ili IP. On obavlja operacije povezivanja

i prihvacanja paketa zahtjeva od drugih uredaja. Sloj povezivanja je zašticen dodatnim

slojem koji je zadužen za DTLS (engl. Datagram Transport Layer Security) enkripciju

paketa. Iznad se nalazi sloj biblioteka u programskom jeziku C koji sadržava vecinu

glavne funkcionalnosti IoTivityja. Sloj C biblioteka komunicira sa slojem zaštite i po-

vezivanja te upravlja primljenim i slanim podacima. Za prijenos podataka koristi se

CBOR (engl. Concise Binary Object Representation) model podataka temeljen na po-

pularnom JSON (engl. JavaScript Object Notation) formatu te je dodatno kompresiran.

Prednost korištenja CBOR modela umjesto JSON-a je u tome što JSON ne podržava

2

Page 8: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

prijenos binarnih podataka te ih je potrebno pretvoriti u Base64 oblik (standard za

prijenos podataka), što kod CBOR-a nije slucaj te u ovoj primjeni može uštedjeti tro-

šak resursa na uredajima slabog sklopovlja. CBOR podržava više tipova podataka od

JSON formata što u nekim slucajevima rezultira manjim zauzecem memorije. Napri-

mjer boolean vrijednost koja zauzima samo jedan bit memorije u CBOR modelu u

JSON-u zauzima više bitova. S druge strane jedna od lošijih strana CBOR modela je

što brojeve sprema u big-endian obliku, dok se ocekuje da ce vecina uredaja s IoTivity

aplikacajama imati procesor koji koristi little-endian oblik.

Slika 2.2: Prikaz IoTivity slojeva u Androidu (Morrow, Vijay and Habib, 2016)

Protokol koji se koristi na sloju C bibilitoke je CoAP (engl. Constrained Appli-

cation Protocol). CoAP je protokol aplikacijskog sloja komunikacijskih mreža slican

HTTP-u (engl. Hypertext Transfer Protocol) koji se koristi za komuniciranje jednostav-

nih uredaja. Za razliku od HTTP-a, CoAP ne koristi protokol TCP (engl. Transmission

Control Protocol), vec protokol UDP (engl. User Datagram Protocol) i koristi krace

zaglavlje te time šalje manje nevažnih podataka. Sljedeci sloj je aplikacijsko program-

sko sucelje (API) u programskom jeziku C++ koje pruža pristup funkcionalnostima

iz C sloja ostalim modulima. Taj sloj je zamišljen za korištenje u implementacijama

klijenta i poslužitelja na konkretnim uredajima. Postoji dodatan neobavezan sloj pri-

mitivnih servisa koji koriste C++ sucelje te se mogu dodati u aplikacije, npr. simulator

resursa bez stvarnog sklopovlja.

Kod izrada aplikacija za operacijski sustav Android u Javi, potrebno je omogu-

3

Page 9: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Slika 2.3: Paket za prijenos podataka (IoTvity project managment, 2016)

citi pozivanje C++ metoda IoTivity sucelja. To se omogucava pomocu dodatnog JNI

(engl. Java Native Interface) medusloja. JNI pruža mogucnost pokretanja C++ metoda

unutar Java koda otvaranjem odgovarajuce JNI prilagodene biblioteke .so ekstenzije na

Linuxu ili .dll na Windowsima te deklariranjem i pozivanjem izvorne metode. Na taj

nacin se gradi Java API koji poziva odgovarajuce C++ API metode, umjesto ponovnog

implementiranja.

Slika 2.4: Povezivanje IoTivity slojeva s Javom

4

Page 10: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

2.1.1. Usluga MultiPHY Easy Setup

MultiPHY Easy Setup je usluga koja služi za pojednostavljeno povezivanje novih

uredaja u IoTivity mrežu. Uredaji mogu podržavati razlicite nacine prijenosa te ovom

uslugom koristimo uredaj posrednika za olakšano dodavanje u bežicnu mrežu. Uredaj

posrednika se naziva medijator, uredaj koji želimo spojiti na mrežu enrollee, a uredaj

IoTivity mreže na koji se želimo spojiti zovemo enroller. Medijator šalje enrollee ure-

daju podatke o mreži na koju se želi spojiti. Korisnik u medijator upisuje identifikator

skupa usluga (SSID) i lozinku te se podaci šalju enrollee uredaju koji se pritom spaja

s enroller uredajem te samostalno nastavljaju komunikaciju.

Slika 2.5: Komunikacija sudionika usluge Easy Setup (IoTivity wiki, 2016)

Aplikacija medijatora je dostupna za operacijske sustave Android i Linux, a enrol-

lee aplikacija za operacijske sustave Arduino, Linux i Tizen.

5

Page 11: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

3. Instalacija IoTivity biblioteke zaAndroid

Kako bi se programski okvir IoTivity koristio u aplikacijama za operacijski sustav

Android potrebno je prevesti izvorni kod biblioteka, jer ne postoji vec unaprijed pre-

vedena inacica koja bi se odmah ubacila u projekt. Prevesti se može u operacijskim

sustavima Windows, Linux i Mac OS X, no Windowsi su samo djelomicno podržani te

je moguce naici na razne probleme, pa je procedura jednostavnija na Linuxu. Postupak

iz ovog poglavlja je isproban na Ubuntu 14.04 LTS distribuciji Linuxa.

Prvo je potrebno skinuti najnoviju verziju projekta (u trenutku pisanja rada to je

verzija 1.1.0) te raspakirati negdje na racunalu.

https://www.iotivity.org/downloads

Preduvjet za korištenje IoTivityja je instalirani OpenJDK (Java development kit)

verzije 1.7 ili novije.

sudo apt-get install openjdk-7-jdk

Za prevodenje biblioteka koristi se alat SCons napisan u programskom jeziku Pyt-

hon. SCons koristi konfiguracijske datoteke takoder pisane u Pythonu te se one nalaze

unutar IoTivity projekta. Ubuntu dolazi sa vec instaliranom inacicom Pythona tako da

je potrebno još samo instalirati SCons preko naredbe:

apt-get install scons

Prilikom prevodenja SCons koristi alate Android SDK (engl. Software development

kit), Android NDK (engl. Native development kit) i Gradle. Za prevodenje je potrebno

u Android SDK manageru instalirati specificno ove pakete:

– Build-tools Reviziju 20

– Android 5.0.1 (API21) SDK Platformu

SCons koristi mnogo vanjskih biblioteka za prevodenje te ce tijekom obrade pro-

vjeriti njihovu prisutnost i ponuditi komandne naredbe za instalaciju onih koje nedos-

taju.

6

Page 12: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Ako koristite 64-bitni operacijski sustav potrebno je instalirati dodatne 32-bitne

biblioteke kako bi Android SDK postao kompatibilan

sudo apt-get install libc6:i386 libstdc++6:i386

Lokacije instalacija tih alata zadaju se kao parametri u naredbi prevodenja. Ako

se ne navedu, SCons samostalno skida potrebne alate s interneta te ih instalira u mapu

/extlibs/android unutar IoTivity projekta. Kao parametar u SCons naredbi navodi se

operacijski sustav za koji prevodimo biblioteku. U našem slucaju to je Android te

navodimo TARGET_OS=android. Ostali parametri su navedeni u nastavku.

Tablica 3.1: Paramatri za SCons naredbu

ANDROID_HOME Lokacija alata Android SDK

ANDROID_NDK Lokacija alata Android NDK

GRADLE_HOME Lokacija alata Gradle

TARGET_ARCH Arhitektura uredaja:

armeabi

armeabi-v7a

x86 - pretpostavljeno

x86_64

TARGET_TRANSPORT Nacin prijenosa:

IP - pretpostavljeno

BLE

BT

ALL

SECURED Zaštita DTLS (engl. Datagram

Transport Layer Security) protoko-

lom

0 (iskljucen) - pretpostavljeno

1 (ukljucen)

RELEASE Nacin izdavanja:

1 (za izdavanje) - pretpostavljeno

0 (za debugiranje)

Primjer SCons naredbe za prevodenje izgleda ovako:

scons TARGET_OS=android TARGET_ARCH=x86 TARGET_TRANSPORT=IP

Nakon uspješnog izvršavanja naredbe u mapi IoTivity projekta nalaze se prevedene da-

toteke. U mapi /android/android_api/base/build/outputs/aar/ nalazi se .aar datoteka u

7

Page 13: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

obliku Android arhive (engl. Android archive) koja se može dodati u Android Studio

prilikom izrade aplikacije. Ovisno o parametrima prevodena datoteka ce imati dru-

gaciji naziv te ih može biti više, ako je biblioteku potrebno prevesti za više razlicitih

arhitektura.

Postupak za dodavanje biblioteke u Android Studio:

1. U izborniku pokrenemo File->New Module

2. Kao tip modula (engl. Choose module type) biramo Import .JAR or .AAR Pac-

kage te pritisnemo next

3. U izborniku File name odredimo put do .aar datoteke prevedene IoTivity bibli-

oteke te pritisnemo finish

4. U izborniku pokrenemo File->Project Structure

5. Pritisnemo na modul pocetnog projekta s lijeve strane prozora

6. Kliknemo na podnaslov Dependencies

7. Pritisnemo plus s desne strane, izaberemo 3 Module dependency te oznacimo

dodani IoTivity modul

Slika 3.1: Struktura ovisnosti u Android Studio projektu

8

Page 14: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Nakon ove procedure Android Studio ce graditi aplikaciju u ovisnosti o IoTivity

projektu te možemo koristiti pripadajuci API (aplikacijsko programsko sucelje) za

upravljanje resursima.

9

Page 15: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

4. Upravljanje resursima

U daljnjem kontekstu, resurs je komponenta poslužitelja koju možemo promatrati

ili kontrolirati preko drugog uredaja. Resursima upravljamo preko OIC (engl. Open

Interconnect Consortium) (standard koji IoTivity implementira) protokola. OIC je su-

celje visoke apstrakcije zbog lakše izmjene i dodavanja novih nacina prijenosa. OIC

koristi CoAP protokol. OIC standard definira posebne nazive za operacije nad resur-

sima CRUDN (engl. create, read, update, delete and notify) (stvori, procitaj, osvježi,

obriši, obavijesti), no te operacije su u IoTivtyju preslikane u nazive slicnije HTTP-u

(post, get, put, delete, observe).

4.1. Podešavanje platforme

Prije nego pocnemo rukovati resursima, potrebno je podesiti platformu na koju ce

resursi biti prijavljeni. Odabiremo režim rada platforme - poslužitelj, klijent ili oboje.

Biramo lokalnu IP adresu koju platforma sluša ili ostavljamo 0.0.0.0 pa sluša sva pris-

tupacna sucelja. Možemo odabrati vrata (engl. port) platforme, a upisivanjem nule se

dodjeljuju nasumicna vrata. Moguce je na apstraktnoj razini odrediti kvalitetu usluge

u transportnom protokolu (engl. quality of service (low, medium, high)) koja ovisi o

implementaciji koja se mijenja. Visoka razina kvalitete osigurava korištenje potvrda

za svaki prijenos. Specificnu konfiguraciju stvaramo kao instancu PlatformConfig raz-

reda te prosljedujemo pozivom staticne metode (engl. Configure), klase OCPlatform

koja te argumente prosljeduje istoimenoj metodi C++ sucelja nižeg sloja koristeci JNI.

C++ sloj pritom šalje podatke posebnom razredu oblikovnog obrasca jedinstvenog

objekta (engl. singleton) koji pristupa još nižem C sloju te obavlja podešavanje plat-

forme prema danim parametrima. U Javi je još potrebno pridodati kontekst aplikacije

za operacijski sustav Android, no ta se vrijednost ne prosljeduje u pozivu C++ funkcije.

Primjer konfiguriranja platforme:

10

Page 16: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

PlatformConfig platformConfig = new PlatformConfig(

this,

ServiceType.IN_PROC,

//Nacin rada platforme

ModeType.CLIENT,

//IP adresa na koju se spaja, postavljeno na sve

//pristupacne

"0.0.0.0",

//Korištena vrata, postavljena nasumicno

0,

QualityOfService.LOW

);

//Podešavanje platforme na zadanu konfiguraciju

OcPlatform.Configure(platformConfig);

Platformi se mogu pridodati razni opcionalni opisi poput verzije, datuma proizvod-

nje, identifikacijskog broja, internetske adrese za podršku te mnogi drugi. Dodatno se

može zadati i ime uredaja što se prosljeduje odvojeno od ostalih opisa. Te podatke

klijenti mogu dohvatiti nakon pronalaska platforme.

4.2. Izvedba klijentske strane

4.2.1. Traženje resursa

Kada klijent želi pronaci dostupne resurse odredenog tipa šalje višeodredišni (engl. mul-

ticast) get zahtjev. Na taj zahtjev odgovaraju svi clanovi mreže koji kontroliraju resurs

traženog tipa, a ostali ignoriraju zahtjev. Odgovor na zahtjev se šalje jednosmjerno

(engl. unicast) te sadržava informacije o resursu. Ako klijent zna tocnu adresu resursa,

može se slati i jednosmjerni zahtjev. Odgovor ovisi o implementaciji upravljaca enti-

tetom na poslužitelju. Klijent mora nadjacati metodu iz sucelja OnResourceFoundLis-

tener koja osluškuje odgovor poslužitelja te obraduje primljenu instancu OcResource

klase. Citajuci URI, tip i sucelje primljenog resursa provjerava je li to odgovarajuci re-

surs za namjenu klijentu te u potvrdnom sprema vlastitu instancu za kasnije korištenje.

Primjer traženja resursa:

try {

//Izgradnja URI-a za traženje resursa

11

Page 17: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

//zadanog tipa zarulja.led (rt je resource type)

//WELL_KNOWN_QUERY je uobicajen pocetak

//URI-a koji oznacava traženje resursa

//(Može se tražiti i uredaj ili platforma)

String requestUri = OcPlatform.WELL_KNOWN_QUERY +

"?rt=zarulja.led";

OcPlatform.findResource("",

requestUri,

//Lista enuma podržanih vrsta konekcija

EnumSet.of(OcConnectivityType.CT_DEFAULT),

//Mjesto implementacije

//metode onResourceFound koja

//reagira na odgovor poslužitelja

this

);

} catch (OcException e) {

Log.e(TAG, e.toString());

}

Na slijednom dijagramu na slici 4.1 prikazana je komunikacija izmedu klijenta i

resursa prijavljenih u mreži. Klijent šalje višeodredišni zahtjev za pronalazak resursa

tipa light te mu na taj zahtjev odgovaraju samo odgovarajuci resursi.

Slika 4.1: Primjer otkrivanja resursa u mreži (IoTivity Linux programmers guide, 2016)

Na slijednom dijagramu na slici 4.2 prikazan redoslijed pozivanja metoda pod slo-

jevima IoTivity arhitekture prilikom traženja resursa. U klijentskoj aplikaciji pozivamo

metodu traženja nad prijavljenom platformom, isti poziv se prosljeduje C++ sucelju

koji dalje prosljeduje poziv C sucelju. C sucelje poziva OCDoResource te šalje vi-

šeodredišni zahtjev svim clanovima mreže koristeci CoAP protokol. Kada pronadeni

resursi odgovore na zahtjev, C sucelje pronalazi prijavljenu callback metodu onReso-

urceFound unutar parametrom poslane lokacije.

12

Page 18: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Slika 4.2: Tijek pozivanja funkcija u klijentu tijekom traženja resursa (IoTivity Linux pro-

grammers guide, 2016)

4.2.2. Slanje zahtjeva

Za slanje zahtjeva potrebno je implementirati metode odgovarajuceg sucelja, npr.

OnGetListener za get zahtjeve ili OnPutListener za put zahtjeve, koja se nalaze unu-

tar OCResource klase. Svaki zahtjev ima dvije nadjacane listener metode, jednu za

uspješnu provedbu, drugu za neuspješnu (npr. OnGetComplete i OnGetFailed za get

zahtjev). Pokretanje zahtjeva nad nekim resursom poziva se u njemu odgovarajucoj

instanci OCResource klase spremljenoj tijekom traženja resursa. Metode za pokreta-

nje zahtjeva su vec implementirane i primaju parametar u obliku hash tablice sa do-

datnim informacijama o upitu, npr. za slucaj da primjerak resursa predstavlja grupu te

poslužitelj ima razradenu logiku za provodenje složenih zahtjeva. U svaki se zahtjev

može zadati posebna implementacija sucelja za osluškivanje odgovora, no uobicajeno

je proslijediti kontekst klase zadužene za baratanje specificnim tipom resursa. Zah-

tjevi koji mogu mijenjati vrijednosti resursa, npr put, šalju i instancu OcRepresentation

klase kao argument. U tu klasu se poput mape dodaju parovi parametra i vrijednosti,

koji odreduju zatraženi novi izgled resursa. Nakon odgovora poslužitelja na zahtjev,

klijent cita primljeni primjerak OcRepresentation klase te tek onda, u slucaju uspješ-

nog provodenja zahtjeva, lokalno sprema promijenjene vrijednosti.

13

Page 19: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

4.2.3. Promatranje resursa

Cesto je zadatak klijenta nadgledati neki resurs te pratiti njegove vrijednosti ili

mjerenja. CoAP protokol za taj zadatak ima rezervirani poseban zahtjev promatranja

- observe. Kako bi zapocelo promatranje resursa, klijent se registrira na poslužitelj

koristeci poseban get zahtjev, definiran protokolom. Dok god je klijent registriran kao

promatrac nekog resursa, primat ce njegove nove vrijednosti prilikom svake promjene.

Kada želi prestat nadgledat resurs, klijent ponovno šalje poseban get zahtjev pozivom

metode cancelObserve nad resursom te završava pretplatu. Kao i za ostale zahtjeve,

rezultate promatranja dobivamo u implementaciji callback metode sucelja resursa. Pri-

likom dobivanja odgovora, primamo informaciju o uspješno provedenoj registraciji ili

kraju promatranja resursa. Ostatak dobivenih podataka odgovara vrijednostima pro-

matranog resursa.

4.3. Izvedba poslužiteljske strane

4.3.1. Registriranje resursa

Registriranje resursa se obavlja nad vec podešenom platformom. Resurs nekog

uredaja definiraju URI (engl. Uniform Resource Identifier), tip resursa, sucelje, uprav-

ljac entitetom i svojstva. URI je jedinstveno ime koje služi za identificiranje resursa,

npr /zarulja/1. Prilikom registracije se proširuje IP adresom i vratima platforme

oc://IP_adresa:vrata/zarulja/1

te postaje potpuno kvalificiran (engl. fully qualified URI) (oc predstavlja OIC stan-

dard). Tip resursa je koristan prilikom grupiranja razlicitih uredaja koji obavljaju istu

funkciju, npr rasvjeta. Sucelje oznacava radi li se o jednom resursu, skupini resursa,

poveznici na neki drugi resurs ili grupi poveznica. Kao parametar se dodaje i niz bitov-

nih zastavica cije postavljanje predstavlja aktivnost, mogucnost otkrivanja, mogucnosti

promatranja i slicna svojstva. Upravljac entitetom je razred koji definira ponašanje re-

sursa prilikom pozivanja odredenog zahtjeva od strane klijenta (npr. Na get zahtjev

ogovara jacinom svjetla žarulje). Konkretni upravljac entiteta se implementira u Javi

na najvišoj razini te prilikom primanja zahtjeva, niži sloj pronalazi upravljaca asocira-

nog uz zadani resurs te poziva nadjacanu (engl. override) metodu izvedbe upravljaca.

Primjer registriranja resursa unutar upravljaca entitetom:

upravljacResursa=

OcPlatform.registerResource(

14

Page 20: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

"/zarulja", // URI

"zarulja", // tip resursa

OcPlatform.DEFAULT_INTERFACE,

// sucelje, oznacava samostalan resurs po OIC

// standardu, konkretno "oic.if.baseline"

this, // upravljac entitetom, unutar njega se

// poziva registriranje resursa

EnumSet.of(ResourceProperty.DISCOVERABLE,

ResourceProperty.OBSERVABLE)

// svojstva resursa, svaki enum

// predstavlja jednu postavljenu zastavicu

);

4.3.2. Upravljac entiteta

Upravljac entiteta nadjacava metodu handleEntity koja se poziva kada poslužitelj

primi zahtjev nad resursom za koji je taj upravljac nadležan. Metoda prima instancu

razreda OcResourceRequest kao parametar koji sadrži podatke o poslanom zahtjevu.

U upravljacu se vrši provjera postavljenih zastavica unutar liste RequestHandlerFlag

enuma primljenog parametra te ovisno o njima delegira posao odgovarajucim meto-

dama. Moguce zastavice zahtjeva su INIT (potrebno je izvršiti inicijalizaciju resursa),

REQUEST (zahtjev je tipa get, post, put ili delete ) i OBSERVER (zahtjev se odnosi na

promatranje resursa).

Ovisno o uspješnosti provodenja i tipu zahtjeva, upravljac entitetom vraca varijantu

EntityHandlerResult enuma povratnog statusa. Za neuspješan zahtjev vraca ERROR,

FORBIDDEN ili RESOURCE_NOT_FOUND, a za uspješan ovisno o tipu OK, RESO-

URCE_CREATED ili RESOURCE_DELETED. Poseban tip odgovora je SLOW koja

oznacava da poslužitelj iz nekog razloga ne može brzo procesuirati zahtjev te ce nak-

nadno dobiti odgovor na svoj upit.

4.3.3. Odgovaranje na zahtjev

Kada upravljac entiteta primi upit sa postavljenom REQUEST zastavicom, pozi-

vom metode getRequestType nad dobivenim parametrom saznaje o kojem se tipu zah-

tjeva radi. U upravljacu implementiramo ocekivano ponašanje za svaku varijantu zah-

tjeva. Stvara se instanca razreda OcResourceResponse u koju se upisuju podaci o tra-

15

Page 21: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

ženom zahtjevu i resursu. Nakon provedenog zahtjeva u instancu se dodaju i osvježene

vrijednosti resursa te se cijeli razred šalje klijentu kao odgovor. Odgovor se šalje preko

platforme pozivom metode sendResponse.

4.3.4. Promatranje resursa

Klijent šalje zahtjev sa postavljenom OBSERVER zastavicom te se registrira za

pracenje nekog resursa. Poslužitelj je zadužen nakon svake preinake resursa o tome

obavijestiti klijenta. Poslužitelj nakon svake promjene klijentu šalje odgovor na za-

mišljeni get zahtjev sa novim vrijednostima resursa. Ovisno o implementaciji za svaku

specificnu promjenu mogu se obavještavati svi pretplaceni klijenti ili samo podskup.

Pozivom metode notifyAllObservers nad platformom s argumentom promatranog re-

sursa obavještavamo sve pretplatnike. Obavještavanje podskupa pretplatnika obavlja

se pozivom metode notifyListOfObservers, u tom slucaju potrebno je lokalno pamtiti i

održavati podatke svih pretplatnika.

Uvjet za promatranje specificnog resursa je postavljena zastavica OBSERVABLE

prilikom registriranja na poslužitelju.

Na slici 4.3 prikazana je komunikacija izmedu klijenta i poslužitelja tijekom pro-

matranja resursa. Pozivom metode observe nad resursom na najvišem sloju, zahtjev

prolazi kroz niže slojeve te C sloj šalje get zahtjev s postavljenom OBSERVE zastavi-

com. Poslužitelj registrira klijenta te odgovara na zahtjev. Nakon registracije, klijent

je pretplacen te prima obavijesti o resursu do trenutka slanja novog get zahtjeva kojim

prekida pretplatu.

16

Page 22: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Slika 4.3: Tijek pozivanja funkcija kroz slojeve arhitekture tijekom promatranja resursa (IoTi-

vity Linux programmers guide, 2016)

4.4. Usluge

4.4.1. Usluga Resource Encapsulation

Usluga Resource Encapsulation je dodatni apstraktni sloj za lakše upravljanjem

resursima prilikom razvijanja aplikacije. S klijentske strane sadrži modul Resource

Cache koji služi lakšem pamcenju atributa resursa. Takoder sadrži modul Resource

Broker koji je zadužen za pracenje prisutnosti resursa od znacaja. S poslužiteljske

strane omogucava lakšu izgradnju resursa i dodavanje njihovih atributa. Korisnik tako-

der ima opciju koristiti automatski upravljac tako izgradenim resursima umjesto vlas-

17

Page 23: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

titog implementiranja upravljaca, ako ne želi posebne funkcionalnosti.

Slika 4.4: Povezivanje korisnicke aplikacije i IoTivity slojeva pomocu usluga (IoTivity wiki,

2016)

4.4.2. Usluga Scene Manager

Scene Manager je usluga koja je izgradena povrh usluge Resource Encapsulation

i služi korisnicima za izgradnju "scene" od više prethodno otkrivenih resursa. Scena

služi za olakšano podešavanje tematskih skupova resursa (npr. podešavanje pametne

kuce u mod za izbivanje - ugašena sva svjetla i aparati). Scena se može pohraniti na

klijentskom ili poslužiteljskom uredaju ovisno o svrsi. Scene se po OIC standardu

pohranjuju u tri razine resursa, svaka sa svojim vlastitim URI-jevima. SceneList sa-

drži više resursa tipa SceneCollection od kojih svaki predstavlja specificnu scenu. Na

SceneCollection se pozivaju CoAP zahtjevi te se oni propagiraju na listu resursa tipa

SceneMemeber koje sadrži scena. Svaki resurs SceneMember predstavlja jedan stvaran

resurs te njegovo mapiranje atributa za tu specificnu scenu.

18

Page 24: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Slika 4.5: Prikaz hijerarhije resursa Scene Manager (IoTivity wiki, 2016)

19

Page 25: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

5. Povezivanje s Linuxom

IoTivity projekt sadrži više primjera vec implementiranih klijenta i poslužitelja za

pokretanje na Linux operativnom sustavu. Aplikacije su programirane u C++ pro-

gramskom jeziku te pozivaju metode nižih slojeva slicno kao Android, no prevodenje i

pokretanje je jednostavnije jer nema potrebe za korištenjem JNI sucelja. Nakon prevo-

denja, aplikacije je moguce pokrenuti izravno iz ljuske te su registrirani resursi vidljivi

i na ostalim platformama OIC standarda.

Slika 5.1: Ispis SimpleClient aplikacije prilikom promatranja resursa

Na slici je prikazan ispis aplikacije klijenta SimpleClient koji traži prijavljeni resurs

uparenog poslužitelja SimpleServer na Androidu te ga krace vrijeme promatra.

20

Page 26: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

6. Povezivanje s Arduinom

Arduino je racunalna platforma cesto korištena u internetu stvari i podržana od

strane IoTivityja. Inacica korištenog Arduino mikrokontrolera prilikom testiranja je

Arduino Due. Na Arduino Due se po potrebi dodaju štitovi (engl. shield) za dodatne

funkcionalnosti. Za povezivanje s Androidom pomocu IoTivityja korišten je štit ether-

net koji podržava višesmjerno slanje zahtjeva. Android i Arduino prilikom komunici-

ranja moraju biti u istoj lokalnoj mreži kako bi višeodredišni zahtjevi uspješno pronašli

prijavljene resurse.

Slika 6.1: Arduino Due plocica

Primjer implementacije poslužitelja za Arduino priložen je u IoTivity projektu pod

nazivom SimpleClientServer. Poslužitelj registrira virtualni, nepostojeci resurs te omo-

gucava klijentima s drugih platforma da ga pronadu, prate i obavljaju jednostavne zah-

tjeve nad njim.

21

Page 27: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

6.1. Primjer aplikacije za upravljanje Arduinom

Na Arduino je spojen proizvoljan broj LED lampica koje se programski mogu paliti

i gasiti. Kada se te lampice formaliziraju kao resursi tip led.lampica te registriraju

na IoTivity platformu, na Androidu ih je moguce otkriti. U isprobanom primjeru na

Arduino su spojene tri LED lampice razlicitih boja, svaka sa svojim jedinstvenim URI-

em.

Slika 6.2: Arduino plocica sa spojenim LED lampicama i senzorom

U izradenoj Android aplikaciji pritiskom na gumb za prikaz lampica prikazuje se

pogled liste(engl. listview) sa svim pronadenim resursima tog tipa. Za svaki element

liste prikazano je stanje lampice (upaljena ili ugašena). Stanje resursa dobiveno je

odgovorom poslužitelja na zahtjev get. Pritiskom na odredeni element liste šalje se

zahtjev put tom specificnom resursu te lampica mijenja stanje u suprotno od prijašnjeg.

22

Page 28: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Slika 6.3: Lista pronadenih lampica

Na Arduino je takoder spojen višenamjenski senzor cija se mjerenja mogu ocitati.

Senzor je stvoren kao resurs imena /a/sensor. Mjerenja senzora se prilikom od-

govora s Arduina šalju preko instance OcRepresentation s postavljenim vrijednostima

na kljuceve "temp", "humid" i "voltage" za temperaturu, vlažnost zraka i napon na

senzoru. Nakon pronalaženja resursa senzora, Android aplikacija šalje get zahtjev te

dobiva aktualna mjerenja. Korisnik ima dodatnu opciju promatranja senzora u kojoj se

aplikacija kao klijent pretplacuje na obavijesti Arduino poslužitelja. Arduino svakih

2.5 sekunda provjerava je li došlo do dovoljno znacajne promjene u vrijednostima da se

pretplacene klijente o tome obavijesti. Dok god je klijent pretplacen, na ekranu ce biti

23

Page 29: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

prikazana ažurna mjerenja. Prednost ovakve komunikacije je što nece biti nepotrebnog

prijenosa podataka u intervalima kada se vrijednosti mjerenja ne mijenjaju.

Slika 6.4: Promatranje mjerenja senzora

6.1.1. Arhitektura aplikacije

Aplikacija se sastoji o pocetne aktivnosti (engl. activity) MainActivity u kojoj je

ponudena opcija traženja resursa u trenutnoj mreži pritiskom na gumb. Obavijesti o

otkrivenim resursnima se ispisuju u klizni okvir za tekst (engl. ScrollView) preko me-

tode msg. Metoda msg se poziva u nadjacanim callback metodama osluškivaca zah-

tjeva kada poslužitelj pošalje odgovor na upite. Kako se metode osluškivaca izvode

24

Page 30: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

na posebnoj dretvi ako želimo mijenjati elemente statickog rasporeda (engl. layout)

potrebno je napraviti novu instancu klase Runnable u cijoj se metodi run nalazi željeni

isjecak koda. Tu instancu potrebno je poslati kao argument metodi runOnUiThread

koja stavlja taj dio koda na listu cekanja u dretvi korisnickog sucelja (engl. user in-

terface thread). Konkretni primljeni resursi OcResource spremaju se u instance klase

Lampica ili Senzor, ovisno o vrsti.

Ako je prilikom pretrage pronaden primjerak resursa LED lampice, omogucen je

pritisak na gumb koji aplikaciju vodi u novu aktivnost ListActivity sa prikazom liste

svih pronadenih lampica. Za popunjavanje liste koristi se poseban adapter naziva

LampicaAdapter koji nasljeduje klasu ArrayAdapter. Zadaca adaptera je definira-

nje nacina popunjavanja statickog elementa rasporeda koji opisuje jedan redak liste

konkretnim vrijednostima.

Ako je pronaden primjerak resursa senzora, omogucen je pritisak na gumb koji

otvora SenzorActivity aktivnost. Tamo se unutar okvira za tekst (engl. TextView) nalaze

ocitanja senzora u vrijeme pronalaska resursa i prvotnog slanja get zahtjeva. Pritiskom

na gumb za promatranje poziva se metoda observeSensor te se tijekom ocitavanja no-

vih vrijednosti ponovno stvara nova Runnable instanca za osvježivanje podataka na

dretvi korisnickog sucelja. Kada korisnik pritisne na gumb za prestanak pracenja po-

ziva se metoda stopObservingSensor koja nad resursom senzora šalje zahtjev za pres-

tanak promatranja metodom programskog okvira cancelObserve.

25

Page 31: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

7. Zakljucak

IoTivity programski okvir je novi projekt, s prvom distribucijom objavljenom ot-

prilike pola godine prije pisanja ovog rada (Prva verzija izdana 18.12.2015.) te je još

uvijek njegova buducnost neizvjesna. S obzirom na financijsku moc sponzorskih kom-

panija IoTivity se cini kao jedan od mogucih kandidata za vodece mjesto u svijetu

Interneta stvari za par godina. Na slici 7.1 nalazi se plan izdavanja buducih inacica

IoTivityja te nekih novih funkcionalnosti koje ce pružati.

Slika 7.1: Planirane buduce verzije Iotivity programskog okvira (Subash, 2016)

U vrijeme pisanja ovog rada, programski okvir nije u potpunosti dokumentiran te

je u odredenoj mjeri nepristupacan pocetnicima, djelomicno i zbog male baze ljudi koji

ga koriste i raspravljaju o problemima.

26

Page 32: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

LITERATURA

Chua Hock-Chuan. Java programming tutorial, java native interface (jni). URL

https://www3.ntu.edu.sg/home/ehchua/programming/java/

JavaNativeInterface.html.

Steven Knight. Scons 2.5.0 user guide. URL http://www.scons.org/doc/

production/HTML/scons-user.html.

Tim Kourt. Iotivity: Support for android. URL http://events.

linuxfoundation.org/sites/events/files/slides/

IoTivityAndroidBinding.pdf.

Kishen Maloor. Iotivity core framework: Features and opportunities. URL

http://events.linuxfoundation.org/sites/events/files/

slides/IoTivityCoreFramework.pdf.

Joseph Morrow, Vijay Kesavan, i Habib Virji. Iotivity 101 a hands on

class. URL http://openconnectivity.org/wp-content/uploads/

2016/01/IoTivity-101_Vijay-Joey.pdf.

Dzung Tien Nguyen. Iotivity. URL http://monet.skku.edu/wp-content/

uploads/2015/10/IoTivityFramework.pdf.

Open Interconnect Consortium standard working group. Introduction of oic stan-

dard. URL http://openconnectivity.org/wp-content/uploads/

2016/01/OIC_Specification_Overview_201501131.pdf.

Ashok Subash. Iotivity architecture, 2016. URL http://openconnectivity.

org/wp-content/uploads/2016/01/Ashok-Subash.pdf.

IoTivity Team. Iotvity project managment, a. URL https://jira.iotivity.

org/browse/IOT/.

27

Page 33: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

IoTivity Team. Iotivity linux programmers guide, b. URL https://www.

iotivity.org/documentation/linux/programmers-guide/.

IoTivity Team. Iotivity wiki, c. URL https://wiki.iotivity.org.

Habib Virji. The essentials of iotivity connectivity. Samsung Open Source Group,

2015.

28

Page 34: Podrška za programski okvir IoTivity na uredajima s · PDF filelee aplikacija za operacijske sustave Arduino, Linux i Tizen. 5. 3. Instalacija IoTivity biblioteke za Android ... Native

Podrška za programski okvir IoTivity na uredajima s Androidom

Sažetak

U radu je proucen programski okvir IoTivity za Internet stvari te njegova podrška

za operacijski sustav Android. Objašnjena je osnovna logika komunikacije izmedu

klijenta i poslužitelja te sistematika poziva metoda u samoj arhitekturi programskog

okvira prilikom provodenja zahtjeva medu uredajima. Isprobana je komunikacija apli-

kacije za operacijski sustav Android s drugim operacijskim sustavima (Arduino i Li-

nux) te upravljanje registriranim resursima. Izradena je klijentska aplikacija za opera-

cijski sustav Android kao primjer osnovnih operacija meduplatformske komunikacije

sa senzorima i aktuatorima. Aplikacija kontrolira LED lampice i ocitava vrijednosti

višenamjenskog senzora spojenog na Arudino plocicu koja je u ulozi posljužitelja.

Kljucne rijeci: IoTivity, Android, Internet stvari, CoAP, klijent, poslužitelj, promatra-

nje

Support for IoTivity framework on Android devices

Abstract

The subject of this thesis is the IoTivity framework for Internet of things and its

support for the Android operating system. The thesis explains the basic logic behind

client-server communication and the order of method calls in the framework archi-

tecture while transmitting requests between devices. The management of resources

for other platforms is explained and tested on the Android operating system. An ap-

plication was made as an example of basic cross-platform communication between

operating systems Arduino and Android where the Android client controls the LED

lights and the multipurpose sensor attached to the Arduino board.

Keywords: IoTivity, Android, Internet of things, CoAP, client, server, observe