Upload
vuongdan
View
233
Download
5
Embed Size (px)
Citation preview
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.
i
iii
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
7. Zakljucak 26
Literatura 27
v
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
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
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
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
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
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
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
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
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
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
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
//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
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
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
"/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
ž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
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
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
Slika 4.5: Prikaz hijerarhije resursa Scene Manager (IoTivity wiki, 2016)
19
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
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
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
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
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
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
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
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
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
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