Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Smetanova ulica 17
2000 Maribor, Slovenija
Tomaž Orter
REALNO-ČASOVNA KOMUNIKACIJA MOBILNIH APLIKACIJ S SENZORJI
Diplomsko delo
Maribor, avgust 2016
I
REALNO-ČASOVNA KOMUNIKACIJA MOBILNIH
APLIKACIJ S SENZORJI
Diplomsko delo
Študent: Tomaž Orter
Študijski program: Univerzitetni študijski program
Računalništvo in informatika
Smer: Informatika
Mentor: doc. dr. Boštjan Šumak, univ. dipl. inž. rač. in inf.
Lektorica: Melita Račev, prof. slovenskega jezika
ii
Realno-časovna komunikacija mobilnih aplikacij s
senzorji
Ključne besede: Realno-časovna komunikacija, senzorji, internet stvari, nadzor
ogrevanja, mobilna aplikacija, MQTT, HTTP, CoAP, AMQP, XMPP, DDS, WiFi, Raspberry
Pi, Arduino, Android Wear
UDK: 621.397.7-026.364:681.586.6(043.2)
Povzetek
V diplomskem delu predstavimo tehnologije in protokole, ki omogočajo realno-časovno
komunikacijo med mobilnimi aplikacijami in senzorji. Z uporabo protokola MQTT na
praktičnem primeru nadzora ogrevanja stanovanja predstavimo njihovo uporabnost in
lastnosti.
Začnemo z izdelavo senzorja temperature, ki podatke zaznava in sporoča, ter centralnega
strežnika, ki jih obdela, se na njih odzove in jih posreduje do končnega odjemalca.
Nadaljujemo z izdelavo mobilne aplikacije, ki v tem primeru predstavlja končnega
odjemalca. Aplikacija podatke v realnem času prikazuje in uporabniku omogoča nadzor
nad ogrevanjem. Mobilno aplikacijo dopolnimo z izdelavo aplikacije za pametno uro. Ta s
pomočjo obvestil in lokacijskih podatkov uporabnika opozori na vklop ali izklop varčnega
načina ogrevanja. V zaključku dela preverimo, ali smo z uporabo namenske tehnologije
uspeli prihraniti na količini prenesenih podatkov in pohitriti njihovo prejemanje.
iii
Real-time communication between mobile
applications and sensors
Key words: Real-time communication, sensors, internet of things, heating control system,
mobile application, MQTT, HTTP, CoAP, AMQP, XMPP, DDS, WiFi, Raspberry Pi,
Arduino, Android Wear
UDK: 621.397.7-026.364:681.586.6(043.2)
Abstract
In this diploma paper technologies and protocols that enable real-time communication
between mobile applications and sensors are presented. On the basis of the heating
control system, the usefulness and features of the protocol MQTT are described.
We start with the production of temperature sensor and central server. The temperature
sensor detects and reports data and the central server processes, responds, and forwards
data to the final client. Then, the creation of mobile application follows which in this case is
represented as the final client. The application shows the data in real time and it allows
the user to control the heating. The mobile application is updated by the smart watch. The
smart watch alerts the customer via notifications and local data to enable or disable the
energy-efficient heating. In the conclusion we check whether we have saved on the
amount of transferred data and if the data receivement is speeded up.
iv
KAZALO
1 UVOD .............................................................................................................. 1
2 IZDELAVA SENZORJA ZA TEMPERATURO ................................................ 3
2.1 Platforme za izdelavo senzorjev ......................................................................................... 3
2.1.1 Pregled platform ................................................................................................................. 3
2.1.2 Predstavitev izbrane platforme ........................................................................................... 6
2.2 Brezžična komunikacija ....................................................................................................... 8
2.2.1 Pregled tehnologij ............................................................................................................... 8
2.2.2 Predstavitev izbrane tehnologije ........................................................................................ 9
2.3 Izdelava senzorja ................................................................................................................ 13
2.3.1 Uporabljene komponente ................................................................................................. 13
2.3.2 Delovno okolje .................................................................................................................. 13
2.3.3 Programiranje senzorja .................................................................................................... 16
3 KOMUNIKACIJA MOBILNIH APLIKACIJ S SENZORJI .............................. 19
3.1 Opis tehnologij in protokolov za realno-časovno komunikacijo ................................... 19
3.1.1 Predstavitev protokolov .................................................................................................... 20
3.1.2 Predstavitev izbranega protokola MQTT .......................................................................... 24
3.1.2.1 Komunikacija ............................................................................................................ 25
3.1.2.2 Teme......................................................................................................................... 31
3.1.2.3 Zagotavljanje kakovosti storitve (QoS) ..................................................................... 32
3.1.2.4 Zagotavljanje varnosti............................................................................................... 35
3.2 Izdelava centralnega strežnika .......................................................................................... 41
3.2.1 Predstavitev platforme in uporabljenih tehnologij ............................................................. 41
3.2.2 Postavitev strežnika.......................................................................................................... 42
3.2.3 Opis rešitve ....................................................................................................................... 47
3.3 Izdelava mobilne aplikacije ............................................................................................... 61
3.3.1 Predstavitev operacijskega sistema ................................................................................. 61
3.3.2 Razvojno okolje ................................................................................................................ 61
3.3.3 Razvoj grafičnega vmesnika ............................................................................................ 64
3.3.4 Implementacija komunikacije s centralnim strežnikom .................................................... 66
v
3.4 Primerjalna analiza implementacije rešitve s pomočjo izbranih tehnologij v primerjavi
s HTTP ............................................................................................................................................. 74
4 IZDELAVA APLIKACIJE ZA PAMETNO URO ............................................. 79
4.1 Predstavitev Android Wear platforme .............................................................................. 79
4.2 Predstavitev rešitve in opis implementacije .................................................................... 81
5 ZAKLJUČEK ................................................................................................. 84
5.1 Testiranje hipotez ............................................................................................................... 84
5.2 Omejitve diplomskega dela ............................................................................................... 84
5.3 Možne razširitve končne rešitve ....................................................................................... 85
5.4 Sklep .................................................................................................................................... 85
6 VIRI ................................................................................................................ 86
vi
KAZALO SLIK
SLIKA 1.1: NAPOVEDANA RAST NAPRAV POVEZANIH V INTERNET [55] ....................................................... 1
SLIKA 1.2: KOMPONENTE KONČNE REŠITVE ............................................................................................ 2
SLIKA 2.1: BEAGLEBONE BLACK [23] ..................................................................................................... 3
SLIKA 2.2: PARTICLE PHOTON [22] ........................................................................................................ 4
SLIKA 2.3: PLATFORMA C.H.I.P [22] ...................................................................................................... 4
SLIKA 2.4: PLATFORMA INTEL EDISON [22] ............................................................................................. 5
SLIKA 2.5: NAPRAVA ARDUINO UNO [22] ................................................................................................ 5
SLIKA 2.6: PLATFORMA RASPBERRY PI 3 [22] ........................................................................................ 6
SLIKA 2.7: NAPRAVA ARDUINO YUN [31] ................................................................................................ 7
SLIKA 2.8: PRIMER OMREŽJA WIFI ....................................................................................................... 10
SLIKA 2.10: SHEMA VEZAVE KOMPONENT ZA IZDELAVO SENZORJA TEMPERATURE [53] ........................... 13
SLIKA 2.11: ARDUINO RAZVOJNO OKOLJE ............................................................................................. 14
SLIKA 2.12: REZULTAT PREVAJANJA IN PRENOSA PROGRAMA NA MIKROKONTROLER ............................... 18
SLIKA 3.1: SHEMA NAJPRIMERNEJŠE UPORABE POSAMEZNEGA PROTOKOLA Z ODZIVNOSTJO [18] ............ 19
SLIKA 3.2: PRIKAZ SHEME XMPP ZA NASLAVLJANJE [18] ...................................................................... 20
SLIKA 3.3: PRIKAZ SUBJEKTOV DOMENE DDS [20] ............................................................................... 21
SLIKA 3.4: POTEK KOMUNIKACIJE MED ODJEMALCI AMQP .................................................................... 22
SLIKA 3.5: PRIKAZ TOKA SPOROČIL ZA POTRDITVENI (LEVO) IN NEPOTRDITVENI (DESNO) ZAHTEVEK......... 22
SLIKA 3.6: PRIMER VZORCA OBJAVI/NAROČI ......................................................................................... 25
SLIKA 3.7: VZPOSTAVITEV KOMUNIKACIJE MED ODJEMALCEM IN POSREDNIKOM ...................................... 26
SLIKA 3.8: PRIMER CONNECT IN CONNACK PAKETA ........................................................................ 27
SLIKA 3.9: TOK PUBLISH PAKETA ...................................................................................................... 28
SLIKA 3.10: PRIMER PUBLISH IN OPCIJSKEGA PUBACK PAKETA ........................................................ 29
SLIKA 3.11: PRIMER SUBSCRIBE IN SUBACK PAKETA ...................................................................... 29
SLIKA 3.12: ZAPOREDJE IZMENJAVE PAKETOV OB PRIJAVI NA TEMO ....................................................... 30
SLIKA 3.13: PRIMERK PAKETOV UNSUBSCRIBE IN UNSUBACK ....................................................... 30
SLIKA 3.14: ZAPOREDJE IZMENJAVE PAKETOV OB PRIJAVI NA TEMO ....................................................... 30
SLIKA 3.15: STRUKTURA IMENA TEME IN PRIMERI IMEN TEM [7] .............................................................. 31
SLIKA 3.16: PRIMER UPORABE ENONIVOJSKE SUBSTITUCIJE IMENA TEME [7] .......................................... 31
SLIKA 3.17: PRIMER UPORABE VEČNIVOJSKE SUBSTITUCIJE IMENA TEME [7] .......................................... 32
SLIKA 3.18: MQTT QOS NIVO 0 .......................................................................................................... 33
SLIKA 3.19: MQTT QOS NIVO 1 .......................................................................................................... 34
SLIKA 3.20: MQTT QOS NIVO 2 .......................................................................................................... 34
SLIKA 3.21: ŠIFRIRANJE POVEZAVE MED POŠILJATELJEM IN PREJEMNIKOM ............................................. 36
SLIKA 3.22: ŠIFRIRANJE POVEZAVE MED POŠILJATELJEM IN POSREDNIKOM ............................................ 37
SLIKA 3.23: TOK KOMUNIKACIJE MQTT PRI AVTORIZACIJI OAUTH 2.0 ................................................... 39
vii
SLIKA 3.24: POVEČANA PROCESORSKA ZMOGLJIVOSTI POSAMEZNE GENERACIJE RASPBERRY PI [39] ..... 41
SLIKA 3.25: ORODJE ZA OSNOVNO KOFIGURACIJO RASPBERRY PI ......................................................... 44
SLIKA 3.26: KONFIGURACIJSKA SHEMA CENTRALNEGA STREŽNIKA IN SENZORJEV ................................... 47
SLIKA 3.27: ER MODEL PODATKOVNE BAZE .......................................................................................... 51
SLIKA 3.28: ZASLONSKA SLIKA PRIJAVNEGA OKNA ................................................................................ 55
SLIKA 3.29: ZASLONSKA SLIKA PRIVZETE STRANI NADZORNE PLOŠČE Z OZNAČENIMI ELEMENTI ................ 56
SLIKA 3.30: ZASLONSKA SLIKA SEZNAMA ODJEMALCEV ......................................................................... 57
SLIKA 3.31: ZASLONSKA SLIKA SPREMINJANJA NASTAVITEV ................................................................... 57
SLIKA 3.32: ZASLONSKA SLIKA PRIKAZA STATISTIKE .............................................................................. 58
SLIKA 3.33: GRAFIČNI VMESNIK RAZVOJNEGA OKOLJA ANDROID STUDIO ............................................... 63
SLIKA 3.34: ZASLONSKA SLIKA MOBILNE APLIKACIJE, LEVO BREZ IZBRANEGA PROSTORA IN DESNO Z
IZBRANIM PROSTOROM ................................................................................................................ 64
SLIKA 3.35: ZASLONSKA SLIKA DIALOGA ZA SPREMEMBO NASTAVLJENE TEMPERATURE LEVO IN DIALOGA ZA
VKLOP/IZKLOP OGREVANJA DESNO ............................................................................................... 65
SLIKA 3.36: ZASLONSKA SLIKA ZAJEMA PODATKOV S POMOČJO PROGRAMA WIRESHARK ........................ 75
SLIKA 3.37: VELIKOST POSLANIH PODATKOV GLEDE NA ŠTEVILO POSLANIH SPOROČIL ............................ 76
SLIKA 3.38: TRAJANJE POŠILJANJA SPOROČIL GLEDE NA ŠTEVILO POSLANIH SPOROČIL .......................... 77
SLIKA 4.1: PAMETNA URA MOTO 360 PODJETJA MOTOROLA [50] .......................................................... 79
SLIKA 4.2: PODOBA URE S POGLEDOM KARTICE Z VRHA TOKA [49] ......................................................... 80
SLIKA 4.3: ZAČETNI ZASLON APLIKACIJE (LEVO) IN KARTICA PROSTORA (DESNO) .................................... 81
SLIKA 4.4: ZASLON ZA SPREMEMBNO VREDNOSTI TEMPERATURE (LEVO) IN VKLOPA/IZKLOPA OGREVANJA
(DESNO) ..................................................................................................................................... 82
SLIKA 4.5: OBVESTILO OB ODHODU OD DOMA (LEVO) IN VRAČANJU DOMOV (DESNO) ............................... 83
viii
KAZALO TABEL
TABELA 2.1: PREGLED BREZŽIČNIH TEHNOLOGIJ PO KLJUČNIH LASTNOSTIH [34] ....................................... 9
TABELA 3.1: PREDNOSTI IN LASTNOSTI POSAMEZNIH MEHANIZMOV ZA PODPISOVANJE SPOROČILA [16] .... 38
TABELA 3.2: NAJPOMEMBNEJŠE KARAKTERISTIKE POSAMEZNE GENERACIJE RASPBERRY PI ................... 42
TABELA 3.3: OPIS METOD PROGRAMSKEGA VMESNIKA .......................................................................... 58
TABELA 3.4: SEZNAM MQTT TEM ........................................................................................................ 60
TABELA 3.5: KONFIGURACIJA RAČUNALNIKOV ZA ANALIZO ..................................................................... 74
ix
SEZNAM UPORABLJENIH KRATIC
ADT Android Developer Tools
AES Advanced Encryption Standard
AMQP Advanced Message Queuing Protocol
BOSH Bidirectional streams over Synchronous HTTP
CoAP Constrained Application Protocol
CRL Certificate revocation list
D2D Device-to-device
D2S Device-to-server
DDS Data Distribution Service
GCM Google Cloud Messaging
GMS Google Mobile Services
GSM Global System for Mobile Communications
HDMI High-Definition Multimedia Interface
HTTP Hypertext Transfer Protocol
I2C Inter-Integrated Circuit
IP Internet Protocol
JDK Java Development Kit
JSON JavaScript Object Notation
MAC Media access control
MIT Massachusetts Institute of Technology
MQTT Message Queuing Telemetry Transport
OCSP Online Certificate Status Protocol
PWM Pulse-width modulation
QoS Quality of service
RF Radio frequency
S2S Server-to-server
SBC Single Board Computers
SD Secure Digital
SDK Software development kit
SIM Subscriber identity module
SOC System on Chip
SSH Secure Shell
x
TCP Transmission Control Protocol
TKIP Temporal Key Integrity Protocol
TLS Transport Layer Security
UART Universal asynchronous receiver/transmitter
UDP User Datagram Protocol
URL Uniform Resource Locator
USB Universal Serial Bus
UTF Unicode Transformation Format
UUID Universally unique identifier
VPN Virtual private network
WEP Wired Equivalent Privacy
WiFi Wireless Fidelity
WLAN Wireless local area network
WPA Wi-Fi Protected Access
WPAN Wireless personal area network
XML Extensible Markup Language
XMPP Extensible Messaging and Presence Protocol
Realno-časovna komunikacija mobilnih aplikacij s senzorji
1
1 UVOD
Živimo v svetu, kjer smo v vsakem trenutku življenja obdani s številnimi elektronskimi
napravami, ki so povezane v internet. Te postajajo vedno pametnejše in s pomočjo
različnih senzorjev nudijo številne informacije, s pomočjo katerih želijo izboljšati ter olajšati
življenje. Da te informacije na hiter ter učinkovit način dosežejo uporabnika, se vse
pogosteje kot končni odjemalci uporabljajo pametni telefoni in tablice, saj ti postajajo
vedno zmogljivejši, so ves čas povezani v omrežje in uporabniku konstantno na voljo.
Raziskava družbe Gartner napoveduje, da se bo število povezanih naprav do leta 2020
povzpelo na 26 milijard, kar je skoraj 30-kratno povečanje v primerjavi z letom 2009, ko je
ta številka znašala 0.9 milijard. Napovedane številke presegajo celo napovedi za pametne
telefone, tablice in računalnike, ki naj bi se do takrat povzpele do 7.3 milijarde naprav [54].
Slika 1.1: Napovedana rast naprav povezanih v internet [55]
Z večanjem števila teh naprav se veča tudi količina podatkov, ki se pretakajo po omrežju.
Ključnega pomena postaja, da so ti podatki dostavljeni pravočasno, učinkovito in na način,
ki omogoča preprost pregled in nadzor nad njimi.
Zaradi zgoraj naštetih ugotovitev pridobivajo na pomembnosti tudi tehnologije in protokoli,
ki to medsebojno komunikacijo omogočajo. V diplomskem delu jih bomo na kratko
predstavili in na praktičnem primeru nadzora ogrevanja stanovanja pokazali njihovo
Realno-časovna komunikacija mobilnih aplikacij s senzorji
2
uporabnost. Pri tem se bomo posebej posvetili realno-časovnemu vidiku takšne
komunikacije, saj ta po našem mnenju vse bolj pridobiva na relevantnosti. To dokazujejo
tudi številna vlaganja v podjetja, ki se ukvarjajo s to tematiko (Realtime.com 100 milijonov
USD, Firebase 7 milijonov USD, Meteor 11 milijonov USD, PubNub 15.5 milijonov USD,
Pusher 1 milijon USD) [51]. Na tem mestu moramo poudariti, da v kontekstu spleta z
realnim časom mislimo na mehki realni čas. Pomembno je, da je čas, med katerim se je
ustvaril podatek ali nastopil dogodek, dovolj majhen, da le-ta ne izgubi na relevantnosti.
Odzivni časi, ki jih pri takšni komunikaciji lahko dosežemo so pod 300 ms, po nekaterih
meritvah strokovnjakov pa v povprečju tudi pod 100 ms [56].
Diplomsko delo se začne z izdelavo senzorja temperature, ki podatke zaznava ter
sporoča, in centralnega strežnika, ki jih obdela, se na njih odzove ter jih posreduje do
končnega odjemalca. Nadaljuje se z izdelavo mobilne aplikacije, ki v našem primeru
predstavlja končnega odjemalca. Aplikacija podatke v realnem času prikazuje in omogoča
nadzor nad ogrevanjem. V zadnjem delu se posvetimo izdelavi aplikacije za pametno uro,
ki s pomočjo obvestil, ki se zavedajo svoje okolice, dodatno obogati uporabniško izkušnjo.
To zagotovimo z uporabo lokacijskih podatkov in zaznavanja domačega omrežja, kar
omogoča prikaz obvestila v trenutku, ko uporabnik odhaja ali se vrača domov. V primeru
odhoda ga z obvestilom opozorimo, da lahko z vklopom varčnega načina ogrevanja
prihrani na energiji. V primeru vklopljenega varčnega načina ogrevanja pa mu ob prihodu
domov s pomočjo obvestila ponudimo možnost preprostega izklopa. V zaključku naloge
bomo preverili, ali smo z uporabo namenske tehnologije uspeli prihraniti na količini
prenesenih podatkov in pohitriti njihovo prejemanje. Za večjo preglednost smo na sliki 1.2
predstavili komponente končne rešitve in njihovo medsebojno odvisnost.
Slika 1.2: Komponente končne rešitve
Realno-časovna komunikacija mobilnih aplikacij s senzorji
3
2 IZDELAVA SENZORJA ZA TEMPERATURO
2.1 Platforme za izdelavo senzorjev
2.1.1 Pregled platform
Prvi korak pri izdelavi končne rešitve je izdelava prototipa senzorja za temperaturo, ki bo
podatke brezžično pošiljal do centralnega strežnika. Zaradi raznolikosti področja, kjer se
te naprave lahko uporabljajo, obstajajo številne razvijalske platforme za izdelavo
prototipov, ki se med seboj razlikujejo po zmogljivosti, ceni, funkcionalnosti in namenu
uporabe. Izbiramo lahko med napravami, temelječimi na mikro kontrolerju, sistemih na
čipu (SOC - System on Chip), enokartičnimi računalniki (SBC - Single Board Computers)
in namenskimi sistemi [22]. Poleg uveljavljenih sistemov, ki že dlje časa obstajajo na trgu,
venomer na trg prihajajo nove rešitve, ki izboljšujejo konkurenco in ponujajo razvijalcu
večjo izbiro. V nadaljevanju bomo predstavili ožji izbor naprav, ki najbolje izpolnjujejo
zahteve za našo rešitev, in izbrano tudi podrobneje opisali.
Beaglebone Black je zelo znana nizkocenovna platforma za prototipiranje. Snovana je
okoli procesorja ARM Cortex A8 s taktom 1GHz, s 512 MB pomnilnika in 4 GB spomina
(slika 2.1). Ima že vgrajen mrežni in priključek HDMI (High-Definition Multimedia
Interface), dodatna povezljivost pa se lahko razširi s pomočjo vmesnika USB (Universal
Serial Bus). Je združljiva z različnimi, na Linuxu temelječimi operacijskimi sistemi (Debian,
Ubuntu, Android …). Ima zelo množično in aktivno skupnost, kar naredi platformo posebej
primerno za začetnike [23].
Slika 2.1: Beaglebone Black [23]
Particle Photon je ena manjših naprav za prototipiranje na trgu. Poganja jo procesor
STM32F205 120Mhz ARM Cortex M3, s 128 KB pomnilnika in 1 MB prostora. Za
Realno-časovna komunikacija mobilnih aplikacij s senzorji
4
povezljivost skrbi Broadcom BCM43362 WiFi modul. Zaradi majhnosti in nizke porabe je
idealna za uporabo v senzorjih, povezanih na internet [22]. Prikazuje jo slika 2.2.
Slika 2.2: Particle Photon [22]
C.H.I.P je zelo nova platforma, ki prepriča predvsem z nizko ceno (slika 2.3). Za
povezljivost že ima vgrajen Bluetooth 4.0 in WiFi B/G/N modul. Ima procesor Allwinner R8
1 GHz, 512 MB pomnilnika in 4 GB spomina za namestitev operacijskega sistema in za
shranjevanje podatkov, kar pomeni, da za delovanje ne potrebuje dodatne kartice SD
(Secure Digital). Ima 8 splošno namenskih vhodno/izhodnih zatičev, na katere je mogoče
povezati raznolike senzorje. Podpira PWM (Pulse-width modulation), UART (Universal
asynchronous receiver/transmitter) in I2C (Inter-Integrated Circuit) za opravljanje z
različnimi motorji in aktuatorji. Za operacijski sistem uporablja posebno distribucijo Debian
Linux in preko dodatkov omogoča razširljivost [22].
Slika 2.3: Platforma C.H.I.P [22]
Realno-časovna komunikacija mobilnih aplikacij s senzorji
5
Intel Edison je razvojna platforma v informacijski tehnologiji zelo znanega podjetja Intel.
Spada med zmogljivejše, saj jo poganja procesor Intel Atom in 32 bitni mikrokontroler Intel
Quark. Poleg tega ima 1 GB DDR pomnilnika in 4 GB prostora, ki je s pomočjo kartice SD
dodatno razširljiv. Povezljivost preko Bluetooth 4.0 in WiFi je že vgrajena v napravo, kar
izniči potrebo po dodatnih zunanjih modulih [22]. Naprava je upodobljena na sliki 2.4.
Slika 2.4: Platforma Intel Edison [22]
Platforma Arduino, prikazana na sliki 2.5, je ena starejših, vendar še vedno najpogostejša
izbira tako začetnikov kakor tudi izkušenih razvijalcev. Je ena prvih razvojnih platform,
temelječih na mikrokontrolerju. Na voljo imamo različne verzije, ki se razlikujejo po
funkcionalnosti in povezljivosti. Za nas zanimiva je predvsem verzija Yun, ki ima že
vgrajeno mrežno in WiFi povezavo. Arduino ima največjo skupnost, ki nudi veliko
podpore, naprave so razširljive z različnimi senzorji in aktuatorji. Zaradi omenjenih
lastnosti smo platformo izbrali za izdelavo senzorja, zato bo naprava v naslednjem
poglavju opisana podrobneje.
Slika 2.5: Naprava Arduino Uno [22]
Raspberry Pi s slike 2.6 spada med najbolj popularne platforme. Trenutno je aktualna
tretja verzija naprave, ki ima kot prva že vgrajen modul WiFi 801.11n in Bluetooth 4.1, kar
napravo uvršča med najbolj kompaktne računalniške sisteme. Napravo poganja štiri jedrni
Realno-časovna komunikacija mobilnih aplikacij s senzorji
6
procesor ARM Cortex-A53 s taktom 1.2 GHz in 1 GB pomnilnik. Dodatno naprava ponuja
omrežni, HDMI in USB priključek. Sistem je kompatibilen z različnimi distribucijami Linux
operacijskega sistema, najpogosteje na njem teče prilagojena distribucija Debian Linux,
imenovana Respbian. Pogosto se s strani manj tehničnih uporabnikov uporablja kot
multimedijski center. Zmogljivost, nizka poraba, neslišno delovanje ter združljivost so
glavni razlogi, zakaj smo omenjeni sistem izbrali za centralni strežnik naše rešitve in ga
bomo v podpoglavju 2.2 tudi podrobneje predstavili [22].
Slika 2.6: Platforma Raspberry Pi 3 [22]
2.1.2 Predstavitev izbrane platforme
Arduino je odprtokodna platforma, sestavljena iz programske opreme in elektronskih
komponent, ki so preproste za uporabo. Platformo je razvil inštitut Ivrea Interaction Design
Institute za študente, ki so se spoznavali z elektroniko in programiranjem, kot preprosto
orodje za prototipiranje. Namenjena je za uporabo tako začetnikov kakor tudi izkušenih
inženirjev.
Naprave se lahko na eni strani preko vhodnih vtičev povežejo z različnimi senzorji, kot so
senzorji temperature, vlage, vode, dima ali plinov in na drugi strani preko izhodnih vtičev
nadzorujejo aktuatorje, kot so svetila, motorji ali stikala. S pomočjo Arduino programskega
jezika in razvojnega okolja se lahko na preprost način prenesejo inštrukcije na
mikrokontroler, s čimer definiramo obnašanje naprave. Srce vsake naprave je 8-, 16- ali
32- bitni Atmel AVR mikrokontroler, najpogosteje je to ATmega8, ATmega168,
ATmega328, ATmega1280 in ATmega2560. Naprave obstajajo v različnih verzijah, ki se
med samo razlikujejo po zmogljivosti in funkcionalnosti. Med osnovne spadajo Arduino
Uno, Micro in Pro Mini. Zmogljivejše med njimi se imenujejo Mega, Zero in Yun. Poleg
uradnih verzij obstajajo tudi kompatibilne, ki jih izdelujejo tretji proizvajalci. Za vse
obstajajo različni dodatki, ki na preprost način omogočajo dodatne funkcionalnosti (Energy
Shield, Relay Shield, Music Shield, MicroSD Shield, BLE Shield, Joystick Shield, ipd) [31].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
7
Projekti, ki platformo uporabljajo, segajo od preprostih senzorjev vse do kompleksnih
znanstvenih inštrumentov, ki jih razvija velika skupnost, sestavljena iz študentov,
raziskovalcev, razvijalcev, programerjev in hobiistov iz celega sveta. Ta skupnost je
ustvarila veliko bazo znanja, ki je preprosto dostopna začetnikom, zaradi česar
popularnost platforme hitro narašča. Dodatno k naraščanju popularnosti platforme
pripomore njena enostavnost, predvsem pa nizka cena [30]. Najcenejšo in hkrati tudi
najpreprostejšo verzijo lahko sestavi uporabnik sam, z le nekaj elektronskimi
komponentami, ki ga stanejo manj kot 10 €. Sestavljeno pa lahko dobi že tudi za 30 €.
Na podlagi dostopnosti, preprostosti in obsežne skupnosti smo tudi sami izbrali to
platformo za izdelavo senzorja temperature, ki bo vrednosti preko izbranega protokola
sporočal centralnemu strežniku. Med različnimi modeli, ki so na voljo, naše potrebe
najbolje zadovoljuje model Yun, saj ima med drugim že vgrajen modul za brezžično
komunikacijo. Poganja ga Atmel ATmega32u4 mikrokontroler, ki nudi 20 vhodno-izhodnih
vtičev, od katerih jih je 7 uporabnih za izhodni PWM in 12 kot analogni vhodi. Ima 32 kB
hitrega spomina (od tega je 4 kB porabljenega za nalagalnik), 2.5 kB SRAM-a in 1 kB
EEPROM-a. Dodatno ima že vgrajeno komunikacijo USB. Posebnost naprave je dodatni
procesor Atheros AR9331, na katerem teče Linux distribucija OpenWrt-Yun, ki predstavlja
prilagojeno verzijo distribucije OpenWrt, dobro poznane v svetu interneta stvari. Ta ima 64
mB DDR2 pomnilnika in 16 mB hitrega spomina. Dodatni procesor skrbi za brezžično,
žično in USB komunikacijo. Tudi microSD vhod, kamor lahko shranimo izmerjene ali
analitične podatke, je v domeni AR9331. Interakcija med procesorjema poteka preko
posebne knjižnice, imenovane Bridge, ki ukaze pošilja preko serijske komunikacije. To
omogoča Arduino komunikacijo s perifernimi enotami. Zaradi dveh procesorjev in večje
izbire vmesnikov sodi model med energijsko bolj potratne . Napaja se preko 5V micro-
USB priklopa. Fizična dimenzija naprave je 73 mm dolžine in 53 mm širine in tehta 32 g
[52].
Slika 2.7: Naprava Arduino Yun [31]
Realno-časovna komunikacija mobilnih aplikacij s senzorji
8
2.2 Brezžična komunikacija
2.2.1 Pregled tehnologij
Izbrana naprava iz prejšnjega poglavja že nakazuje na tehnologijo, ki jo bomo v našem
primeru uporabili pri brezžični komunikaciji. Ker obstaja več različnih tehnologij, ki se med
sabo razlikujejo tako po lastnostih (hitrost, poraba energije, domet, varnost, zanesljivost)
kakor tudi namembnosti uporabe, jih bomo v tem poglavju kljub temu na kratko predstavili
in v naslednjem podpoglavju nekoliko podrobneje opisali lastnosti izbrane tehnologije.
Komunikacija spada med najpomembnejše dele senzorja, zato je izbira prave tehnologije
bistvenega pomena. Med najpogosteje uporabljene spadajo Wifi, Bluetooth, Zigbee, GSM
(Global System for Mobile Communications) in RF (Radio frequency) [32].
Bluetooth je brezžični standard za izmenjavo podatkov na kratki razdalji. Je zelo pogosto
uporabljen, še posebej s predstavitvijo razširitve Bluetooth LE (Low Energy), ki s sabo
prenaša predvsem nizko porabo. To omogoča izdelavo naprav, ki se napajajo preko
baterije, z avtonomijo tudi do dveh let. Uporablja se pri krajših razdaljah in ni namenjen
prenosu datotek, ampak manjšim kosom podatkov. To ga naredi zelo primernega za
uporabo v različnih senzorjih [32]. Deluje na frekvenci 2.4 GHz in ima v aktualni verziji 4.2
domet od 50 do 100 metrov in dosega podatkovno hitrost do 1 Mbps [33].
Zigbee se imenuje specifikacija za paket visoko nivojskih komunikacijskih protokolov, ki se
uporabljajo za vzpostavitev zasebnih omrežij (WPAN - Wireless personal area network),
sestavljenih iz malih digitalnih radiev z nizko porabo. Standard nosi oznako IEEE
802.15.41. Zaradi nizke porabe je domet omejen od 10 do 100 metrov. Doseg lahko
povečamo z vzpostavitvijo mesh omrežja, ki preko vmesnih naprav poveča domet [32].
Podobno kot Bluetooth, tudi Zigbee deluje na frekvenci 2.4 GHz, vendar se pogosteje
uporablja v industriji in kadar poteka podatkovna izmenjava redkeje. Ima manjšo
podatkovno hitrost – do 230 Kbps. Aktualna verzija je 3.0 [33].
Kadar se morajo podatki pošiljati preko daljših razdalj in oddaljenih krajev, se
najpogosteje odločimo za uporabo mobilnega omrežja GSM/3G/4G. Prednost je
predvsem zanesljivost in hitrost prenosa – tudi do 10 Mbps. Posledično za svoje
delovanje potrebuje veliko več energije. Dodatno je potrebna kartica SIM (Subscriber
1 https://standards.ieee.org/getieee802/download/802.15.4-2011.pdf
Realno-časovna komunikacija mobilnih aplikacij s senzorji
9
identity module), ki je pogosto pogojena z naročnino in dodatnim zaračunavanjem
prenosa podatkov. Deluje na frekvenci 900/1800/1900/2100 MHz [33].
WiFi je zelo pogosta izbira predvsem, ker je v večini domov infrastruktura za namene
domačega omrežja že vzpostavljena. Omogoča hiter prenos in soliden domet. Vendar
posledično za delovanje potrebuje več energije in zahteva licenciranje strojne opreme, kar
naredi rešitev nekoliko dražjo. Kot že omenjeno, smo zaradi univerzalnosti, razširjenosti in
zanesljivosti za brezžičen prenos podatkov izbrali to tehnologijo. Iz tega razloga se bomo
tehnologiji v naslednjem podpoglavju nekoliko podrobneje posvetili.
Omeniti je potrebno tudi različne module RF, kot najcenejšo izbiro, ki brezžično
komunikacijo omogočajo za bistveno nižjo ceno. Takšna komunikacija je manj zanesljiva,
na krajše razdalje in z nizko podatkovno hitrostjo. Najpogosteje se uporablja pri direktni
komunikaciji med dvema napravama. Tehnologije smo v tabeli 2.1 za lažjo preglednost
razvrstili po ključnih lastnostih.
Tabela 2.1: Pregled brezžičnih tehnologij po ključnih lastnostih [34]
Tehnologija Frekvenca Domet Hitrost Poraba Varnost
WiFi 2,4 GHz 100 m 6-780 Mbps 1 W WPA, WPA2
Bluetooth 2,4 GHz 100 m do 3 Mbps 1 W 128 bit
Bluetooth LE 2,4 GHz 100 m do 1 Mbps 10-500 mW 128 bit AES
Zigbee 2,4 Ghz 10 m do 250 Kbps 1 mW 128 bit
GSM 900/1800/
1900/2100
Mhz
25 km do 1 Gbps 3 W GEA3, GEA4
RF-modul do 1 Ghz 50 m 20 Kbps 1 mW -
2.2.2 Predstavitev izbrane tehnologije
WiFi (Wireless Fidelity) je brezžična tehnologija, ki računalnikom in drugim napravam
omogoča medsebojno povezavo in povezavo v brezžična lokalna omrežja (WLAN -
Wireless local area network) (slika 2.8). Protokol je bil leta 1997 standardiziran pod
oznako IEEE 802.112. Implementacija standarda je bila draga in zahtevna, saj je
2 http://standards.ieee.org/getieee802/download/802.11-2012.pdf
Realno-časovna komunikacija mobilnih aplikacij s senzorji
10
vsebovala več kot 400 strani. Zaradi tega sta bila leta 1999 razvita standarda IEEE
802.11a1 in IEEE 802.11b1. Prvi zaradi manj motenj deluje na frekvenci 5 GHz in dosega
hitrosti do 54 Mbps. Zaradi frekvence ima protokol manjši domet, saj ima frekvenca večje
težave s preprekami. Na popularnosti je WiFi začel pridobivati z drugim standardom, ki je
deloval na običajni frekvenci (2,4 GHz) in je omogočal hitrosti do 11 Mbps [35].
Slika 2.8: Primer omrežja WiFi
Tehnologija se je najpogosteje uporabljala za dostop do interneta. Ker se je z njegovim
razvojem povečevala tudi zahteva po večji hitrosti, se je leta 2003 oblikoval standard IEEE
802.11g3, ki je dvignil hitrost prenosa podatkov do 54 Mbps tudi na običajni frekvenci.
Medtem ko se prva dva standarda več ne uporabljata, je IEEE 802.11g v uporabi še
danes. Danes se tehnologija uporablja v računalnikih, tiskalnikih, igralnih konzolah,
televizorjih, tablicah, telefonih in drugih napravah, ki komunicirajo z zunanjim svetom [35].
Leta 2009 je bil predstavljen nov standard, imenovan IEEE 802.11n4. Standard se je
uveljavil počasi, a ga trenutno podpira večina usmerjevalnikov, dostopnih točk in
računalnikov. Posebnost protokola je, da lahko deluje na obeh frekvencah (2,4 GHz in 5
GHz) in lahko za delovanje uporablja več kanalov. Preko enega kanala lahko doseže
maksimalno podatkovno hitrost 150 Mbps, kar skupaj znaša 600 Mbps. Za dosego te
hitrosti je potrebna strojna podpora na obeh koncih komunikacijskega kanala. Zaradi
3 https://standards.ieee.org/findstds/standard/802.11g-2003.html
4 https://standards.ieee.org/findstds/standard/802.11n-2009.html
Realno-časovna komunikacija mobilnih aplikacij s senzorji
11
razvoja različnih standardov je pomembno, da so novejši združljivi s starejšimi. V primeru
komunikacije dveh naprav, ki podpirata enak standard, to ne predstavlja problema, kadar
pa med sabo komunicirata napravi z različnima standardoma, bo hitrost komunikacije na
nivoju najpočasnejšega standarda [35].
Trenutno najnovejši standard je bil predstavljen leta 2014 in se imenuje IEEE 802.11ac5.
Predstavlja peto generacijo naprav, ki lahko podatke pretakajo po omrežju s hitrostjo do 1
Gbps. Hitrost prenosa podatkov posameznega standarda je prikazan na sliki 2.9.
Slika 2.9: Hitrost prenosa podatkov posameznega standarda WiFi [37]
Novi standard poleg hitrosti poveča tudi število naprav, ki so lahko istočasno povezane na
usmerjevalnike in dostopne točke, ter zmanjšuje motnje med napravami. Novi standard
pride do izraza pri pretoku video vsebin visoke ločljivosti, igranju iger, sinhronizaciji in
varnostnih kopijah naprav ter deljenju večjih datotek znotraj lokalnega omrežja [36].
Seveda hitrost prenosa ni edini faktor, na podlagi katerega se brezžične tehnologije med
sabo razlikujejo. WiFi je namenjen brezžični komunikaciji naprav, ki so med sabo
oddaljene do 100 m. Različne ovire pa lahko to razdaljo drastično zmanjšajo. S pomočjo
močnejših zunanjih anten se lahko domet kljub vsemu drastično poveča [36].
Pri uporabi protokola za namene brezžične komunikacije med senzorji in aktuatorji je
velikega pomena tudi varnost omrežja. Standard podpira različne možnosti zaščite.
Najpogosteje so na voljo WEP (Wired Equivalent Privacy), WPA-PSK (TKIP), WPA-PSK
(AES), WPA2-PSK (TKIP) in WPA2-PSK (AES). Čeprav je mogoče vzpostaviti brezžično
5 http://standards.ieee.org/news/2014/ieee_802_11ac_ballot.html
Realno-časovna komunikacija mobilnih aplikacij s senzorji
12
omrežje brez zaščite, je priporočljivo, da omrežje zaščitimo z eno od teh možnosti.
Najstarejša in tudi najranljivejša izbira je WEP. Priporočeno je, da se uporabi WPA-PSK
ali WPA2-PSK, pri čemer je TKIP (Temporal Key Integrity Protocol) starejši standard za
šifriranje podatkov in se ne smatra več za varnega. Največjo raven zaščite zatorej
omogoča WPA2-PSK (AES), ki pa lahko posledično upočasni hitrost prenosa podatkov na
manj zmogljivi strojni opremi. Opisan protokol bo zagotavljal, da bomo senzor, izdelan v
naslednjem poglavju, varno, zanesljivo in hitro brezžično povezali do centralnega
strežnika, kamor bo lahko pošiljal izmerjene podatke.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
13
2.3 Izdelava senzorja
2.3.1 Uporabljene komponente
Slika 2.10: Shema vezave komponent za izdelavo senzorja temperature [53]
Komponente na sliki 2.10:
1. Arduino Yun, podrobneje opisan v podpoglavju 1.1.2.
2. DHT11, nizkocenovni digitalni senzor temperature in relativne zračne vlažnost z
naslednjimi lastnostmi:
a. od 3 do 5 V napajalna napetost;
b. 2.5 mA maksimalna poraba toka (med branjem vrednosti);
c. merjenje relativne zračne vlažnosti v območju 20-80% z natančnostjo 5 %;
d. merjenje temperature zraka med 0-50 °C z natančnostjo +-2 °C;
e. frekvenca merjenja 1 Hz;
f. velikost 15.5 x 12 x 5.5 mm.
3. Upor z upornostjo 4.7 K ohmov.
4. Žičke za povezavo.
2.3.2 Delovno okolje
Poleg odprtokodne strojne opreme je na voljo tudi odprtokodno razvojno okolje,
imenovano Arduino IDE, ki poskrbi za celovitost platforme. Izdelano je v programskem
jeziku Java in mogoča pisanje in prevajanje programov ter programiranje podprtih naprav.
Okolje je sestavljeno iz tekstovnega urejevalnika za pisanje kode, okna za sporočila,
tekstovne konzole, menija, serijskega monitorja in orodne vrstice z gumbi za najpogosteje
Realno-časovna komunikacija mobilnih aplikacij s senzorji
14
uporabljene funkcije (Verify, Upload, New, Open, Save in Serial Monitor). Vsi elementi so
prikazani na sliki 2.11. Okolje vsebuje podporo za različne naprave in osnovne knjižnice,
le-te se lahko dodatno razširijo preko tretjih ponudnikov. Aktualna verzija v času
namestitve je 1.6.10 in podpira operacijske sisteme Windows, Max OS X in Linux. Na
voljo je tako v 32- kakor tudi 64-bitni verziji [26].
Slika 2.11: Arduino razvojno okolje
Senzor bomo programirali na operacijskem sistemu Ubuntu 16.04. Za namestitev je tako
najprej potrebno iz uradne strani6 prenesti arhiv (datoteka arduino-1.6.10-linux64.tar.xz)
na lokalni računalnik. Namestitev se nadaljuje preko tekstovne konzole, kjer se
pomaknemo do mape, kamor smo arhiv prenesli, ga razširimo in poženemo ukaz za
namestitev [29].
6 https://www.arduino.cc/en/Main/Software
Realno-časovna komunikacija mobilnih aplikacij s senzorji
15
Preden smo začeli z uporabo razvojnega okolja, smo Arduino Yun preko vmesnika USB
povezali na računalnik. Z ukazom smo ugotovili, na katerem vmesniku je prepoznan in
uporabnika dodali med člane skupine, ki ima pravice za komunikacijo s priključeno
napravo [29].
Okolje smo s pomočjo bližnjice na namizju zagnali. Pravilnost namestitve in delovanja
smo preverili tako, da smo preko menija 'File > Examples > 01.Basic > Blink' naložili
osnovni program Blink, ki je kot primer že vključen v razvojno okolje. Preden smo program
prenesli na priključeno napravo, smo jo izbrali v meniju 'Tools > Board > Arduino Yun' in
okolju v meniju 'Tools > Port > /dev/ttyACM0' sporočili, preko katerih vrat je naprava
dosegljiva. S klikom na gumb 'Upload' v orodni vrstici smo program prevedli in ga prenesli
na napravo. Po uspešnem prenosu se je v statusni vrstici pokazalo sporočilo ' Done
uploading', na napravi pa je začela utripati oranžna led dioda, ki je priključena na vtič 13,
kar je potrdilo uspešnost, saj je naložen program narekoval ravno takšno obnašanje [29].
Programi se v Arduino razvojnem okolju pišejo v tekstovnem urejevalniku in se shranjujejo
v datoteko s končnico ino. Preden se program prenese na napravo, ga je potrebno
preveriti in prevesti. Morebitne napake pri preverjanju ali prevajanju se izpišejo v polje s
sporočili. Programi se pišejo v jeziku C\C++ in se prevedejo s prevajalnikom avr-gcc v
strojno kodo [24]. Ob zagonu programa se kliče funkcija setup, katere namen je
inicializacija spremenljivk in knjižnic. Funkcija se kliče samo enkrat, ob zagonu naprave.
Ko se funkcija setup uspešno izvede, se kliče funkcija loop, ki se v nedogled izvaja v zanki
[25]. Minimalno strukturo Arduino programa naslednji izsek kode:
uporabnik@prenosnik:~$ ls -l /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 jul 27 14:51 /dev/ttyACM0
uporabnik@prenosnik:~$ sudo usermod -a -G dialout uporabnik
uporabnik@prenosnik:~$ cd Downloads/
uporabnik@prenosnik:~/Downloads$ tar -xvzf arduino-1.6.10-linux64.tar.xz
uporabnik@prenosnik:~/Downloads$ cd arduino-1.6.10/
uporabnik@prenosnik:~/Downloads/arduino-1.6.10$ ./install.sh
uporabnik@prenosnik:~/Downloads/arduino-1.6.10$ sudo usermod -a -G dialout uporabnik
Realno-časovna komunikacija mobilnih aplikacij s senzorji
16
Za dodajanje funkcionalnosti razvojno okolje omogoča dodajanje knjižnic. Knjižnico
vključimo v naš program s pomočjo menija 'Sketch > Include Library', ki vnese enega ali
več #include ukazov v naš program. Nekatere knjižnice so v razvojno okolje že
nameščene, dodatne pa se lahko namestijo v meniju 'Sketch > Import Library > Manage
Libraries' ali 'Sketch > Import Library > Add .ZIP Library' [26].
2.3.3 Programiranje senzorja
Preden smo lahko začeli s programiranjem senzorja za temperaturo, smo morali preko
menija 'Sketch > Import Library > Add .ZIP Library' namestiti knjižnici DHTlib in
PubSubClient. Knjižnica DHTlib služi za branje temperature in relativne vlažnosti
senzorjev iz skupine DHT (11, 21, 22, 33, 44). Avtor knjižnice je Rob Tillaart, ki je kodo
objavil na GitHub7, da je ta prosto dostopna javnosti [27]. PubSubClient je knjižnica, ki
implementira odjemalca MQTT in bo omogočala komunikacijo s posrednikom MQTT.
Avtor Nick O'Leary je knjižnico izdal pod licenco MIT (Massachusetts Institute of
Technology) in kodo objavil na GitHub8 [28].
Izvorna koda programa se začne z vključitvijo knjižnic, ki jih bomo potrebovali:
7 DHTlib repozitorij: https://github.com/RobTillaart/Arduino
8 PubSubClient repozitorij: https://github.com/knolleary/pubsubclient
#include <dht.h>
#include <BridgeClient.h>
#include <Bridge.h>
#include <PubSubClient.h>
void setup() {
// inicializacija spremenljivk in knjižnic
}
void loop() {
// izvajanje programa
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
17
in definiranjem osnovnih vrednosti, ki se v programu uporabljajo:
V funkciji setup preko razreda Serial inicializiramo serijsko komunikacijo, ki služi za
izpisovanje informacij za namene razhroščevanja, razredom Bridge, ki zagotavlja pretok
ukazov med mikrokontrolerjem in brezžičnim modulom, ter MQTT odjemalca, preko
katerega pošiljamo prebrane vrednosti do MQTT posrednika:
Glavna funkcionalnost je zapisana v funkciji loop, ki v zanki izvaja naslednji algoritem:
Za objavo podatka uporabljamo spodnjo funkcijo, ki vrednost temperature in relativne
zračne vlažnosti iz tipa double pretvori v string, ki se nato preko funkcije publish razreda
PubSubClient pošlje do MQTT posrednika.
rezultat_branja = preberi vrednost dht senzorja
if rezultat_branja == true
if prebrana vrednost > minimalne potrebne spremembe
vklopi statusni vtič
if povezava do MQTT posrednika ni vzpostavljena
vzpostavi povezavo do MQTT posrednika
objavi prebrano vrednost MQTT posredniku
izključi statusni vtič
izpiši prebrano vrednost in status komunikacije na serijski vmesnik
else
print dht error
// inicializacija serijske komunikacije
Serial.begin(9600); Bridge.begin();
// inicializacija mostu med mikrokontrolerjem in brezžičnim modulom
Bridge.begin();
// inicializacija mqtt odjemalca
mqttClient.setServer(mqttServerIp, MQTT_PORT);
mqttClient.setServer(mqttServerIp, MQTT_PORT);
// priprava vtiča za status led
pinMode(STATUS_PIN, OUTPUT);
#define DHT11_DATA_PIN 5
#define MQTT_CLIENTID "MQTT_DHT_Sensor_Dnevna"
#define MQTT_PASSCODE "[pascode]"
#define MQTT_PORT 1883
#define STATUS_PIN 13
Realno-časovna komunikacija mobilnih aplikacij s senzorji
18
Na koncu smo program morali prenesti na mikrokontroler, kjer se bo lahko začel izvajati.
V ta namen smo morali preko menija 'Tools > Board' izbrati ciljno napravo (v našem
primeru Arduino Yun) in v meniju 'Tools > Port' izbrati vmesnik, preko katerega je naprava
povezana do računalnika (v našem primeru /dev/ttyACM0). Za zaključek je preostalo
samo še prevajanje programa preko menija 'Sketch > Verify/Compile' in prenos na
napravo, ki ga izvede meni 'Sketch > Upload'. Rezultat prevajanja in prenosa prikazuje
slika 2.12.
Slika 2.12: Rezultat prevajanja in prenosa programa na mikrokontroler
void publish_mqtt(double temperature, double humidity) {
char char_array[20];
String val = String(temperature);
val.toCharArray(char_array, 20);
mqttClient.publish(MQTT_TEMPERATURE_TOPIC, char_array);
val = String(humidity);
val.toCharArray(char_array, 20);
mqttClient.publish(MQTT_HUMIDITY_TOPIC, char_array);
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
19
3 KOMUNIKACIJA MOBILNIH APLIKACIJ S SENZORJI
3.1 Opis tehnologij in protokolov za realno-časovno komunikacijo
Internet v večini temelji na klasičnem modelu odjemalec-strežnik, kar za komunikacijo
med napravami pogosto ni najprimernejši model, saj ne zagotavlja predvidljive zakasnitve
in učinkovitega zaznavanja spremembe stanja [17]. Zato se pri komunikaciji med
napravami uporabljajo različni protokoli, ki pomanjkljivosti klasičnega modela odpravljajo.
Ker se senzorji uporabljajo v raznoraznih situacijah, imajo protokoli različne
funkcionalnosti in lastnosti. Omogočajo komunikacijo med napravami (D2D - Device-to-
device), zbirajo podatke senzorjev in jih pošiljajo do strežnikov (D2S - Device-to-server)
ter delijo podatke med strežniki (S2S - Server-to-server), ki jih nato posredujejo do drugih
naprav, programov za analizo in uporabnikov [18]. Najpogosteje uporabljeni protokoli v te
namene so MQTT, XMPP, AMQP, DDS, CoAP [19]. Vsi omenjeni protokoli so splošno
sprejeti in za njih obstaja več različnih implementacij. Prvi štirje protokoli se smatrajo za
realno-časovne in med sabo povezujejo na tisoče naprav, ki med sabo komunicirajo po
vzorcu objavi/naroči [18]. Zadnji je predstavnik klasičnega modela komunikacije med
odjemalcem in strežnikom. Ker so snovani za različne namene, je ključnega pomena, da
se zavedamo njihovih lastnosti in razlik med njimi, saj bomo le tako lahko izbrali pravega,
ki bo služil našemu namenu uporabe. Shema na sliki 3.1 prikazuje najprimernejše
področje uporabe posameznega protokola.
Slika 3.1: Shema najprimernejše uporabe posameznega protokola z odzivnostjo [18]
Realno-časovna komunikacija mobilnih aplikacij s senzorji
20
V naslednjem podpoglavju bomo na kratko predstavili posamezne protokole in izbrali za
naš primer uporabe najprimernejšega, ki ga bomo v podpoglavju 3.1.2 tudi podrobneje
predstavili.
3.1.1 Predstavitev protokolov
Extensible Messaging and Presence Protocol (XMPP) je bil razvit za namene hipne
komunikacije med ljudmi preko tekstovnih sporočil. Sporočila se preko TCP (Transmission
Control Protocol) prenašajo v obliki XML (Extensible Markup Language). Glavna prednost
protokola je naslavljanje po shemi [email protected], ki uspešno pripomore pri medsebojni
povezavi dveh virov iz velike množice virov na internetu (prikazano na sliki 3.2) [18].
Slika 3.2: Prikaz sheme XMPP za naslavljanje [18]
Pri komunikaciji med napravami XMPP ponuja preprost način, kako naslavljati posamezno
napravo. To je predvsem uporabno pri pošiljanju sporočil med oddaljenimi, nepovezanimi
napravami. Ni oblikovan, da bi bil hiter in v večini implementacij za potisna sporočila
uporablja protokol, imenovan BOSH (Bidirectional streams over Synchronous HTTP).
Prenaša prednosti pri naslavljanju, varnosti in razširljivosti. Realno-časovnost se pri tem
protokolu meri v sekundah [18].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
21
Data Distribution Service (DDS) se uporablja v napravah, ki neposredno komunicirajo z
drugimi napravami. Protokol je podatkovno orientiran in ima svoje korenine v industriji.
Uspešno lahko dostavi milijone sporočil na sekundo veliki količini prejemnikov istočasno.
Protokol implementira arhitekturo objavi/naroči. Realno-časovnost se pri protokolu meri v
mikrosekundah. Ponuja veliko različnih možnosti pri kontroli zagotavljanja storitve,
večvrstno oddajanje, nastavljivo zanesljivost in robustno redundanco. Ponuja učinkovito
filtriranje in natančno izbiro, kateri podatek je potrebno dostaviti kam. DDS implementira
neposredno podatkovno vodilo med napravami, ki nadzira dostop in posodablja veliko
količino naprav istočasno, kar je potrebno v okoljih, kjer mora velika količina zmogljivih
naprav sodelovati kot enotni sistem. Uporablja se v vojski, vetrnih farmah, medicini in
avtomobilski industriji [18]. Slika 3.3 prikazuje medsebojno povezanost subjektov domene
DDS.
Slika 3.3: Prikaz subjektov domene DDS [20]
Advanced Message Queuing Protocol (AMQP) kot sporočilno orientiran protokol v
ospredje postavlja vrsto (slika 3.4). Svoj izvor ima v bančni industriji in lahko uspešno in
varno obdela tisoče transakcij, ki so zanesljivo uvrščene v vrsto. Za komunikacijo
uporablja TCP in je osredotočen na to, da se sporočilo ne izgubi. Končna točka mora
prejem sporočila potrditi. Najpogosteje se uporablja pri poslovnem sporočanju, kjer
naprave komunicirajo s podatkovnimi centri in se podatki potrebujejo za analitiko [18].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
22
Slika 3.4: Potek komunikacije med odjemalci AMQP
Constrained Application Protocol (CoAP) je razvit za uporabo na napravah z omejenimi
viri in nezanesljivo povezavo. Protokol implementira klasičen odjemalec-strežnik model
(slika 3.5). Strežnik preko naslova URL (Uniform Resource Locator) omogoča dostop do
virov, s katerimi lahko odjemalec s pomočjo metod GET, PUT, POST in DELETE
manipulira. Preko posrednikov je protokol združljiv s HTTP (Hypertext Transfer Protocol).
Ker za prenos uporablja UDP (User Datagram Protocol), potebuje manjše podatkovne
paketke z manj presežka. Načrtovan je tako, da deluje tudi na mikrokontrolerjih s samo 10
kB pomnilnika in omogoča dva različna nivoja zagotavljanja storitve (potrditveno in
nepotrditveno). V sam protokol so definirani mehanizmi za odkrivanje virov. Najpogosteje
se uporablja za sporočanje stanj pri napravah, ki so lahko dlje časa v spanju in iz katerega
se lahko hitro zbudijo [21].
Slika 3.5: Prikaz toka sporočil za potrditveni (levo) in nepotrditveni (desno) zahtevek
Realno-časovna komunikacija mobilnih aplikacij s senzorji
23
MQTT (Message Queuing Telemetry Transport) cilja na zbiranja podatkov iz več naprav in
jih prenese do strežnikov, kjer se lahko podatki nadzirajo in analizirajo. Komunikacija
poteka preko TCP. Naprave se morajo za prejemanje in objavljanje sporočil povezati do
posrednika, ki nato preko tem sporočila filtrira in ustrezno preusmerja. Protokol je
podrobneje opisan v naslednjem poglavju, saj smo ga zaradi preprostosti, zanesljivosti,
malo podatkovnega presežka ter zagotavljanja varnosti s pomočjo TLS (Transport Layer
Security), izbrali za najprimernejšega za naš primer uporabe.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
24
3.1.2 Predstavitev izbranega protokola MQTT
MQTT je protokol za prenos sporočil med strežnikom in odjemalcem s pomočjo
arhitekture objavi/naroči (ang. publish/subscribe) (slika 3.6). Protokol je enostaven, odprt
in zasnovan tako, da se ga lahko preprosto implementira. Pogosto se uporablja pri
komunikaciji med napravami z omejenimi viri ali v situacijah, kjer je pasovna širina
omrežja omejena. Uporaben je tudi za potisna sporočila kot alternativa Googlovi lastni
rešitvi GCM (Google Cloud Messaging), ki na napravi ne zahteva nameščenih googlovih
mobilnih storitev (GMS - Google Mobile Services) [45]. Poleg že omenjenega protokol
omogoča tri različne načine preverjanje uspešne dostave sporočila, ima majhno količino
redundantnih podatkov, kar zmanjšuje število podatkov, prenesenih preko omrežja in
vključuje mehanizem za obveščanje zainteresirane strani o nepričakovani prekinitvi
povezave [1].
Protokol sta leta 1999 razvila Andy Stanford-Clark iz podjetja IBM in Arlen Nipper iz
podjetja Eurotech (takrat Arcom). Namen je bil oblikovati protokol, ki bo preko satelitske
povezave med sabo povezal naftovode, zaradi česar je moral biti prizanesljiv do baterije
in uporabljati malo pasovne širine. Protokol se je dolgo časa uporabljal znotraj omenjenih
podjetij, dokler ga novembra 2011 nista brezplačno ponudila javnosti, v verziji 3.1 [1]. Z
verzijo 3.1.1 je protokol oktobra 2014 uradno postal OASIS-standard9 [2]. Od leta 2016 je
le-ta tudi ISO-standard pod oznako ISO/IEC 2092210 [44].
Kot že omenjeno, protokol za komunikacijo uporablja vzorec objavi/naroči. V primerjavi s
tradicionalnim modelom odjemalca in strežnika so tukaj odjemalci, ki pošiljajo sporočilo
(ang. publishers), neodvisni od odjemalcev, ki sprejemajo sporočilo (ang. subscribers), kar
pomeni, da se drug drugega ne zavedajo in je za uspešno komunikacijo potrebna še tretja
komponenta, imenovana posrednik (ang. broker).
9 http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
10 https://www.iso.org/obp/ui/#iso:std:iso-iec:20922:ed-1:v1:en
Realno-časovna komunikacija mobilnih aplikacij s senzorji
25
Slika 3.6: Primer vzorca objavi/naroči
V kontekstu MQTT se za odjemalca smatra vsaka naprava, ki je povezana do posrednika.
Implementacija odjemalca je zelo preprosta in nezahtevna, kar omogoča, da deluje tako
na preprostih mikrokrmilnikih kakor tudi zelo dovršenih računalnikih. Na voljo je za večino
popularnih programskih jezikov. Nasprotje tega je posrednik. Naloga posrednika je, da
sprejema vsa sporočila, jih filtrira in jih ustrezno posreduje do odjemalcev. Prav tako je
zadolžen za vzpostavitev in ohranjanje seje in skrbi za njihovo avtorizacijo in avtentikacijo.
V splošnem se lahko sporočila filtrirajo glede na predmet ali temo, glede na vsebino in
glede na tip [4]. V primeru MQTT se uporablja filtriranje glede na temo (angl. topic). Vsako
sporočilo vsebuje niz znakov v hierarhični strukturi. Odjemalec posredniku sporoči, katere
teme ga zanimajo in ta ga začne obveščati o vseh sporočilih, ki jih je na to temo prejel.
Strukturo in filtriranje na podlagi tem bomo podrobno opisali v podpoglavju 3.1.2.2.
3.1.2.1 Komunikacija
Protokol MQTT za komunikacijo uporablja TCP/IP, ki mora biti na voljo tako pri odjemalcu
kakor tudi pri posredniku. Komunikacija vedno poteka med odjemalcem in posrednikom,
nikoli neposredno med dvema odjemalcema. Povezava se vzpostavi tako, da odjemalec
pošlje CONNECT paket do posrednika (slika 3.7) [5].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
26
Slika 3.7: Vzpostavitev komunikacije med odjemalcem in posrednikom
Primer paketa CONNECT prikazuje slika 3.8 in med drugim vsebuje naslednje elemente:
- clientId predstavlja identifikator odjemalca, ki se povezuje na posrednika in mora biti
unikaten;
- cleanSession z vrednostjo false predstavlja trajno povezavo, kar pomeni, da bo
posrednik hranil vse teme ter morebitna zamujena sporočila odjemalca in z vrednostjo
true sporoča posredniku, da naj vse obstoječe podatke iz prejšnjih sej zanj razveljavi.
Identifikacija seje poteka s parametrom clientId. Seja se bo ohranjala, vse dokler
odjemalec pri povezavi ne pošlje strežniku paket s cleanSession vrednostjo true. Trajna
povezava omogoča, da odjemalec prejme vsa sporočila na katera je bil naročen, četudi je
ta vmes bil neaktiven. Funkcionalnost je primerna predvsem za odjemalce z omejenimi
viri, ker se lahko tako ponovna povezava hitro vzpostavi, saj ponovno naročilo na teme ni
potrebno;
- username/password služi za namene avtorizacije in avtentikacije odjemalca in bo
podrobneje opisan v poglavju 3.1.2.4;
- lastWillTopic/lastWillMessage/lastWillQos predstavljajo temo, sporočilo in stopnjo
kakovosti storitve za primer, ko posrednik zazna nepredvideno prekinitev povezave do
odjemalca. Do tega pogosto pride pri manj stabilnih povezavah, ko napravam zmanjka
napajanja ali ko pride do druge nepredvidene prekinitve. Za te namene posrednik shrani
sporočilo (lastWillMessage) in temo (lastWillTopic). V primeru, da takšno prekinitev zazna,
pošlje sporočilo vsem odjemalcem, ki so na to temo naročeni in na takšen način vse
zainteresirane odjemalce obvesti o prekinitvi povezave. V primeru, da se odjemalec
pravilno odjavi s paketkom DISCONNECT, se shranjeni podatki za sporočilo in temo
razveljavijo;
- keepAlive je časovni interval, do katerega se odjemalec zaveže, da bo periodično pošiljal
zahtevek PING posredniku, če v tem intervalu ni potekala druga izmenjava podatkov. Na
zahtevek PING posrednik pošlje odgovor PING. Mehanizem omogoča, da obe strani
Realno-časovna komunikacija mobilnih aplikacij s senzorji
27
vesta, ali je povezava med njima še aktivna in odprta. To je posebej pomembno pri
mobilnih povezavah, kjer lahko pogosteje pride do pol odprte povezave (ena stran
povezave ne ve, da je druga stran povezave neaktivna). Odgovornost pošiljanja zahtevka
PING je na strani odjemalca. Naloga posrednika je, da do odjemalca, ki ni poslal paketka
v 1.5-kratniku intervala, prekine povezavo. Pogosto se zgodi, da se bo odjemalec, ki je
povezavo izgubil, želel ponovno povezati do posrednika, medtem ko ima ta še vedno pol
odprto povezavo. V tem primeru se s pomočjo clientId takšna povezava identificira in
posrednik izvede prevzem povezave (obstoječa pol odprta povezava se prekine in
vzpostavi nova).
Slika 3.8: Primer CONNECT in CONNACK paketa
Po uspešno prejetem paketu posrednik odgovori s paketom CONNACK, ki vsebuje
zastavico, ali ima odjemalec že aktivno sejo in statusno kodo (0 za uspešno povezavo, 1-
5 za neuspešno s pojasnilom), kot prikazuje slika 3.7. Po tem, ko je povezava
vzpostavljena, ta ostane odprta, vse dokler odjemalec ne pošlje paketa za prekinitev ali pa
se povezava izgubi [5]. Odjemalci lahko začnejo po njej pošiljati PUBLISH pakete. Ko
odjemalec pošlje takšen paket do posrednika, le-ta paket procesira, po potrebi prejem
potrdi in na podlagi teme ugotovi, do katerih odjemalcev ga mora dostaviti. Odgovornost
odjemalca, ki je sporočilo objavil, je uspešna dostava do posrednika, o tem kdo in koliko
odjemalcev bo sporočilo prejelo, pa nima podatka. Odgovornost za to prevzame
posrednik [6]. Tok takšne komunikacije prikazuje slika 3.9.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
28
Slika 3.9: Tok PUBLISH paketa
Osnovni sestavni deli tega paketa so prikazani na sliki 3.10. Ključnega pomena sta ime
teme (topicName) in tovor (payload). Ime teme je sestavljeno iz niza znakov, ki so s
poševnico razdeljeni v hierarhijo in posredniku služijo za posredovanje sporočila naprej do
odjemalcev (npr. 'hisa/kuhinja/temperatura). Tovor vsebuje dejansko sporočilo, ki ga
želimo prenesti. Točna oblika vsebine ni definirana in je odvisna od pošiljatelja.
Najpogosteje se uporablja JSON (JavaScript Object Notation) ali XML. Poleg že
omenjenih podatkov sporočilo vsebuje še:
- qos (1, 2 ali 3), ki zagotavlja garancijo dostave sporočila do posrednika ali odjemalca in
je podrobneje predstavljen v poglavju 3.1.2.3;
- retainFlag zastavica za zadržitev sporočila pove posredniku, ali naj sporočilo shrani kot
zadnjo znano vrednost za dano temo. Novi odjemalci, ki se prijavijo na to temo, bodo takoj
ob prijavi prejeli to sporočilo in jim ni potrebno čakati šele do naslednje posodobitve
vrednosti. Posrednik za vsako temo hrani samo zadnje takšno sporočilo. Takšno sporočilo
je posebej uporabno pri sporočanju statusov naprav v omrežju. V tem kontekstu bi lahko
rekli, da je takšno sporočilo zadnje znano stanje te naprave;
- pocketId je unikatni identifikator med odjemalcem in posrednikom in se uporablja v
primerih, ko je vrednost qos večja od 0;
- dupFlag zastavica pove, ali je sporočilo podvojeno, ker prejemnik ni potrdil prvotnega
prejema.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
29
Slika 3.10: Primer PUBLISH in opcijskega PUBACK paketa
Poleg že omenjenih paketov MQTT za svoje delovanje potrebuje še dva ključna paketa,
SUBSCRIBE in UNSUBSCRIBE. S paketom SUBSCRIBE odjemalec posredniku sporoči,
katera sporočila želi prejemati. Slika 3.11 prikazuje elemente takšnega paketa, med
katerimi je ključnega pomena seznam, ki lahko vsebuje poljubno število naročil. Vsako
naročilo v seznamu je sestavljeno iz imena teme in nivoja zagotavljanja kakovosti storitve.
Vsako naročilo je s strani posrednika potrjeno s paketom SUBACK. Ta vsebuje seznam
vrnjenih kod za vsako naročeno temo v enakem zaporedju. Vrednosti kode od 0 do 2
potrjujejo uspešno naročilo na temo. V primeru neuspeha pa se vrne koda 128. Po
uspešni prijavi začne odjemalec prejemati vsa sporočila, ki so objavljena za dotične teme
[6]. Zaporedje komunikacije prikazuje slika 3.12.
Slika 3.11: Primer SUBSCRIBE in SUBACK paketa
Realno-časovna komunikacija mobilnih aplikacij s senzorji
30
Slika 3.12: Zaporedje izmenjave paketov ob prijavi na temo
Zadnji paket, ki ga bomo predstavili podrobneje, je namenjen odjavi odjemalca iz
tem/teme. Podobno kot SUBSCRIBE tudi paket UNSUBSCRIBE vsebuje seznam tem, od
katerih se odjemalec želi odjaviti. Po prejemu takšnega paketa posrednik izbriše
zahtevanje prijave za odjemalca in mu odgovori s paketom UNSUBACK. Slika 3.13
prikazuje primer takšnega paketka, sam potek pa je viden na sliki 3.14 [6].
Slika 3.13: Primerk paketov UNSUBSCRIBE in UNSUBACK
Slika 3.14: Zaporedje izmenjave paketov ob prijavi na temo
Realno-časovna komunikacija mobilnih aplikacij s senzorji
31
3.1.2.2 Teme
O temah smo sicer nekaj že povedali, a ker so pomemben koncept protokola, jih bomo v
tem poglavju spoznali nekoliko podrobneje. V osnovi je tema niz znakov, zakodiran v
formatu UTF-8. Na podlagi teme posrednik ugotovi, katerim odjemalcem mora prejeto
sporočilo poslati. S pomočjo poševnice ime teme strukturiramo v hierarhijo. Ime teme
mora imeti vsaj en znak, lahko vsebuje presledke, se loči glede na velike ter male črke, a
je drugače zelo fleksibilno (slika 3.15).
Slika 3.15: Struktura imena teme in primeri imen tem [7]
Nekaj primerov tem:
Odjemalec lahko ob prijavi na temo sporoči polno ime ali se s pomočjo posebnih znakov
prijavi na več tem hkrati. Posebni znaki se lahko uporabljajo samo pri naročilu na temo.
Znak + predstavlja enonivojsko substitucijo nivoja teme. Na sliki 3.16 je prikazana
uporaba takšnega posebnega znaka.
Slika 3.16: Primer uporabe enonivojske substitucije imena teme [7]
Primeri tem, ki jih v zgornjem primeru zajamemo:
myhome/groundfloor/livingroom/temperature
myhome/groundfloor/kitchen/temperature
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Realno-časovna komunikacija mobilnih aplikacij s senzorji
32
Teme, ki jih zgornji primer ne zajema:
Poleg enonivojske je možna tudi večnivojska substitucije nivoja teme. Za ta namen služi
znak #. Znak je vedno zadnji v imenu teme. Odjemalec, prijavljen na takšen način, bo
prejemal vsa sporočila, ki se bodo ujemala z imenom teme do tega znaka, neodvisno od
tega, kako globoko je ime teme strukturirano. Uporaba znaka je prikazana na sliki 3.17 [7].
Slika 3.17: Primer uporabe večnivojske substitucije imena teme [7]
Navedenemo kriteriju ustrezajo naslednje teme:
Primer teme, ki ne ustrezajo kriteriju:
Pri poimenovanju tem imamo proste roke, razen tem, ki se začnejo z $. Te so
obravnavane posebno. Rezervirane so za posrednika in je odjemalcem onemogočeno
zanje objavljati sporočila [2]. Trenutno v standardu ni določeno, katere podatke mora
posrednik objavljati, pogosto se uporabljajo naslednje teme:
$SYS/broker/load/bytes/received, $SYS/broker/load/bytes/sent, $SYS/broker/clients/total,
$SYS/broker/clients/maximum, $SYS/broker/version … [8].
3.1.2.3 Zagotavljanje kakovosti storitve (QoS)
Pomembna funkcionalnost protokola MQTT je zagotavljanje kakovosti storitve (QoS -
Quality of service), kar tudi na manj zanesljivih povezavah zagotavlja dostavo sporočila do
myhome/firstfloorfloor/kitchen/temperature
myhome/groundfloor/livingroom/brightness
myhome/groundfloor/kitchen/temperature
myhome/groundfloor/kitchen/brightness
myhome/groundfloor/kitchen/brightness
myhome/firstfloorfloor/kitchen/temperature
myhome/groundfloor/kitchen/fridge/temperature
Realno-časovna komunikacija mobilnih aplikacij s senzorji
33
cilja. Na voljo so trije nivoji, za katere se lahko pošiljatelj in prejemnik dogovorita. Nivo
zagotavljanja kakovosti storitve lahko določamo tako za povezavo med posrednikom in
pošiljateljem sporočila kakor tudi med posrednikom in prejemnikom sporočila. V
nadaljevanju bomo podrobneje predstavili vse tri nivoje [9].
Najnižji in preprostejši nivo zagotavljanja kakovosti storitve, prikazan na sliki 3.18, je QoS
0 – največ enkrat. Zagotavlja, da bo sporočilo dostavljeno po najboljši moči (angl. best
effort). Sprejemnik prejema sporočila ne bo potrdil, pošiljatelj pa le-tega ne bo shranil za
ponovno pošiljanje. Nudi enak nivo zagotavljanja kot protokol TCP in se pogosto imenuje
sproži in pozabi (angl. fire and forget). Nivo se pogosto uporablja, kadar je povezava med
pošiljateljem in prejemnikom stabilna (žična), ni ključnega pomena, če se kakšno
sporočilo izgubi (manj pomembni podatki, kratek interval pošiljanja) ali kadar ni potrebe po
zadržanju sporočil, če odjemalec ni povezan [9].
Slika 3.18: MQTT QoS nivo 0
QoS 1 zagotavlja, da bo sporočilo vsaj enkrat dostavljeno do sprejemnika, pri čemer je
možno, da bo dostavljeno tudi večkrat. Pošiljatelj bo shranil sporočilo, dokler od
prejemnika ne dobi potrditve o prejemu. Če potrditve v doglednem času ne dobi, ponovno
pošlje sporočilo. Potek sporočil je prikazan na sliki 3.19. Je najpogosteje uporabljen nivo,
saj predstavlja kompromis med kakovostjo in hitrostjo. Uporablja se, kadar je potrebno, da
se sprejme vsako sporočilo in pri tem podvojitve ne predstavljajo težave [9].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
34
Slika 3.19: MQTT QoS nivo 1
Najvišja kakovost storitve je pri protokolu MQTT zagotovljena z nivojem 2, ki je hkrati tudi
najpočasnejši, saj zahteva dva obhoda paketov, kar je prikazano na sliki 3.20. Nivo
zagotavlja, da bo vsako sporočilo prejemnika doseglo natanko enkrat. Če prejemnik dobi
sporočilo z nivojem QoS nivojem 2, prejem potrdi s paketom PUBREC in hrani
identifikator paketka, vse dokler ne bo poslal paketa PUBCOMP, s čimer lahko zagotovi,
da sporočila ne bo ponovno obdelal. Na drugi strani lahko pošiljatelj po prejemu paketa
PUBREC smatra, da je bilo sporočilo uspešno dostavljeno. Posledično lahko pozabi na
prvotno sporočilo, shrani na novo prejet paket in odgovori s paketom PUBREL. Tok
komunikacije se zaključi tako, da prejemnik prejme paket PUBREL, ki signalizira, da lahko
zavrže vsa stanja za dotični paket in odgovori s paketom PUBCOMP, ki tudi pošiljatelja
obvesti, da lahko naredi enako, saj je izmenjava uspešno zaključena. Uporablja se, kadar
je kritičnega pomena, da je sporočilo dostavljeno natanko enkrat, saj bi podvojitev
negativno vplivala na prejemnika [9].
Slika 3.20: MQTT QoS nivo 2
Realno-časovna komunikacija mobilnih aplikacij s senzorji
35
3.1.2.4 Zagotavljanje varnosti
Ker se protokol MQTT uporablja za komunikacijo med napravami, ki so med sabo
povezane na različne načine, je pomembno, da se med njimi zagotavlja varna, zaupna in
celovita povezava. Prav tako je za protokol značilno, da je uporabljen na raznovrstnih
napravah, ki so lahko tudi zelo omejene z viri (procesorska moč, pomnilnik, baterija). S
tega vzroka je možno varnost zagotoviti na več različnih načinov. Različne implementacije
posrednikov ponujajo raznovrstne možnosti in pogosto podpirajo tudi vtičnike za
razširljivost, da so lahko prilagodljivi potrebam v posameznih primerih uporabe. V MQTT
je varnost mogoče implementirati na različnih nivojih. Na omrežni plasti je pomembno, da
zagotovimo varno in zaupanja vredno povezavo med posameznimi napravami. To lahko
storimo s pomočjo fizično zavarovanih omrežij in omrežij VPN (Virtual private network).
Na transportni plasti se v večini primerov uporablja TLS za šifriranje. Nudi varen in
preverjen način komunikacije, ne da jo lahko kdo prestreza, ter s pomočjo digitalnih potrdil
ponuja še možnost avtentikacije. Pogosto si na napravah z omejenimi viri ne moremo
privoščiti dodatnih zahtevnosti, ki jih TLS prenaša s seboj. Zavoljo tega protokol na
aplikacijski plasti ponuja avtentikacijo s pomočjo uporabniškega imena in gesla.
V poglavju bomo na kratko opisali posamezne možnosti, ki jih je za doseganje višje
stopnje varnosti možno med sabo tudi kombinirati. Ker je protokol snovan v namene
nezahtevne ter preproste komunikacije in ker vsebuje specifikacija standarda le nekaj
jasno definiranih mehanizmov za zagotavljanje varnosti, se v večini primerov uporabljajo
splošno priznani in uveljavljeni standardi na področju zagotavljanja varnosti komunikacije
[10]. Podobno velja za avtorizacijo, ki je v večini primerov prepuščena implementaciji na
strani posrednika. Pri MQTT se najpogosteje z dostopom omeji tema, na katero se lahko
odjemalci naročijo ali na njo objavljajo [12].
Kot smo že omenili, je najbolj osnovni način avtentikacije, ki je tudi določen v specifikaciji
protokola, avtentikacija z uporabniškim imenom in geslom. Polji sta del paketa CONNECT
in lahko imata maksimalno dolžino 65536 bajtov, pri čemer je uporabniško ime podano z
nizom UTF-8 znakov, geslo pa v binarni obliki. Specifikacija tudi določa, da se lahko
pošlje uporabniško ime brez gesla ter prepoveduje obratno. Posrednik posredovane
podatke v takšnem paketu glede na implementacije ovrednoti in vrne ustrezno statusno
kodo (0 - Connection Accepted, 4 - Connection Refused, bad user name or password ali 5
- Connection Refused, not authorized) [11]. Pogosto se v kombinaciji z uporabniškim
imenom in geslom uporablja še identifikator odjemalca (parameter clientId v paketu
Realno-časovna komunikacija mobilnih aplikacij s senzorji
36
CONNECT). Parameter predstavlja unikatni identifikator dolžine do 65555 znakov, v
praksi velikokrat predstavljen z UUID (Universally unique identifier), naslovom MAC
(Media access control) ali serijsko številko naprave.
Na aplikacijski plasti se uporabniško ime in geslo prenaša v golem besedilu, zato je z
varnostnega vidika pomembno, da se na transportni plasti povezava šifrira. Vendar ta
možnost ni vedno na voljo. V tem primeru lahko zvišamo stopnjo varnosti s šifriranjem
sporočila v paketu PUBLISH (ostali metapodatki ostanejo nespremenjeni) ter s šifriranjem
uporabniškega imena in gesla. To omogoča, da lahko občutljive podatke zaščitimo od
pošiljatelja do prejemnika. Posrednik lahko metapodatke uporabi za posredovanje sporočil
do naročenih odjemalcev in zagotavlja kakovost storitve, v nobenem trenutku pa nima
vpogleda v vsebino sporočil. Samo zaupanja vredni odjemalci imajo dostop do ključa, ki
sporočilo dešifrira. Takšna implementacija je neodvisna od posrednika in se pogosto
uporablja v povezavi z javno dostopnimi posredniki, ki jih nimamo pod nadzorom, vendar
pa po drugi strani od nas zahteva popolni nadzor odjemalcev (Slika 3.21). Druga možnost
je, da podatke zaščitimo od odjemalca do posrednika. Omenjen način omogoča, da so
podatki zaščiteni med pošiljateljem in posrednikom, medtem ko končni prejemniki dobijo
dešifrirano sporočilo. Implementacija na ta način zahteva, da ima posrednik možnost
razširitve s pomočjo vtičnika, ki omogoča sprotno dešifriranje podatkov. V obeh primerih
lahko uporabimo simetrični ali asimetrični način šifriranja podatkov. Slednji je primeren,
kadar imamo manjše število zaupanja vrednih naročnikov, ki imajo dostop do privatnega
ključa za dešifriranje podatkov in večje število pošiljateljev, ki imajo dostop do javnega
ključa, s katerim podatke šifrirajo (Slika 3.22).
Slika 3.21: Šifriranje povezave med pošiljateljem in prejemnikom
Realno-časovna komunikacija mobilnih aplikacij s senzorji
37
Slika 3.22: Šifriranje povezave med pošiljateljem in posrednikom
S pomočjo šifriranja zagotovimo, da se sporočilo varno prenese do naslovnika in
omogočimo varnost tudi na napravah z manj razpoložljivimi viri. Vendar tudi takšno
šifriranje povzroča večjo obremenitev naprav, zahteva dodatno administracijo z
distribucijo ključev in nas ne obvaruje pred vsemi načini prestrezanj podatkov. Posledično
je priporočljivo, da se uporablja šifriranje prenosa s pomočjo TLS, ki varnost zagotavlja na
omrežni plasti, vedno, ko je to mogoče. In ker šifriranje podatkov poteka na aplikacijski
plasti, lahko varnost dodatno povečamo s skupno uporabo obeh mehanizmov [13].
Ugotovili smo, da lahko s pomočjo TLS zagotovimo varno povezavo med odjemalci in
posrednikom, ki je ni mogoče prestreči ali ji spremeniti vsebine. Standard za ta namen
specificira vrata 8883 in takšno povezavo imenuje secure-mqtt. S pomočjo validacije
strežniškega digitalnega potrdila dobimo možnost preverjanja identitete posrednika. Če
digitalna potrdila uporabimo tudi na strani odjemalcev, pa to omogoča njihovo
avtentikacijo tudi na aplikacijskem sloju. Omenjena dejstva zagotavljajo zelo visok nivo
varnosti, vendar vseh zaradi zahtevnega procesa varne distribucije in upravljanja
digitalnih potrdil (vključno s preklicem neveljavnih potrdil s pomočjo CRL ali OCSP) ni
Realno-časovna komunikacija mobilnih aplikacij s senzorji
38
mogoče uporabiti v vsakem okolju. Zlasti kadar imamo veliko količino odjemalcev, ali je
človeška interakcija z njimi težavna, če že ne nemogoča [15].
Varnost, ki jo TLS prenaša, ima tudi negativne vplive. Šifriranje poveča uporabo
procesorske moči in poveča količino podatkov, ki se po povezavi prenašajo. Medtem ko
za večino posrednikov to ne predstavlja težave, je to lahko pri marsikaterem odjemalcu
problem, saj ti pogosto niso prilagojeni za zahtevne računske naloge. Ker se največja
količina podatkov pri TLS izmenja pri vzpostavitvi povezave, posledice slednjega
problema zmanjšamo tako, da uporabimo čim dlje aktivne povezave TCP. Če dani primer
uporabe to ne omogoča, je priporočljivo, da se uporabi tehnika, imenovana nadaljevanje
seje (angl. session resumption), ki ponovno uporabi že vzpostavljeno sejo TLS, da
ponovno rokovanje za vzpostavitev povezave med danim odjemalcem in posrednikom ni
potrebno. Omenjene tehnike na žalost ne vsebujejo vse knjižnice.
Da bo povezava preko TLS tudi dejansko varna, je priporočljivo, da se uporablja čim višja
verzija protokola, se izbere varen nabor algoritmov, se veriga certifikatov vedno validira in
se ne uporablja lastno podpisanih certifikatov, ampak se uporabljajo certifikati, izdani s
strani zaupanja vrednih agencij. Prav tako je protokol priporočljivo uporabljati skupaj z
ostalimi omenjenimi mehanizmi (šifriranje sporočila, validacija podpisa sporočila,
avtentikacija z uporabniškim imenom in geslom) [14].
Kadar se zaradi omejenih virov vendarle odločimo za avtentikacijo s pomočjo šifriranja,
lahko integriteto podatkov zagotovimo s pomočjo digitalnega podpisa sporočila, ki ga
pripnemo pred ali za tovor v paketu PUBLISH. S tem zagotovimo, da vsebina sporočila ni
mogoče spremenjena s strani tretje osebe. Mnogokrat v MQTT za to uporabimo tovor in
temo in se izogibamo identifikatorju sporočila ali nivoju kakovosti storitve, saj se
parametra lahko med prenosom od pošiljatelja do prejemnika spremenita. Pogosto
uporabljeni mehanizmi so v te namene zgoščevalni algoritmi (MD5, SHA1, SHA2,
SHA256 ..), algoritmi za preverjanje pristnosti sporočil (MAC, npr. HMAC, CBC-MAC …)
in digitalni podpis (16). Vsi imajo svoje posebnosti in lastnosti, ki so prikazane v tabeli 3.1.
Tabela 3.1: Prednosti in lastnosti posameznih mehanizmov za podpisovanje sporočila [16]
Kontrolna vsota MAC Digitalni podpis
Integriteta podatkov + + +
Avtentikacija - + +
Realno-časovna komunikacija mobilnih aplikacij s senzorji
39
Nezatajljivost - - +
Hitrost Visoka Srednja Nizka
Varnost Nizka Srednja Visoka
Kompleksnost Nizka Srednja Visoka
Ključ - Simitrični Asimiterični
Pojasnimo še pomen zgornjih lastnosti. Integriteta podatkov zagotavlja, da je lahko
prejemnik prepričan, da vsebina ni bila spremenjena. Avtentikacija prejemniku zagotavlja,
da lahko zaupa izvoru sporočila. Nezatajljivost zagotavlja, da lahko samo pošiljatelj
podpiše sporočilo, saj ima edino dostop do privatnega ključa. Ostali lahko podpisa s
pomočjo javnega ključa samo preverijo.
Omeniti velja še avtentikacijo s pomočjo OAuth 2.0, ki jo je prav tako mogoče uporabiti za
varno avtentikacijo odjemalcev. V osnovi je avtorizacija namenjena protokolu HTTP,
vendar se v določenih primerih lahko uporaba aplicira tudi na MQTT. Eden takšnih
primerov je prikazan na sliki 3.23.
Slika 3.23: Tok komunikacije MQTT pri avtorizaciji OAuth 2.0
V poglavju smo na kratko predstavili, kako zagotoviti varnost na ravni protokola, ki le malo
koristi, če ne zagotovimo ustrezne varnosti tudi na ostalih nivojih. Na nivoju infrastrukture
se v prvi vrsti zaščitimo s pomočjo požarnega zidu. Na nivoju operacijskega sistema je
pomembno, da redno posodabljamo tako operacijski sistem kakor tudi programsko
Realno-časovna komunikacija mobilnih aplikacij s senzorji
40
opremo in knjižnice, ki so na njem nameščene. Še posebej knjižnice, katere
implementirajo šifrirne algoritme, ki jih uporabljamo pri samem protokolu. Podobno
moramo zaščititi tudi posrednika, tako da omejimo hitrost, s katero lahko posamezen
odjemalec pošilja podatke do posrednika, ter tako, da dodatno zmanjšamo maksimalno
velikost posameznega sporočila, če nam to posamezen scenarij omogoča. Tako lahko
preprečimo preobremenjenost in zagotovimo nemoteno in hitro delovanje.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
41
3.2 Izdelava centralnega strežnika
3.2.1 Predstavitev platforme in uporabljenih tehnologij
Centralni strežnik, na katerem bo tekel posrednik MQTT in bo zbiral podatke za kasnejšo
analizo, bo poganjala platforma Raspberry Pi. Sestavljena je iz strojne opreme v velikosti
kreditne kartice in operacijskega sistema Raspbian. Idejo o platformi je leta 2006
predstavil Eben Upton, ki je takrat delal v računalniškem laboratoriju na Univerzi v
Cambridgu. Namen je bil izdelati cenovno ugodno platformo, ki se da preprosto
programirati. Na takšen način se bi študentom omogočilo pobližje spoznati inženirstvo in
matematiko. Zaradi dostopnosti in cene je platforma postala hitro popularna tudi pri drugih
hobiistih po svetu. Skupaj s sodelavci so izdelali prototip in maja 2009 ustanovili fundacijo
Raspberry Pi Foundation. Prve primerke računalnika so uspešno lansirali na trg aprila
2012. Na začetku so ponujali dva različna modela, A in B. Model A je bil cenejši in ni
vseboval mrežnega adapterja, imel je le en priključek USB in samo 256 MB pomnilnika.
Nizko ceno so lahko dosegli predvsem zaradi napredka tehnologije integriranih vezij.
Namesto ločenega centralnega procesorja, grafičnega procesorja, pomnilnika in
kontrolerja USB so uporabili SOC, ki vse te komponente združuje na enem samem čipu
[38]. Računalnik je bil prodan v 8 milijonov izvodih. Zaradi velikega uspeha so leta 2015
izdali še verzijo 2 in leta 2016 verzijo 3. Izboljšano procesorsko zmogljivost vsake iteracije
računalnika prikazuje slika 3.24, njihove najpomembnejše karakteristike glede na
posamezno generacijo pa povzema tabela 3.2.
Slika 3.24: Povečana procesorska zmogljivosti posamezne generacije Raspberry Pi [39]
Realno-časovna komunikacija mobilnih aplikacij s senzorji
42
Tabela 3.2: Najpomembnejše karakteristike posamezne generacije Raspberry Pi
Raspberry Pi Raspberry Pi 2 Raspberry Pi 3
Izid Feb. 2012 Feb. 2015 Feb. 2016
Čip Broadcom
BCM2835
Broadcom
BCM2836
Broadcom
BCM2837
Procesor ARM1176JZF-S ARM Cortex-A7 ARM Cortex-A53
Frekvenca 700MHz 900MHz 1,200MHz
Število jeder 1 4 4
Pomnilnik 512 MB 1 GB 1 GB
Grafična Broadcom
Videocore IV
Broadcom
Videocore IV
Broadcom
Videocore IV
USB vhodi 2 4 4
Povezljivost - - Wifi 802.11n in
Bluetooth 4.1
Priporočen jezik za programiranje je Python. V njem je izdelanih večina uradnih knjižnic in
je uporabljen v večini vodičev. Vendar, ker ga poganja operacijski sistem Linux, se lahko
na njem brez problema uporabljajo tudi vsi ostali moderni jeziki (Java, Php, C/C++,
Node.js in drugi).
Preden lahko računalnik začnemo uporabljati kot centralni strežnik za zbiranje podatkov in
posrednik MQTT, moramo nanj namestiti operacijski sistem, potrebne knjižnice in
odvisnosti ter potrebno programsko opremo za posrednika.
Na voljo imamo več različnih implementacij MQTT posrednikov. Implementirani so v
različnih jezikih in podpirajo različne verzije protokola. Ena popularnejših implementacij je
Eclipse Mosquitto, ki je odprtokodna in podpira verzijo 3.1.1 protokola MQTT. Avtor je
Roger Light, ki je kodo izdal pod licenco EPL/EDL. Je ena prvih implementacij, ki je bila
pripravljena za produkcijo. Napisana je v jeziku C, kar jo naredi zelo hitro in stabilno. V
času nameščanja je bila aktualna verzija 1.4.9 in jo je bilo mogoče namestiti na
popularnejše operacijske sisteme (Windows, Mac OSX, Linux) [40].
3.2.2 Postavitev strežnika
Namestitev in upravljanje strežnika bo potekalo na operacijskem sistemu Ubuntu 16.04.
Preden lahko začnemo s samo namestitvijo, potrebujemo 5 V adapter MicroUSB za
Realno-časovna komunikacija mobilnih aplikacij s senzorji
43
napajanje in MicroSD spominsko kartico velikosti vsaj 8 GB, kamor bomo namestili
operacijski sistem in programe. Ob prvem zagonu sta za osnovno nastavitev in nastavitev
mrežnih podatkov priporočljiva tudi tipkovnica in monitor s priključkom HDMI. Ker ima
Raspberry Pi 3 že vgrajen WiFi-modul, moramo le še omogočiti strežnik SSH (Secure
Shell), ki bo omogočal brezžično izvrševanje ukazov in upravljanje s strežnikom.
Preden prvič zaženemo Raspberry Pi, moramo iz uradne spletne strani sneti sliko
operacijskega sistema Raspbian11 in jo s pomočjo našega računalnika zapisati na
MicroSD spominsko kartico. Trenutno aktualna verzija je Raspbian Jessie May 2016,
izdana 27. 5. 2016 z Linux jedrom 4.4. Na voljo imamo dve različici, polno in okrnjeno
(Lite). Prva ima že prednameščeno grafično okolje, razvojna orodja in pisarniške
programe. Za naš primer smo izbrali okrnjeno različico, saj za delovanje centralnega
strežnika omenjenih stvari ne potrebujemo in tako prihranimo na sistemskih virih. Po
uspešnem prenosu se moramo pomakniti v mapo s prenosi, razširiti Zip arhiv in s
pomočjo dd ukaza sliko zapisati na spominsko kartico:
V primeru, da nismo prijavljeni kot root uporabnik, moramo pred ukaz dopisati sudo. V
dodatno pomoč sta tudi spodnja ukaza. Prvi služi za ugotovitev priklopne točke SD-kartice
in drugi za izpis napredka postopka kopiranja:
Ob uspešno izvršenem ukazu sync lahko vzamemo SD-kartico iz bralnika in jo namestimo
v Raspberry Pi. Po priklopu napajanja monitorja in tipkovnice je naprava pripravljena za
prvi zagon, ki bo razširil datotečni sistem na celotno spominsko kartico in prikazal ukazno
vrstico za prijavo z uporabniškim imenom pi in geslom raspberry. Prvi korak po prijavi je
zagon orodja raspi-config, prikazanega na sliki 3.25, s pomočjo katerega bomo spremenili
geslo za prijavo, ime gostitelja, lokalizacijo, časovni pas, razporeditev tipkovnice in
omogočili strežnik SSH:
11 URL-naslov za prenos: https://www.raspberrypi.org/downloads/raspbian/
uporabnik@prenosnik:~$ sudo fdisk -l | grep mmc
uporabnik@prenosnik:~$ sudo pkill -USR1 -n -x dd
uporabnik@prenosnik:~$ cd Downloads/
uporabnik@prenosnik:~/Downloads$ unzip 2016-05-27-raspbian-jessie-lite.zip
uporabnik@prenosnik:~/Downloads$ sudo dd bs=4M if=2016-05-27-raspbian-jessie-lite.img
of=/dev/mmcblk0
uporabnik@prenosnik:~/Downloads$ sudo sync
Realno-časovna komunikacija mobilnih aplikacij s senzorji
44
Slika 3.25: Orodje za osnovno kofiguracijo Raspberry Pi
Preden bomo lahko s strežnikom upravljali brezžično, moramo nastaviti brezžično
povezavo in avtorizacijo za SSH. Brezžične nastavitve se nahajajo v datoteki
/etc/wpa_supplicant/wpa_supplicant.conf, ki jo uredimo tako, da ji dodamo podatke o
brezžičnem omrežju, na katerega se želimo povezati, kar storimo z ukazom:
Podatke za povezavo na brezžično omrežje zapišemo v obliki:
Ko zaključimo z urejanjem, s kombinacijo tipk Ctrl+O zapišemo spremembe in s
kombinacijo Ctrl+X zapremo program za urejanje. Operacijski sistem spremembo
datoteke samodejno zazna in vzpostavi povezavo. V primeru, da se to ne zgodi, lahko s
spodnjimi ukazi sami vzpostavimo povezavo, preverimo stanje in vidimo pridobljen IP-
naslov (Internet Protocol):
network={
ssid="ime_omrežja"
psk="geslo_omrežja"
# RSN za WPA2; WPA za WPA1
proto=WPA
key_mgmt=WPA-PSK
# CCMP ali TKIP za (WPA2 ali WPA1)
pairwise=TKIP
}
pi@RPiServer3:~$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
pi@RPiServer3:~$ sudo raspi-config
Realno-časovna komunikacija mobilnih aplikacij s senzorji
45
Dodatno si pri vzpostavitvi brezžične povezave lahko pomagamo s spodnjim ukazom, ki
izpiše vsa omrežja, ki so na voljo skupaj z imenom in možnimi protokoli za avtorizacijo:
Z ukazom ifconfig smo ugotovili IP-naslov, ki je bil dodeljen našemu strežniku (v našem
primeru 192.168.1.74), na katerega se sedaj že lahko preko SSH povežemo z ukazom:
Mrežna konfiguracija je odvisna od usmerjevalnika. V našem primeru se IP dodeli
dinamično. Da se bomo lažje povezovali na strežnik, smo na usmerjevalniku rezervirali IP-
naslov, tako da mu bo vedno dodeljen enak. Da se bomo do njega lahko povezali tudi
izven lokalnega omrežja, smo morali nastaviti tudi posredovanje vrat za dostop do
strežnika SSH (2222), strežnika HTTP (8888) in posrednika MQTT (8883) ter poskrbeti za
večjo varnost tako da sejo SSH avtoriziramo z javnim in privatnim ključem. Najprej s
pomočjo spodnjih ukazov naredimo nove unikatne ključe:
V naslednjem koraku moramo generirati javni in privatni ključ za avtentikacijo uporabnika.
Če ključe že imamo, lahko ta korak preskočimo in uporabimo obstoječe, v nasprotnem
primeru pa zaženemo sledeči ukaz:
Preko interaktivne ukazne vrstice nas bo orodje vprašalo po lokaciji, kamor želimo
generiran par ključev shraniti in po geslu, s katerim lahko ključa dodatno zaščitimo (če
gesla ne vnesemo, to pomeni, da ključa nista dodatno zaščitena). Privzeta lokacija za
zapis ključev je v mapi ~/.ssh. Ukaz ustvari dve datoteki z imenom id_rsa in id_rsa.pub.
Slednji predstavlja javni ključ, ki ga moramo skopirati na strežnik, do katerega se želimo
povezati. Preden lahko javni ključ prenesemo na strežnik, moramo tudi na strežniku s
pomočjo ukaza ustvariti mapo ~/.ssh:
uporabnik@prenosnik:~$ ssh-keygen -t rsa -C uporabnik@host
pi@RPiServer3:~$ sudo rm /etc/ssh/ssh_host_*
pi@RPiServer3:~$ sudo dpkg-reconfigure openssh-server
uporabnik@prenosnik:~$ ssh [email protected]
pi@RPiServer3:~$ sudo iwlist wlan0 scan
pi@RPiServer3:~$ sudo ifdown wlan0
pi@RPiServer3:~$ sudo ifup wlan0
pi@RPiServer3:~$ sudo ifconfig wlan0
Realno-časovna komunikacija mobilnih aplikacij s senzorji
46
Javni ključ prenesemo na strežnik z ukazom:
Preden se bo ukaz izvršil, bo za povezavo potrebno ponovno vnesti geslo. Ob uspešnem
zaključku pa se lahko do strežnika prijavimo brez vnosa gesla. Da bo takšna prijava tudi
bolj varna, moramo onemogočiti prijavo z geslom. Skupaj s tem bomo spremeniti tudi
vrata, na katerih teče strežnik SSH, iz privzetih 22 na 2222. Pot do konfiguracijske
datoteke je /etc/ssh/sshd_config. Uredimo jo z ukazom:
V datoteki moramo najti vrstico z besedilom 'Port 22' in jo spremeniti v 'Port 2222' ter
vrstico '#PasswordAuthentication yes' spremeniti v 'PasswordAuthentication no'. S
kombinacijo tipk Ctrl+O in Ctrl+X datoteko shranimo in zapustimo urejevalnik. Da bodo
spremembe stopile v veljavo, moramo ponovno zagnati strežnik SSH z ukazom:
Zadnji korak pri namestitvi sistema je posodobitev vseh knjižnic na najnovejšo verzijo, s
čimer zagotovimo večjo varnost, stabilnost, funkcionalnost in tudi najnovejše gonilnike:
Preden zaključimo z osnovno namestitvijo ter odklopimo monitor in tipkovnico, je dobro,
da ga ponovno zaženemo in se prepričamo, da se lahko do njega uspešno povežemo
pi@RPiServer3:~$ sudo apt-get update
pi@RPiServer3:~$ sudo apt-get upgrade
pi@RPiServer3:~$ sudo service ssh restart
pi@RPiServer3:~$ sudo nano /etc/ssh/sshd_config
uporabnik@prenosnik:~$ cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
pi@RPiServer3:~$ cd ~
pi@RPiServer3:~$ install -d -m 700 ~/.ssh
Realno-časovna komunikacija mobilnih aplikacij s senzorji
47
3.2.3 Opis rešitve
Slika 3.26 prikazuje komponente naše rešitve in njihovo medsebojno komunikacijo.
Slika 3.26: Konfiguracijska shema centralnega strežnika in senzorjev
V prvem koraku smo na strežnik namestili MQTT posrednika Mosquitto. Najnovejšo
verzijo si lahko za izbran operacijske sisteme prenesemo iz uradnje spletne strani12.
Repozitorij za Raspberry Pi že vsebuje potrebnega posrednika, vendar je ta starejše
verzije (1.3.4). Da lahko na preprosti način namestimo najnovejšo vezijo, je za vse na
Debian bazirane distribucije na voljo poseben repozitorij. Za namestitev moramo najprej
namestiti ključ za podpisovanje, repozitorij dodati med vire in namestiti program.
Omenjeno izvedemo z naslednjim zaporedjem ukazov:
12 URL-naslova za prenos Mosquitto: https://mosquitto.org/download/
Realno-časovna komunikacija mobilnih aplikacij s senzorji
48
Dodatno smo namestili paketa mosquitto-clients in posredno preko pip tudi paho-mqtt.
Prvi namesti odjemalce, ki bodo služili za testiranje in debugiranje, drugi pa omogoča
odjemalca za programski jezik Python, v katerem bomo v naslednjem koraku izdelali
lokalnega odjemalca MQTT, ki bo prejete podatke senzorjev shranjeval v bazo za kasnejši
pregled in s pomočjo njihove analize preko izhodnega vtiča izklapljal ali vklapljal
ogrevanje.
Kot je za Debian distribucije značilno, je posrednik MQTT po namestitvi zagnan. Če ga
želimo konfigurirati, ga moramo najprej ustaviti, spremeniti konfiguracijsko datoteko
/etc/mosquitto/mosquitto.conf in ga nato ponovno zagnati. Pri tem nam pomaga naslednje
zaporedje ukazov:
Nastavitve smo v tem trenutku obdržali privzete, potrebno je bilo le omogočiti TLS- zaščito
in nastaviti pot do privatnega ključa, da smo tako zaščitili našo povezavo pred tretjimi
osebami. Za dodano pomoč naslednji ukazi vrnejo status posrednika MQTT, izpišejo
pakete, ki so na voljo pri namestitvi, in verzijo paketa, ki se bo namestil:
pi@RPiServer3:~$ sudo service mosquitto status
pi@RPiServer3:~$ sudo apt-cache search mosquitto
pi@RPiServer3:~$ sudo apt-cache policy mosquitto
pi@RPiServer3:~$ sudo service mosquitto stop
pi@RPiServer3:~$ sudo nano /etc/mosquitto/mosquitto.conf
pi@RPiServer3:~$ sudo service mosquitto start
pi@RPiServer3:~$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
pi@RPiServer3:~$ sudo apt-key add mosquitto-repo.gpg.key
pi@RPiServer3:~$ cd /etc/apt/sources.list.d/
pi@RPiServer3:~$ sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
pi@RPiServer3:~$ sudi apt-get update
pi@RPiServer3:~$ sudo apt-get install mosquitto mosquitto-clients python-setuptools
pi@RPiServer3:~$ sudo easy_install pip
pi@RPiServer3:~$ sudo pip install paho-mqtt
Realno-časovna komunikacija mobilnih aplikacij s senzorji
49
Preden namestitev posrednika zaključimo, bomo s pomočjo naslednjih ukazov preverili
delovanje nameščenega posrednika. Ukaza bomo najprej zagnali na strežniku lokalno in
potem še na lastnem računalniku. Prvi ukaz se prijavi na temo hello/world, drugi na to
temo pošlje sporočilo 'Hello Test!'. Če se ukaza uspešno izvedeta in v ukazni vrstici
zasledimo spodnji obvestili, je test uspel in posrednik MQTT je pripravljen.
V drugem koraku smo v programskem jeziku Python izdelali lokalnega odjemalca MQTT,
ki podatke iz senzorjev analizira, ter v primeru, da zazna potrebo po energiji v prostoru,
preko digitalnih izgodov in releja, vklopi/izklopi ogrevanje.
Dodatno bo odjemalec pridobljene podatke shranil v bazo, kjer bodo na voljo za kasnejšo
statistiko v spletni ali mobilni aplikaciji. Podatke bomo shranjevali v MySQL podatkovni
bazi. Trenutno aktualna verzija v Raspbian repozitoriju je 5.5.50, ki jo bomo skupaj z
odjemalcem MySQL namestili z ukazom:
Pri namestitvi podatkovnega strežnika smo izbrali geslo za uporabnika root in dodatno
namestili python-mysqldb, ki omogoča delo s podatkovno bazo MySQL v programskem
jeziku Python. S pomočjo orodja MySQL smo ustvarili novo podatkovno bazo
pi@RPiServer3:~$ sudo apt-get install mysql-server
pi@RPiServer3:~$ sudo apt-get install mysql-client python-mysqldb
pi@RPiServer3:~$ mosquitto_sub -d -t hello/world
Client mosqsub/30701-RPiServer sending CONNECT
Client mosqsub/30701-RPiServer received CONNACK
Client mosqsub/30701-RPiServer sending SUBSCRIBE (Mid: 1, Topic: hello/world, QoS: 0)
Client mosqsub/30701-RPiServer received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/30701-RPiServer received PUBLISH (d0, q0, r0, m0, 'hello/world', ... (11 bytes))
Hello Test!
pi@RPiServer3:~$ mosquitto_pub -d -t hello/world -m "Hello Test!"
Client mosqpub/30702-RPiServer sending CONNECT
Client mosqpub/30702-RPiServer received CONNACK
Client mosqpub/30702-RPiServer sending PUBLISH (d0, q0, r0, m1, 'hello/world', ... (11 bytes))
Client mosqpub/30702-RPiServer sending DISCONNECT
Realno-časovna komunikacija mobilnih aplikacij s senzorji
50
'heating_data' in uporabnika 'heating_monitor' ter mu dodelili pravice za dostop do nove
baze. Na koncu smo s pomočjo ukaza ustvarili tabele, kot jih prikazuje slika 3.27.
pi@RPiServer3:~$ mysql -u root -p
Enter password:
mysql> CREATE DATABASE heating_data;
Query OK, 1 row affected (0.00 sec)
mysql> USE heating_data;
Database changed
mysql> CREATE USER 'heating_monitor'@'localhost' IDENTIFIED BY '[password]';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON heating_data.* TO 'heating_monitor'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
pi@RPiServer3:~$ mysql -u heating_monitor -p
Enter password:
mysql> USE heating_data;
Database changed
mysql> CREATE TABLE rooms (roomid int(11), …);
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE sensors (sensorid int(11), …);
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE readings (readingid int(11), …);
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE settings (settingsid int(11), …);
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE boiler_activity (boileractivityid int(11), …);
Query OK, 0 rows affected (0.02 sec)
mysql> quit
Bye
Realno-časovna komunikacija mobilnih aplikacij s senzorji
51
Slika 3.27: ER model podatkovne baze
Program se začne z uvozom knjižnic, ki jih bomo uporabili, in deklariranjem osnovnih
nastavitev, kot so naslov MQTT posrednika, ime, vrata in interval pošiljanja signala PING:
Realno-časovna komunikacija mobilnih aplikacij s senzorji
52
Nato moramo inicializirati odjemalca MQTT in se do njega povezati. Odjemalec deluje
tako, da preko dogodkov proži povratne klice, ki smo jih ob inicializaciji nastavili:
Dogodki, na katere smo se prijavili, so naslednji:
1. on_connect(client, userdata, flags, rc): Dogodek se proži ob uspešni povezavi na
posrednika. Na tem mestu se bomo prijavili na teme, ki nas zanimajo, in tako tudi
po ponovni vzpostavitvi povezave poskrbeli, da smo na njih prijavljeni;
2. on_message(client, userdata, msg): Se proži, ko se na katero izmed prijavljenih
tem pošlje sporočilo. Ob prožitvi kličemo funkcijo obdelaj_sporocilo(msg), ki na
podlagi teme ugotovi, za kakšen podatek gre in ga obdela (zabeleži v bazo,
analizira);
# povezava do posrednika
mqtt_odjemalec = mqtt.Client(client_id=MQTT_CLIENT_ID)
mqtt_odjemalec.on_connect = on_connect
mqtt_odjemalec.on_disconnect = on_disconnect
mqtt_odjemalec.on_message = on_message
mqtt_odjemalec.on_subscribe = on_subscribe
mqtt_odjemalec.on_publish = on_publish
mqtt_odjemalec.connect(MQTT_HOST, MQTT_PORT, MQTT_PING_KEEPALIVE)
# blokiran klic, ki skrbi za povezavo in povratne klice
mqtt_odjemalec.loop_forever()
#!/usr/bin/python
import sys
import getopt
import time
import signal
import json
import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import MySQLdb
# MQTT podatki
MQTT_CLIENT_ID = 'temperature_monitor'
MQTT_HOST = '192.168.1.74'
MQTT_PORT = 1883
MQTT_PING_KEEPALIVE = 60
Realno-časovna komunikacija mobilnih aplikacij s senzorji
53
3. on_subscribe(client, userdata, mid, gqos): Dogodek se proži ob naročilu na teme.
V funkciji zabeležimo uspešno ali neuspešno prijavo;
4. on_publish(client, userdata, mid): Ta funkcija se proži, kadar se uspešno pošlje
sporočilo do posrednika in ta potrdi, da je bilo sporočilo uspešno sprejeto;
5. on_disconnect(client, userdata, rc): Funkcija se proži ob prekinitvi povezave do
posrednika. V tej funkciji zabeležimo prekinitev in se v primeru nepredvidene
prekinitve poskušamo periodično ponovno povezati. V primeru namerne prekinitve
za sabo počistimo uporabljene vire in zaključimo izvajanje programa.
Za komunikacijo s posrednikom sta pomembni še funkciji publish(topic, payload=None,
qos=0, retain=False) in subscribe(topic, qos=0). Funkcija subscribe nas prijavi na temo in
funkcija publish na posredovano temo objavi podatek. Spodnja koda prikazuje, kako smo
ju uporabili v našem programu:
Glavno obnašanje lokalnega odjemalca MQTT se nahaja v funkciji on_message, ki se
proži op prejemu sporočila. Sporočilo posredujemo do funkcije obdelaj_sporocilo(msg), ki
ga obdela tako, da s pomočjo teme ugotovi pomen podatka, ga po potrebi zabeleži v bazi
in nanj ustrezno odreagira. Obnašanje funkcije ponazarja naslednji psevdokod:
# objava nastavitev temperatur prostorov
(mr, mid) = mqtt_odjemalec.publish(room.set_temperature_topic, room.value, 0, True)
if mr != mqtt.MQTT_ERR_SUCCESS:
raise Exception('MQTT napaka (' + str(mr) + ', ' + str(mid) + ') za ' + room.set_temperature_topic)
else:
print 'Objavljeno sporocilo(#' + str(mid) + ') ' + room.value + ' na temo ' +
room.set_temperature_topic
# prijava na teme Home in Devices - znak # nas prijavi tudi na vse podteme
odjemalec.subscribe([("Home/#", 1), ("Devices/#", 1)])
Realno-časovna komunikacija mobilnih aplikacij s senzorji
54
Na koncu smo v datoteko /etc/rc.local dodali ukaz za zagon programa in tako poskrbeli,
da se ob zaključku procesa zagona sistema zažene tudi lokalni odjemalec:
Dodajanje, pregled in urejanje senzorjev poteka s pomočjo nadzorne plošče, ki smo jo v
programskem jeziku PHP izdelali v tretjem koraku. Ta je preko Apache spletnega
strežnika dosegljiva na centralnem strežniku preko naslova
https://192.168.1.74/nadzorna_plosca/ in se povezuje na že ustvarjeno lokalno MySQL
podatkovno bazo. Dodatno bo spletna aplikacija omogočala pregled nad stanjem
pi@RPiServer3:~$ sudo nano /etc/rc.local
# zagon lokalnega MQTT odjemalca
printf "Zagon MQTT odjemalca\n"
screen -dmS mqtt_ojemalec python /home/pi/temperature_monitor/main.py
def obdelaj_sporocilo(msg):
if msg.topic == status_senzorja:
update_device_database_info(naprava, status)
if device == boiler and status_changed:
if status == ON:
vklopi_ogravanje()
else:
izklopi_ ogravanje()
elif msg.topic == trenutna_temperatura:
update_device_database_info(naprava, status)
dodaj_meritev_v_bazo(naprava, vrednost)
if potrebna_energija == True:
vklopi_ ogravanje()
else:
izklopi_ ogravanje()
elif msg.topic == trenutna_vlaznost:
update_device_database_info(naprava, status)
dodaj_meritev_v_bazo(naprava, vrednost)
elif msg.topic == nastavitev_temperature
update_device_database_info(naprava, status)
if potrebna_energija == True:
vklopi_ ogravanje()
else:
izklopi_ ogravanje()
else:
raise Exception('Neprepoznano sporocilo')
Realno-časovna komunikacija mobilnih aplikacij s senzorji
55
posameznega senzorja, povezanimi odjemalci in zgodovino meritev. Dostop do aplikacije
pa bo zaščiten z uporabniškim imenom in geslom. Vsi potrebni paketki za gostovanje
aplikacije se že nahajajo v Raspbian repozitoriju, zato je namestitev hitra in preprosta.
Nameščena paketa sta verzije 2.4.10 za Apache strežnik in 5.6.24 za PHP. Namestitev
izvršimo z naslednjimi ukazi ter pri tem namestimu tudi PHP-modul za povezavo s
podatkovno bazo MySQL, modula curl in modul gd.
Izvorno kodo spletne aplikacije smo kopirali v /var/www/html/nadzorna_plosca in v
datoteki config.php ustrezno spremenili podatke za povezavo na lokalno podatkovno
bazo. V nadaljevanju bomo s pomočjo zaslonski slik na kratko predstavili osnovne funkcije
nadzorne plošče.
Slika 3.28: Zaslonska slika prijavnega okna
Na sliki 3.29 je zaslonska slika strani, ki se uporabniku odpre po uspešni prijavi (slika
3.28). Z različnimi barvami so označeni posamezni deli strani:
1. Rdeče: Avatar in ime trenutno prijavljenega uporabnika.
2. Oranžno: Glavni navigacijski meni (Domov, Odjemalci, Nastavitve in Statistika).
3. Modro: Trenutno nastavljene temperature prostorov in stanje kotla (aktiven,
neaktiven).
pi@RPiServer3:~$ sudo apt-get install apache2
pi@RPiServer3:~$ sudo apt-get install php5 libapache2-mod-php5
pi@RPiServer3:~$ sudo apt-get install php5-mysql php5-curl php5-gd
Realno-časovna komunikacija mobilnih aplikacij s senzorji
56
4. Zelena: Seznam prostorov z možnostjo brisanja in dodajanja novega. Ikona levo
od prostora prikazuje, ali so senzorji v prostoru uspešno povezani.
5. Vijoličasta: Glavna vsebina strani z naslovom trenutno izbrane strani na vrhu,
drobtinami pod naslovom in desno od drobtin možne akcijske elemente. V tem
primeru glavna vsebina prikazuje tabelo senzorjev s kolonami: ikona stanja
senzorja (povezan, nepovezan), ime, prostor, ip naslov, datum zadnje aktivnosti,
vrednosti in akcije (uredi, izbriši in prikaži). Skcijski element je dodajanje novega
senzorja.
6. Rumeno: Meni z akcijami za odjavo in nastavitve.
Slika 3.29: Zaslonska slika privzete strani nadzorne plošče z označenimi elementi
Poleg senzorjev nadzorna plošča nudi tudi pregled vseh odjemalcev, ki so se na strežnik
kadar koli povezali. Ob prvi prijavi se ti zapišejo v bazo, kjer jih lahko kasneje v nadzorni
plošči urejamo ali odstranimo. Unikatni identifikator je MAC-naslov naprave. Zraven
podatkov o napravi tabela na sliki 3.30 prikazuje tudi trenutno povezane naprave.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
57
Slika 3.30: Zaslonska slika seznama odjemalcev
Tretja izbira v meniju omogoča pregled in spreminjanje nastavitev. Te zajemajo nastavitev
željenih temperatur in prijavne podatke. Vmesnik prikazuje slika 3.31.
Slika 3.31: Zaslonska slika spreminjanja nastavitev
Realno-časovna komunikacija mobilnih aplikacij s senzorji
58
Med pomembnejše funkcionalnosti spada pregled izmerjenih podatkov posameznega
senzorja. Za izris grafa lahko izberemo čas, med katerim nas podatki zanimajo, senzor in
podatek. Primer takšnega grafa prikazuje slika 3.32.
Slika 3.32: Zaslonska slika prikaza statistike
Četrti in s tem zadnji korak pri izdelavi centralnega strežnika je bil razvoj programskega
vmesnika, preko katerega mobilna aplikacija pridobi podatke o trenutnih nastavitvah,
prostorih, senzorjih in zgodovini meritev. Komunikacija poteka preko URL-naslova
https://192.168.1.74/api/, kjer se v zahtevku pošljejo argumenti za klic posamezne funkcije
v obliki JSON-, v kateri se vrne tudi odgovor strežnika. Glavne funkcije in oblike zahtevkov
in odgovorov so zajete v tabeli 3.3.
Tabela 3.3: Opis metod programskega vmesnika
Metoda VrniNastavitve
Vrne trenutne nastavitve temperature po prostorih in morebitne druge nastavitve.
Zahtevek Odgovor Statusne kode
- {
'nast_temp': [{
'prostor': [int],
'vrednost': [string]
},…],
202 – OK
801 – Napaka strežnika
Realno-časovna komunikacija mobilnih aplikacij s senzorji
59
}
Metoda VrniProstore
Vrne vse prostore skupaj z nastavljenimi željenimi temperaturami.
Zahtevek Odgovor Statusne kode
- {
'prostorid': [int],
'ima': [string],
'opis': [string],
'tema_nast_temp': [string]
}
203 – OK
801 – Napaka strežnika
Metoda VrniSenzorje
Vrne seznam senzorjev temperature skupaj z opisnimi podatki.
Zahtevek Odgovor Statusne kode
{
'senzorid': [int],
'prostor': [int],
'tema_temp': [string],
'tema_vlaznost': [string],
'tema_status': [string],
'zadnja_akt': [string(datum)]
}
204 – OK
801 – Napaka strežnika
Metoda VrniMeritve
Vrne podatke o izbranih meritvah za izbrani senzor med posredovanim intervalom.
Zahtevek Odgovor Statusne kode
{
'senzor': [int],
'meritev': [int],
'od': [string(datum)],
'do': [string(datum)]
}
{
'enota': [string],
'podatki': [{
'datum': [string(datum)],
'vrednost': [string]
},…]
}
205 – OK
801 – Napaka strežnika
802 – Napačni argumenti
803 – Neveljaven senzor
804 – Neveljaven tip
805 – Neveljaven datum
Realno-časovna komunikacija mobilnih aplikacij s senzorji
60
Tabela 3.4: Seznam MQTT tem
Tema Pomen
Naprava/DHT_Senzor_Dnevna/status Status senzorja temperature v dnevni sobi.
Naprava/DHT_Senzor_Kuhinja/status Status senzorja temperature v kuhinji.
Naprava/DHT_Senzor_Spalnica/status Status senzorja temperature v spalnici.
Naprava/DHT_Senzor_Kopalnica/status Status senzorja temperature v kopalnici.
Naprava/Lokalni_Odjemalec/status Status lokalnega odjemalca.
Dom/DnevnaSoba/tren_temperatura Trenutno izmerjena temperatura v dnevni.
Dom/DnevnaSoba/tren_vlaznost Trenutno izmerjena vlažnost v dnevni.
Dom/DnevnaSoba/nast_temperatura Nastavljena temperatura v dnevni.
Dom/Kuhinja/tren_temperatura Trenutno izmerjena temperatura v kuhinji.
Dom/Kuhinja/tren_vlaznost Trenutno izmerjena vlažnost v kuhinji.
Dom/Kuhinja/nast_temperatura Nastavljena temperatura v kuhinji.
Dom/Spalnica/tren_temperatura Trenutno izmerjena temperatura v spalnici.
Dom/Spalnica/tren_vlaznost Trenutno izmerjena vlažnost v spalnici.
Dom/Spalnica/nast_temperatura Nastavljena temperatura v spalnici.
Dom/Kopalnica/tren_temperatura Trenutno izmerjena temperatura v kopalnici.
Dom/Kopalnica/tren_vlaznost Trenutno izmerjena vlažnost v kopalnici.
Dom/Kopalnica/nast_temperatura Nastavljena temperatura v kopalnici.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
61
3.3 Izdelava mobilne aplikacije
3.3.1 Predstavitev operacijskega sistema
Mobilna aplikacija, ki jo bomo uporabili za komunikacijo s senzorji, je izdelana za
operacijski sistem Android. Na svetu je trenutno 1.4 milijarde Android uporabnikov in ima
s 53.3 % največji delež na globalnem trgu [41]. Največja zbirka aplikacij je na voljo na
Google Play in zajema več kot 2 milijona aplikacij [42]. Razvoj operacijskega sistema se je
začel v podjetju Android, Inc., ki ga je leta 2005 kupil Google. Prvič je bil predstavljen
novembra 2007, skupaj z ustanovitvijo Open Handset Alliance – konzorcij 84 podjetij s
področja programske in strojne opreme ter telekomunikacijskih storitev. Z izidom verzije
1.5, imenovane Cupcake v aprilu 2009, se je nakazal hiter razoj, ki je skoraj vsake pol leta
prinesel novo verzijo operacijskega sistema. Kot zanimivost so vse verzije do sedaj
poimenovane po sladicah. Trenutno aktualna verzija 6.0 je bila izdana oktobra 2015 in se
imenuje Marshmallow. Operacijski sistem temelji na Linux-u in je dostopen preko
razvijalcu prijazne odprtokodne licence. To omogoča različnim proizvajalec mobilnih
naprav izdelavo in prilagoditev sistema svojim potrebam, kar s sabo prinaša raznolikost
obenem pa povzroča fragmentacijo sistema, počasne posodobitve in vejo podvrženost
ranljivostim. Na trgu trenutno obstaja več kot 4000 različnih naprav, od telefonov in tablic,
vse do avtomobilov in pametnih ur, ki jih poganja Android operacijski sistem [41].
Programski paket je sestavljen iz Linux jedra, knjižnic in programskih vmesnikov,
napisanih v C, ter programskega okvirja, ki je kompatibilen z Java knjižnicami, temelječimi
na Apache Harmony. Razvijalci lahko aplikacije pišejo v programskem jeziku Java, ki jih
poganja Delvik v virtualnem stroju.
3.3.2 Razvojno okolje
Do pred kratkim so se Android aplikacije razvijale v Eclipse razvojnem okolju s pomočjo
namestitve ADT (Android Developer Tools) vtičnika in Android SDK (Software
development kit). Junija 2015 je Google oznanil, da končuje razvoj in podporo za vtičnik
ter izbral Android Studio kot uradno razvojno okolje [46]. S to odločitvijo so pospešili
razvoj okolja in Android Studio je dobil številne nove funkcionalnosti, kot so takojšen
zagon, bolj inteligenten urejevalnik kode, bogatejši in hitrejši emulator naprav, integracijo z
Google oblačnimi storitvami ter druge pomembe izboljšave. Snovan na IntelliJ IDEA, za
delovanje zahteva JDK (Java Development Kit) 8 in operacijski sistem Windows, Linux ali
Mac. Aktualna verzija v času pisanja je 2.1.2, izdana junija 2016. Namestitveni paket, ki
Realno-časovna komunikacija mobilnih aplikacij s senzorji
62
se ga sname na uradni spletni strani13, že vsebuje vse potrebne komponente (razvojno
okolje IntelliJ IDEA, Android Studio vtičnik, Android SDK, Android platformo in Android
Emulator s sistemskimi slikami, ki vključujejo Google Play Services) [47]. Namestitev na
operacijskem sistemu Ubuntu je zelo preprosta:
1. S spodnjim ukazom preverimo verzijo namestitve JDK. Če le-ta ni nameščena, ali
je nižja od verzije 1.8, moramo na računalnik prenesti in namestiti verzijo JDK 8:
2. Če imamo 64-bitni sistem, z ukazom namestimo zahtevane 32-bitne knjižnice:
3. Z uradne spletne strani prenesemo aktualno verzijo orodja:
4. Prenesen arhiv s spodnjim ukazom premaknemo na lokacijo, kjer želimo orodje
namestiti, in ga razširimo:
5. Opcijsko lahko dodamo pot do mape bin ob zagonu sistema k spremenljivki PATH,
da bomo lahko orodje zagnali v vseh mapah sistema:
6. Pomaknemo se v mapo bin in zaženemo program:
7. V odprtem oknu potrdimo, ali želimo uvoziti nastavitve ali ne ter s tem odpremo
čarovnika, ki nas vozi skozi namestitev, ki je lahko standardna ali po meri.
Izbiramo lahko med temo razvojnega okolja, lokacijo namestitve Android SDK in
platformami, ki jih želimo namestiti.
13 Uradnja spletna stran orodja Android Studio: https://developer.android.com/studio
uporabnik@prenosnik:/opt$ cd android-studio/bin
uporabnik@prenosnik:/opt/android-studio/bin$ sudo ./studio.sh
uporabnik@prenosnik:~$ echo -e "\n# Android Studio\nexport PATH=\$PATH:/opt/android-
studio/bin" >> .bashrc
uporabnik@prenosnik:~/Downloads$ sudo mv android-studio-ide-143.2915827-linux.zip
/opt
uporabnik@prenosnik:~/Downloads$ cd /opt
uporabnik@prenosnik:/opt$ sudo unzip android-studio-ide-143.2915827-linux.zip
uporabnik@prenosnik:~/Downloads$ wget https://dl.google.com/dl/android/studio/ide-
zips/2.1.2.0/android-studio-ide-143.2915827-linux.zip
uporabnik@prenosnik:~$ sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0
lib32stdc++6
uporabnik@prenosnik:~$ javac 1.8.0_91
Realno-časovna komunikacija mobilnih aplikacij s senzorji
63
Po zaključku čarovnika se prikaže grafični vmesnik, kot ga prikazuje slika 3.33. Označeni
elementi na sliki so:
1. Orodna vrstica (modro).
2. Navigacijska vrstica (rdeče).
3. Orodna okna (zeleno).
4. Okno urejevalnika kode (rumeno).
5. Statusna vrstica (vijoličasto).
Slika 3.33: Grafični vmesnik razvojnega okolja Android Studio
Preden smo lahko začeli s programiranjem, smo morali s pomočjo čarovnika ustvariti nov
projekt, kjer smo izbrali ime aplikacije, ime paketa, lokacijo, platformo (v našem primeru
za telefone in tablice), minimalno verzijo Android SDK ter predlogo začetne kode. Po
končanem postoku je bilo okolje pripravljeno za razvoj aplikacije, ki je opisan v naslednjih
dveh podpoglavjih.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
64
3.3.3 Razvoj grafičnega vmesnika
Uporabniški vmesnik mobilne aplikacije je zelo preprost, pregleden in intuitiven. Slika 3.34
prikazuje vstopno stran aplikacije. V modrem kvadratu je prikazana nastavljena
temperatura prostora. Nad vrednostjo temperature je indikator statusa povezave mobilne
aplikacije do posrednika MQTT, ki v zeleni barvi ponazarja vzpostavljeno povezavo in v
rdeči prekinjeno. Pod vrednostjo je prikazana trenutna izbira, za katero se vrednost
nastavlja. Izbira se lahko med katerimkoli prostorom s seznama. V primeru, da prostor na
seznamu ni izbran, se vrednost nastavlja za vse prostore hkrati. S klikom na segment se
odpre dialog, prikazan na sliki 3.35. Ta omogoča izbiro željene temperature, ki jo potrdimo
z izbiro akcije 'Potrdi'. Desno od segmenta za trenutno nastavljeno temperaturo se nahaja
segment s statusom ogrevanja – označen v zeleni barvi. Ta nad ikono vsebuje indikator
statusa povezave odjemalca MQTT na centralnem strežniku. Tudi tukaj indikator zelene
barve pomeni, da je povezava vzpostavljena, in rdeč, da je prekinjena. Pod ikono je
prikazano trenutno stanje ogrevanja (vklopljeno/izklopljeno), ki se ga lahko spremeni s
klikom na segment. Dialog je prikazan na sliki 3.35 in vsebuje stikalo za vklop/izklop in
akcijo 'Potrdi' za izvedbo spremembe.
Slika 3.34: Zaslonska slika mobilne aplikacije, levo brez izbranega prostora in desno z izbranim
prostorom
Realno-časovna komunikacija mobilnih aplikacij s senzorji
65
V rdečem okvirju je označen seznam vseh prostorov, ki smo jih pridobili s klicem metode
VrniProstore programskega vmesnika. Posamezen element seznama vsebuje naziv
prostora levo in trenutno izmerjeno temperaturo prostora desno, v prvi vrsti celice. Desno
ob nazivu prostora je indikator statusa povezave senzorja do posrednika MQTT. Pomen
indikatorja je enak kot v prvih dveh primerih. Informacija o trenutno izmerjeni relativni
zračni vlažnosti se nahaja pod nazivom prostora. Nastavljena temperatura prostora je
izpisana pod trenutno izmerjeno temperaturo prostora. Pritisk na element seznama le-
tega izbere in razširi pogled s prikazom grafa meritev temperatur prostora za preteklih 24
ur. Izgled razširjenega pogleda elementa seznama prikazuje slika 3.34 v vijoličastem
okvirju. Poleg izmerjenih temperatur je na grafu v rdeči barvi prikazana tudi nastavljena
temperatura prostora v razmerju s časom.
Slika 3.35: Zaslonska slika dialoga za spremembo nastavljene temperature levo in dialoga za
vklop/izklop ogrevanja desno
Realno-časovna komunikacija mobilnih aplikacij s senzorji
66
Poleg prikazanih pogledov smo izdelali tudi pogled za nastavitve, ki ga odpremo z izbiro
menija. Spreminjamo lahko naslednje nastavitve:
1. IP-naslov centralnega strežnika.
2. Uporabniško ime in geslo za avtorizacijo in avtentikacijo.
3. Interval poizkusa ponovne vzpostavitve povezave v primeru nepričakovane
prekinitve.
4. Vrednost znižane temperature za varčevanje z energijo.
5. Izbira domačega brezžičnega omrežja.
6. Izbira lokacije za dom.
3.3.4 Implementacija komunikacije s centralnim strežnikom
Tako kot obstajajo različne implementacije MQTT posrednikov, obstajajo tudi MQTT
odjemalci. Ti so tako v različnih programskih jezikih, kakor tudi platformah. Ena
funkcionalno bogatejših in popularnejših je Eclipse Paho, ki je na voljo za različna
programska okolja (Java, Python, JavaScript, Golang, C#, C, C++). Projekt je bil ustvarjen
z namenom, da se razvije zanesljiva odprtokodna implementacija, ki sledi aktualnemu
standardu MQTT. Začetno kodo, ki se aktivno razvija in vzdržuje, je na začetku projekta
doniralo podjetje IBM. Ker je mobilna aplikacija izdelana za Android operacijski sistem, se
izbira zoža na implementacije v Java programskem jeziku. Eclipse Paho v ta namen
ponuja posebno implementacijo za Android v obliki komponente Service, ki v ozadju
komunicira s Paho Java MQTT odjemalcem. Knjižnica implementira standarda MQTT 3.1
in MQTT 3.1.1 in vključuje funkcionalnosti, kot so LWT, SSL/TLS, Message Persistence,
Automatic Reconnect, Offline Buffering, WebSocket in Non-Blocking API [43]. Za uporabo
moramo imeti nameščen Android Studio in Android SDK verzije 19 ali višje. Za namestitev
projekt ponuja izbiro med Maven in Gradle upravljalcem odvisnosti ali gradnjo knjižnice
JAR iz izvorne kode. Sami smo uporabili Gradle upravitelja, za kar smo morali v datoteko
build.gradle Android projekta dodati naslednjo vsebino, ki doda Paho repozitorij:
repositories {
maven {
"https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
67
In v datoteko build.gradle Android aplikacije sledeči vrstici, ki dodata odvisnosti aplikacije:
Osnovna logika knjižnice je servis, ki skrbi za vzpostavitev in vzdrževanje povezave ter
pošiljanje in prejemanje sporočil. Servis se zažene ob zagonu aplikacije in se zaključi ob
izhodu. Komunikacija z njim poteka asinhrono preko vmesnika, imenovanega
MqttAndroidClient, kar naredi uporabo preprosto in intuitivno [45]. Za zagon servisa
moramo v AndroidManifest.xml dodati potrebne pravice in pod značko application
deklarirati uporabo servisa:
Prvi korak je vzpostavitev povezave do strežnika. Poleg protokola, naslova, vrat in id
odjemalca lahko pri povezavi kot argument pošljemo tudi opcijski parameter, ki omogoča
še dodatne nastavitve verzije protokola, avtorizacije in avtentikacije (uporabniško
ime/geslo, digitalno potrdilo), 'oporoke', interval obujanja, čas prekinitve, samodejne
ponovne povezave, seje in drugih bolj ali manj pomembnih parametrov. V lastni mobilni
aplikaciji smo povezavo vzpostavili znotraj metode Activity.onCreate z naslednjim delom
kode:
<manifest>
…
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
…
<application>
…
<service android:name="org.eclipse.paho.android.service.MqttService" />
…
</application>
…
<manifest>
dependencies {
…
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.3-SNAPSHOT'
compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.0.3-SNAPSHOT'
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
68
// generiranje idja odjemalca
String idOdjemalca = MqttClient.generateClientId();
// dodatne nastavitve povezave
MqttConnectOptions moznosti = new MqttConnectOptions();
// moznosti.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
// nastavitev Last Will And Testament (LWT)
moznosti.setWill("Naprava/" + idOdjemalca + "/status", "OFF".getBytes(), 1, false);
// nastavitev avtorizacije in avtentikacije
moznosti.setUserName("[uporabniško ime]");
moznosti.setPassword("[geslo]".toCharArray());
// inicializacija MQTT odjemalca
mMQTTClient = new MqttAndroidClient(getApplicationContext(), "tcp://192.168.1.74:1883", idOdjemalca);
try {
// definiranje povratnih klicev
mMQTTClient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean reconnect, String serverURI) {
Log.d(TAG, "connectComplete(" + String.valueOf(reconnect) + "): " + serverURI);
}
@Override
public void connectionLost(Throwable cause) {
Log.d(TAG, "connectionLost(): " + cause.toString());
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.d(TAG, "messageArrived(" + topic + "): " + message.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.d(TAG, "deliveryComplete(): " + token.toString());
}
});
Realno-časovna komunikacija mobilnih aplikacij s senzorji
69
// vzpostavitev povezave
mMQTTToken = mMQTTClient.connect(moznosti);
mMQTTToken.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Snackbar.make(mSeznam, "Povezavi do MQTT posrednika vzpostavljena",
Snackbar.LENGTH_LONG).show();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Snackbar.make(mSeznam, "Napaka pri povezavi do MQTT posrednika!",
Snackbar.LENGTH_LONG).setAction("Ponovi", null).show();
}
});
}
catch (MqttException e) {
e.printStackTrace();
Snackbar.make(mSeznam, "Napaka pri povezavi do MQTT posrednika!",
Snackbar.LENGTH_LONG).setAction("Ponovi", null).show();
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
70
Pogledati si moramo še naročanje na teme in objavljanje sporočil. Naročanje opravimo v
povratnem klicu connectComplete, kar zagotovi, da se tudi ob morebitni prekinitvi
povezave ponovno naročimo na teme, ko se povezava samodejno ponovno vzpostavi.
Naročanje na teme smo si od bliže pogledali v poglavju s predstavitvijo protokola MQTT.
Tukaj pa si bomo s pomočjo izseka kode pogledali, kako se to izvede v Paho Java MQTT
odjemalcu:
// prijava na temo Naprave/# in Home/#
try {
// tema je lahko tipa string, ali polje stringov, kar je v primeru večih tem učinkovitejše
IMqttToken subToken = mMQTTClient.subscribe(Config.MQTT_TEME,
Config.MQTT_TEME_QOS);
subToken.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
// prijava na temo je bila uspesna
Log.d(TAG, "subscribe onSuccess()");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
// prijava na temo ni uspela (tažava z avtorizacijo?)
Log.d(TAG, "subscribe onFailure()");
}
});
}
catch (MqttException e) {
e.printStackTrace();
Snackbar.make(mSeznam, "Napaka pri prijavi na teme!",
Snackbar.LENGTH_LONG).setAction("Ponovi", null).show();
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
71
Podobno preprosto je tudi objavljanje sporočil. Objavljanje uporabljamo ob spreminjanju
nastavljene temperature prostora ali spreminjanju stanja kotla (vklop/izklop). Prav tako ob
uspešni vzpostavitvi povezave do strežnika na temo naprave objavimo uspešno
povezavo, da se lokalnega odjemalca MQTT na centralnem strežniku obvesti o uspešni
prijavi in se ta zrcali tudi v nadzorni plošči. Objavljanje sporočila omogoča naslednja koda:
Omeniti velja, da je potrebno vsebino pretvoriti iz niza UTF-8 znakov v polje tipa byte. Če
imamo željo poslati zadržano sporočilo, lahko to storimo s klicem metode
setRetained(true) razreda MqttMessage.
Pri delu z razredom MqttAndroidClient sta pomembni še dve funkcionalnosti.
Unsubscribe, ki je v aplikaciji nismo uporabili in omogoča odjavo od prejemanja sporočil
na določeno temo, ter disconnect, ki zapre vzpostavljeno povezavo do posrednika MQTT.
// objava sporočila
String tema = "Dom/DnevnaSoba/nast_temperatura";
String vsebina = "22.1";
try {
MqttMessage sporocilo = new MqttMessage(vsebina.getBytes("UTF-8"));
// v primeru, da želimo poslati zadržano sporocilo
//sporocilo.setRetained(true);
mMQTTClient.publish(tema, sporocilo);
}
catch (UnsupportedEncodingException | MqttException e) {
e.printStackTrace();
Snackbar.make(mSeznam, "Napaka pri objavi sporočila!",
Snackbar.LENGTH_LONG).show();
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
72
Primer uporabe obeh prikazuje sledeči izsek kode:
// prekinitev povezave
try {
IMqttToken disconToken = client.disconnect();
disconToken.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
// prekinitev povezave uspesna
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
// tezava pri prekinitvi povezave, ki je vrjetno vseeno prekinjena
}
});
}
catch (MqttException e) {
e.printStackTrace();
}
// odjava od teme
String tema = "Naprave/#";
try {
IMqttToken unsubToken = client.unsubscribe(tema);
unsubToken.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
// odjava na temo uspešna
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
// pri odjavi je prislo do nepredvidene napake
}
});
}
catch (MqttException e) {
e.printStackTrace();
}
Realno-časovna komunikacija mobilnih aplikacij s senzorji
73
V poglavju smo želeli izpostaviti dele kode, ki prikazujejo delo z odjemalcem MQTT. V
splošnem smo opazili, da je delo s pomočjo vmesnika za komunikacijo s servisom, ki skrbi
za povezavo, preprosto in pregledno. Ker je knjižnica kvalitetno dokumentirana, tudi
odpravljanje težav ni bilo problematično. Izkazalo se je, da je implementacija stabilna in
komunikacija poteka brez težav. Izjemoma so se te lahko pojavile na javnih brezžičnih
omrežjih, kjer so dostopi pogosto bolj strogo nadzorovani in v nekaterih primerih dovolijo
komunikacijo samo preko določenih vrat, kot so vrata 80 za splet. Poleg izpostavljene
kode za komunikacijo, smo pri pisanju upoštevali priznane principe programiranja za
Android naprave in pri vmesniku upoštevali, da sledi modernim smernicam razvoja
Android aplikacij.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
74
3.4 Primerjalna analiza implementacije rešitve s pomočjo izbranih
tehnologij v primerjavi s HTTP
V poglavju 3 smo do sedaj predstavili protokole za realno-časovno komunikacijo, izbrali za
naš primer uporabe najprimernejšega ter izdelali centralni strežnik in mobilno aplikacijo, ki
ga za medsebojno komunikacijo uporabljata. V zaključku poglavja bomo analizirali, ali
smo z izbranim protokolom MQTT v primerjavi s protokolom HTTP, komunikacijo pohitrili
in zmanjšali količino prenesenih podatkov.
Za analizo bomo uporabili dva računalnika Raspberry Pi 3, ki imata že integriran WiFi-
modul, preko katerega sta povezana do brezžičnega usmerjevalnika MikroTik hAP lite.
Računalnika sta hkrati tudi edini napravi, ki sta v to omrežje povezani. V obeh je 16 GB
kartica microSDHC podjetja Samsung, na kateri je po navodilih iz podpoglavja 3.2.2
nameščen operacijski sistem Raspbian Jessie. Podrobnejšo konfiguracijo posameznega
računalnika prikazuje tabela 3.5. Nastavitve za nameščene komponente smo pustili
privzete, spremenili smo le parametre, ki so bili potrebni za delovanje v testnem okolju.
Tabela 3.5: Konfiguracija računalnikov za analizo
Ime Odjemalec Strežnik
Platforma Raspberry Pi 3 Raspberry Pi 3
Operacijski sistem Raspbian Jessie Raspbian Jessie
IP-naslov 192.168.2.61 192.168.2.64
Nameščene komponente Mosquitto-clients v1.4.9
Paho-mqtt v1.2
Wireshark v2.0.3
Apache v2.4.10 (port 80)
Mosquito v1.4.9 (port
1883)
V prvem delu smo med sabo primerjali velikost podatkov, ki se pošiljajo po omrežju. V ta
namen smo pripravili Python skripto, ki teče na odjemalcu in s pomočjo izbranega
protokola podatek pošlje do strežnika. Pri tem smo sporočilu, poslanemu preko protokola
MQTT, določili QoS nivoja 1, ki potrjuje sprejem sporočila, in s tem zagotovili boljšo
primerljivost med protokoloma. S pomočjo programa Wireshark, ki je namenjen
analiziranju omrežnih protokolov, smo zajeli pakete, ki se za posamezni protokol pošljejo,
in tako ugotovili njihovo velikost. Rezultat takšne analize prikazuje slika 3.36. Zajem
podatkov smo omejili na protokol in IP-naslov strežnika. V ta namen smo uporabili
naslednji filter:
(http || mqtt) && ip.addr == 192.168.2.64
Realno-časovna komunikacija mobilnih aplikacij s senzorji
75
Slika 3.36: Zaslonska slika zajema podatkov s pomočjo programa Wireshark
S skripto smo poslali sporočilo, ki je vsebovalo časovni žig v mikrosekundah in niz znakov
obliki v JSON. Poskrbeli smo, da je spletni naslov HTTP zahtevka enake dolžine kot ime
teme pri protokolu MQTT in tudi v tem pogledu zagotovili enakost. Vsebino v skupni
velikost 158 B smo poslali s tem ukazom:
pi@odjemalec:~/analiza$./data_test.py -p oba -n 1 -s 192.168.2.64
Zagon odjemalca ...
Streznik: 192.168.2.64
Protokol: oba
Stevilo sporocil: 1
Cas zagona: 2016-08-20 11:09:16.583420
Posiljanje http ...
Podatek 1 {'cas': 1471691358.586515, 'niz': 'Lorem…', 'id': 'c672…'}
Podatek 1 200 OK
Trajanje: 0.121195
Posiljanje mqtt ...
Podatek 1 {'cas': 1471691362.721499, 'niz': 'Lorem…', 'id': 'c8e9…'}
Podatek 1 0 1
Trajanje: 0.101551
Realno-časovna komunikacija mobilnih aplikacij s senzorji
76
Opazili smo, da se je pri zahtevku HTTP preneslo 448 B in pri odgovoru 324 B podatkov,
skupaj torej 772 B. Pri MQTT se je za vzpostavitev povezave preneslo 166 B, za
prekinitev povezave 68 B in za prenos vsebine skupaj s potrditvijo prejema (QoS 1) 332
B, skupaj 566 B podatkov. Ugotovili smo, da MQTT pri pošiljanju enega sporočila porabi
26,68 % manj podatkov. Prednost protokola pride še bolj do izraza v primeru pošiljanja
večih sporočil, saj se vzpostavljanje povezave izvede samo prvič. Pri poslanih 100
sporočilih tako prihranimo že 56,69 % podatkov. Odvisnost med številom poslanih sporočil
in velikostjo poslanih podatkov prikazuje graf na sliki 3.37.
Slika 3.37: Velikost poslanih podatkov glede na število poslanih sporočil
Drugi del analize govori o hitrosti pošiljanja posameznega sporočila. Tudi v ta namen smo
v programskem jeziku Python implementirali skripto, ki z naslednjim ukazom preko
izbranega protokola pošlje določeno število sporočil do strežnika in izmeri čas, ki je bil za
izvedbo potreben:
Realno-časovna komunikacija mobilnih aplikacij s senzorji
77
To smo storili za 100, 1000 in 10000 poslanih sporočil. Za vsak sklop smo test trikrat
ponovili, izračunali povprečje in rezultate zabeležili na graf v sliki 3.38.
Slika 3.38: Trajanje pošiljanja sporočil glede na število poslanih sporočil
Iz grafa lahko razberemo, da je MQTT v primerjavi s HTTP hitrejši. Če za primer izberemo
1000 poslanih sporočil, smo za pošiljanje preko HTTP potrebovali 17.75 sekund, kar
znaša 0.01775 sekunde za posamezno sporočilo. Pri MQTT smo za enako pošiljanje
pi@odjemalec:~/analiza$./test_hitrosti.py -p mqtt -n 100 -s 192.168.2.64
Zagon odjemalca ...
Streznik: 192.168.2.64
Protokol: mqtt
Stevilo ponovitev: 100
Cas zagona: 2016-08-20 19:04:52.695458
Posiljanje mqtt ...
Trajanje: 0.03001
pi@odjemalec:~/analiza$./test_hitrosti.py -p http -n 100 -s 192.168.2.64
Zagon odjemalca ...
Streznik: 192.168.2.64
Protokol: http
Stevilo ponovitev: 100
Cas zagona: 2016-08-20 19:06:21.571901
Posiljanje http ...
Trajanje: 1.770747
Realno-časovna komunikacija mobilnih aplikacij s senzorji
78
potrebovali 0.1602 sekunde in posamezno sporočilo prenesli v 0.0001602 sekunde. S
pomočjo MQTT smo torej sporočilo prenesli 110.8-krat hitreje kot s HTTP.
Na podlagi analize smo ugotovil, da z uporabo protokola MQTT pridobimo tako na
velikosti prenesenih podatkov kakor tudi na hitrosti. Glavna prednost protokola v
primerjavi s HTTP je, da je povezava do posrednika ves čas odprta, kar omogoča tako
hitrejše pošiljanje kakor tudi manjšo količino prenesenih podatkov, saj se metapodatki za
vzpostavitev podatkov prenesejo samo enkrat in ne vsakič znova. Omenjeni lastnosti sta
posebej pomembni v mobilnem svetu, kjer smo pogosto omejeni s količino prenesenih
podatkov. S tega vidika ima MQTT še dodatno prednost pred HTTP, saj ta na mobilnih
napravah Android pri pošiljanju porabi 11.89-krat in pri sprejemanju 170.9-krat manj
baterije [75]. Seveda takšna primerjava ni povsem poštena. Protokola sta bila izdelana za
različne namene, zato moramo vedeti, da je pomembno v pravi situaciji izbrati pravi
protokol, saj lahko ta pomembno vpliva na kakovost in delovanje naše rešitve.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
79
4 IZDELAVA APLIKACIJE ZA PAMETNO URO
4.1 Predstavitev Android Wear platforme
Za boljši pregled nad stanjem temperatur v prostoru ter še lažje in hitrejše upravljanje smo
izdelali tudi aplikacijo za platformo Android Wear, ki se uporablja za poganjanje pametnih
ur. Platformo je podjetje Google predstavilo marca 2014 z izdajo posebne verzije
operacijskega sistema Android, namenjenega pametnim uram in drugim dodatkom. Kmalu
za tem sta na trg prišli tudi prvi napravi, ki ju je nova verzija poganjala, Samsung Gear
Live and LG G Watch, katerima se je hitro pridružila tudi pametna ura Moto 360 podjetja
Motorola, ki je prikazana na sliki 4.1.
Slika 4.1: Pametna ura Moto 360 podjetja Motorola [50]
Sistem deluje tako, da se preko Bluetooth ali WiFi povezave poveže z Android pametnim
telefonom in si z njim deli informacije ter obvestila, kot so prihajajoči klici, tekstovna
sporočila, dogodki koledarja in obvestila drugih aplikacij. Te prikaže in uporabniku
omogoča, da se s preprostimi akcijami na njih odzove. Poleg informacij si s povezanim
telefonom deli tudi funkcionalnost. Od telefona lahko zahteva informacijo o GPS-
koordinatah ali na njem izvaja določena opravila, kot so začetek in prekinitev predvajanja
glasbe. Pomemben del sistema je tudi glasovno upravljanje, ki omogoča izvrševanje
preprostih nalog, kot so pošiljanje tekstovnega sporočila, povpraševanje po poti,
dodajanje opomnika, dodajanje beležk, zagon aplikacij na telefonu, in drugih nalog, ki se
lahko s pomočjo dodatnih aplikacij tudi razširijo [48].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
80
Medtem ko ima nova platforma z osnovno verzijo veliko skupnega, je med njima tudi
veliko razlik. Največja je v grafičnem vmesniku, ki je povsem nov, prilagojen manjšim
zaslonom. Sestavljen je iz začetnega zaslona, ki vsebuje ozadje z vsebino odprte kartice
ali podobo ure. Podoba lahko vsebuje pokazatelje različnih statusov (povezava, polnjenje,
število neprebranih sporočil …) in na dnu pogled prve kartice iz toka, kot je to prikazano
na sliki 4.2. Če z navpično kretnjo povlečemo z vrha zaslona, se prikaže statusni zaslon,
ki prikaže datum in stanje baterije. S pomikanjem levo in desno lahko vklapljamo ali
izklapljamo funkcije: brez motenja, način kina, povišana svetlost, in odpremo nastavitve. V
nastavitvah se lahko spreminja svetlost, podoba ure, velikost pisave, vklop/izklop gest,
vedno vklopljen zaslon, brezžična povezava, Bluetooth povezava, letalski način,
dostopnost, datum in ura, zaklep zaslona, pravice, informacije o sistemu ter izklop in
ponovni zagon naprave. Podobno lahko z gesto potega levo, na domačem zaslonu,
prikličemo seznam nameščenih aplikacij. Z izbiro se ta zažene v celozaslonskem načinu.
Slika 4.2: Podoba ure s pogledom kartice z vrha toka [49]
Osnovni koncepti delovanja so predlogi, ki predstavljajo navpičen tok kartic, po katerem
se lahko pomikamo s pomočjo navpične geste povleci. Na zaslonu se hkrati pokaže samo
ena kartica, ki vsebuje za uporabnika v danem trenutku relevantno informacijo. S pomočjo
slik v ozadju se uporabniku informacija predstavi tudi vizualno. Dodatno se lahko karticam
dodajo tudi akcije, do katerih se pride z vodoravno gesto povleci levo. Če želimo kartico
zapreti, to naredimo z vodoravno gesto povleci v desno. Prednost pristopa je v tem, da se
uporabniku ni potrebno prebijati skozi seznam aplikacij, da pridobi željeno informacijo,
ampak mu je ta pri roki, ko jo potrebuje. S tem namenom lahko tretje aplikacije kartico
ustvarijo in jo v relevantnem trenutku dodajo v tok.
Drugi koncept je koncept povpraševanja, ki se uporablja, kadar se željena informacija ne
nahaja med predlogi. Uporabnik kartico aktivira s pomočjo glasovnega ukaza »OK
Realno-časovna komunikacija mobilnih aplikacij s senzorji
81
Google« ali z dolgim pritiskom na privzeti zaslon. Željen ukaz lahko nato izgovorimo ali ga
izberemo s seznama. S pomočjo namere (angl. Intent), ki se s takšnim ukazom ustvari, se
lahko tudi tretje aplikacije na to odzovejo in razširijo funkcionalnost celotnega sistema
[49].
Pri načrtovanju aplikacij za Android Wear moramo upoštevati, da njihov namen ni
podvajanje celotne funkcionalnosti, ki jo ponujajo aplikacije na pametnih telefonih, temveč
njihovo dopolnjevanje. Z zgornjo mislijo smo v naslednjem poglavju načrtovali tudi lastno
aplikacijo.
4.2 Predstavitev rešitve in opis implementacije
Aplikacije, ki tečejo na pametni uri, morajo biti preproste in pregledne. Naloge, ki jih z
njihovo pomočjo lahko opravimo, pa se morajo izvesti hitro in z malo uporabnikove
interakcije. S tega vidika smo izdelali dve komponenti. Prva komponenta je aplikacija, ki
omogoča pregled in nadzor nad temperaturami v prostoru. Najdemo jo na seznamu
nameščenih aplikacij. Ob odprtju se prikaže začetni zaslon, ki ga prikazuje slika 4.3. Na
zaslonu imamo izpisano trenutno nastavljeno temperaturo za vse prostore in status kotla.
Obe vrednosti lahko spremenimo z izbiro akcije pod posamezno informacijo. Akcija za
spremembo nastavljene temperature odpre zaslon, prikazan na sliki 4.4, s pomočjo
katerega lahko spremenimo nastavljeno temperaturo. S klikom desnega gumba (potrditev)
na zaslonu spremenimo nastavljeno temperaturo v vseh prostorih v enem koraku. Če
želimo spremembo prekiniti, to storimo z levim gumbom (prekinitev). Desna akcija na
začetnem zaslonu omogoča vklop/izklop ogrevanja. Izbira akcije odpre zaslon na sliki 4.4.
Ta vsebuje stikalo za vklop/izklop in gumba za prekinitev ali potrditev spremembe.
Slika 4.3: Začetni zaslon aplikacije (levo) in kartica prostora (desno)
S pomočjo navpične geste povleci se lahko pomikamo med začetnim zaslonom in zasloni
posameznih prostorov, ki se pridobijo s strežnika. Na sliki 4.3 je prikazan primer takšnega
Realno-časovna komunikacija mobilnih aplikacij s senzorji
82
zaslona. Ta ima v naslovu izpisano ime prostora, pod katerim je informacija o trenutno
izmerjeni temperaturi prostora, ki ga desno spremlja podatek o nastavljeni temperaturi le-
tega. Spremembo trenutno nastavljene temperature prostora lahko izvedemo z akcijo, ki
se nahaja pod omenjenimi podatki. Ta odpre zaslon, prikazan na sliki 4.4, z že opisanimi
funkcionalnostmi.
Slika 4.4: Zaslon za spremembno vrednosti temperature (levo) in vklopa/izklopa ogrevanja (desno)
Eden pomembnejših principov Android Wear je, da ta ne moti uporabnika pri njegovem
delu ter tako zagotavlja tekočo in nemotečo uporabniško izkušnjo. V ta namen se morajo
aplikacije zavedati svojega okolja in konteksta, da lahko v pravem trenutku nudijo pravo
informacijo. S pomočjo bogatih obvestil, ki se prikažejo ob pravem trenutku, lahko sistem
uporabniku asistira pri njegovih opravkih.
Z omenjeno mislijo smo izdelali drugo komponento, ki kot servis teče na telefonu in
zaznava lokacijo uporabnika. V primeru, da preko prekinitve povezave do domačega
brezžičnega omrežja ali spremembe lokacije zazna, da uporabnik odhaja od doma, v tem
primeru pošlje obvestilo, ki se uporabniku prikaže na pametni uri in z vibracijo nanj tudi
opozori. Obvestilo uporabnika pozove za potrditev vključitve varčnega načina ogrevanja,
ki zniža temperaturo v vseh prostorih na nastavljeno vrednost. Nasprotno omenjenemu je
obvestilo, ki se prikaže, kadar se zazna prihod uporabnika domov in delovanje ogrevanja
v varčnem načinu. Takrat se uporabnika vpraša za potrditev izklopa varčnega načina
ogrevanja. Takšni obvestili ponazarja slika 4.5. Omeniti je potrebno, da je v primeru, kadar
uporabnik obvestilo spregleda ali zavrne, mogoče vklopiti/izklopiti varčni način ogrevanja s
pomočjo mobilne aplikacije.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
83
Slika 4.5: Obvestilo ob odhodu od doma (levo) in vračanju domov (desno)
Implementacija zgoraj opisane rešitve je potekala v Android Studio. Ker platforma Android
Wear temelji na platformi Android z nekoliko omejenimi funkcionalnostmi, je tudi
načrtovanje grafičnega vmesnika ter obnašanje in razvoj kode zelo podoben. Ob
upoštevanju osnovnih smernic razvoja grafičnega vmesnika za naprave iz tega razreda, je
tudi tukaj razvoj hiter in preprost. Pri razvoju za pametne ure je bilo potrebno posebno
pozornost posvetiti delovanju grafičnega vmesnika ne samo na pravokotnih, ampak tudi
okroglih oblikah zaslonov. V te namene imamo na voljo posebne poglede, kot so
WatchViewStub in BoxInsetLayout, ki nam delo olajšajo. Tako implementirana rešitev je
tudi v celoti izpolnila v začetku postavljene cilje.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
84
5 ZAKLJUČEK
5.1 Testiranje hipotez
Hipoteza 1: S pomočjo namenskih tehnologij in protokolov lahko v primerjavi s HTTP
zmanjšamo velikost podatkov, ki se prenašajo med senzorjem in odjemalcem.
Rezultat: Pri razvoju končne rešitve smo za realno-časovno komunikacijo med mobilno
aplikacijo in senzorjem uporabili protokol MQTT. V poglavju 3.4 smo preverili velikost
podatkov, ki se za pošiljanje sporočila prenesejo in te primerjali z velikostjo prenesenih
podatkov pri protokolu HTTP. Ugotovili smo, da lahko z uporabo MQTT prenesemo 56,69
% manj podatkov in s tem hipotezo potrdili.
Hipoteza 2: S pomočjo namenskih tehnologij in protokolov je prenos informacij od
senzorja do odjemalca v primerjavi s HTTP hitrejši.
Rezultat: Želeli smo realno-časovno komunikacijo med mobilno aplikacijo in senzorjem.
Da je pogoj izpolnjen, mora izbrani protokol podatek v čim krajšem času prenesti od
senzorja do aplikacije. Ugotovitve iz poglavja 3.4 nakazujejo, da smo lahko s protokolom
MQTT v primerjavi s HTTP, podatek prenesli 110.8-krat hitreje. Hipotezo smo s tem
potrdili.
5.2 Omejitve diplomskega dela
Omejitev 1: Pri predstavitvi protokolov in tehnologij za realno-časovno komunikacijo med
senzorji in mobilnimi aplikacijami smo se omejili na tiste, ki se v praksi najpogosteje
uporabljajo.
Omejitev 2: Pri komunikaciji smo se osredotočili na realno-časovnost. Zanesljivosti in
varnosti se nismo posebej posvečali.
Omejitev 3: Pri izdelavi senzorja temperature smo se posvetili komunikaciji, sama
izdelava senzorja je bila sekundarnega pomena.
Omejitev 4: Pri platformah za pametne ure smo predstavili Android Wear. Ostalih platform
nismo preverili. Tudi končna rešitev je izdelana izključno za to platformo.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
85
Omejitev 5: Delovanje mobilne aplikacije smo omejili na pametne telefone z operacijskim
sistemom Android 6.0.
5.3 Možne razširitve končne rešitve
Rešitev, izdelana v nalogi, se uspešno uporablja. Izkazalo se je, da je zanesljiva in
preprosta za uporabo. Da bi končni izdelek lahko ponudili tudi na trgu, se bi morali
dodatno posvetiti še varnosti, saj je ta pri napravah, povezanih v internet, velikega
pomena. Dodali bi lahko nove funkcionalnosti, kot je nadzor rolet, in postopoma razvili
sistem za nadzor celotne hiše. Senzor temperature bi lahko razširili s senzorji za kvaliteto
zraka, zaznavanje dima in ogljikovega monoksida. S tem bi lahko poleg udobja izboljšali
tudi kvaliteto in varnost življenja v prostorih. Zanimiva funkcionalnost bi bila tudi časovno
upravljanje temperatur v prostoru. Dodatno bi bilo smiselno preveriti možnosti uporabe
končnih rešitev MQTT- posrednikov, kot so HiveMQ, RabbitMQ in VernMQ in ponuditi
funkcionalnost centralnega strežnika kot storitev v oblaku. Rešitev bi s tem bila za
končnega uporabnika bolj privlačna in preprosta za uporabo.
MQTT ima v primerjavi s HTTP tudi slabosti. Ena takšnih so javna brezžična omrežja, ki
pogosto dostop do interneta omejujejo tako, da promet filtrirajo ali omogočajo samo
komunikacijo preko določenih vrat. Delovanje MQTT je lahko v takšnih primerih
onemogočeno. Za bolj zanesljivo delovanje mobilne aplikacije bi bilo smiselno raziskati
možnosti, kako takšno omejitev zaobiti.
5.4 Sklep
V diplomskem delu smo predstavili tehnologije in protokole, ki omogočajo realno-časovno
komunikacijo med mobilnimi aplikacijami in senzorji. Na praktičnem primeru nadzora
ogrevanja stanovanja smo pokazali uporabnost protokola MQTT, ki smo ga za naš primer
uporabe izbrali za najprimernejšega. Ugotovili smo, da lahko s pravo izbiro prihranimo
tako na količini prenesenih podatkov, kakor tudi povečamo hitrost prenosa. Pri tem smo
pridobili tudi dodatne funkcionalnosti, kot je zagotovljena dostava in zadržano sporočilo, ki
jih MQTT ponuja. Cilje, ki smo si jih zastavili v uvodu, smo tako uspešno izpolnili.
Prav tako smo spoznali, da je izbira protokola pogojena s problemom, ki ga rešujemo. Ker
je senzorje mogoče uporabiti v različnih scenarijih, obstajajo različni protokoli, ki vsak po
svoje rešujejo probleme, ki v posameznih okoljih nastanejo. Za razvijalca je pomembno,
da je z njimi seznanjen ter pozna prednosti in slabosti posameznega. Le tako bo lahko
rešitev pravilno načrtoval in uporabil primerne tehnologije.
Realno-časovna komunikacija mobilnih aplikacij s senzorji
86
6 VIRI
[1] MQTT.org. Frequently Asked Questions. Dostopno na: http://www.mqtt.org/faq [9. 3.
2016].
[2] Banks A., Gupta R. MQTT Version 3.1.1 Plus Errata 01, 2015. Dostopno na:
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html [9. 3. 2016].
[3] IBM. IBM Podcast with Piper, Diaz and Nipper. Dostopno na:
http://www.ibm.com/podcasts/software/websphere/connectivity/piper_diaz_nipper_mq_tt_
11182011.pdf [9. 3. 2016].
[4] Hohpe G., Woolf B. Enterprise Integration Patterns: Designing, building and deploying
messaging solutions.
[5] HiveMQ. MQTT Essentials Part 3: Client, Broker and Connection Establishment.
Dostopno na: http://www.hivemq.com/blog/mqtt-essentials-part-3-client-broker-
connection-establishment [8. 3. 2016]
[6] HiveMQ. MQTT Essentials Part 4: MQTT Publish, Subscribe & Unsubscribe.
Dostopno na: http://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-
unsubscribe [8. 3. 2016].
[7] HiveMQ. MQTT Essentials Part 5: MQTT Topics & Best Practices. Dostopno na:
http://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices [8. 3. 2016]
[8] Obermaier D. MQTT: SYS Topics. Dostopno na:
https://github.com/mqtt/mqtt.github.io/wiki/SYS-Topics [8. 3. 2016].
[9] HiveMQ. MQTT Essentials Part 6: Quality of Service 0, 1 & 2. Dostopno na:
http://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels [8. 3.
2016].
[10] HiveMQ. Introducing the MQTT Security Fundamentals. Dostopno na:
http://www.hivemq.com/blog/introducing-the-mqtt-security-fundamentals [8. 3. 2016].
[11] HiveMQ. MQTT Security Fundamentals: Authentication with Username and
Password. Dostopno na: http://www.hivemq.com/blog/mqtt-security-fundamentals-
authentication-username-password [8. 3. 2016].
[12] HiveMQ. MQTT Security Fundamentals: Authorization. Dostopno na:
http://www.hivemq.com/blog/mqtt-security-fundamentals-authorization [8. 3. 2016].
[13] HiveMQ. MQTT Security Fundamentals: MQTT Payload Encryption. Dostopno na:
http://www.hivemq.com/blog/mqtt-security-fundamentals-payload-encryption [8. 3. 2016].
[14] HiveMQ. MQTT Security Fundamentals: TLS / SSL. Dostopno na:
http://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl [8. 3. 2016].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
87
[15] HiveMQ. MQTT Security Fundamentals: X509 Client Certificate Authentication.
Dostopno na: http://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-
certificate-authentication [8. 3. 2016].
[16] HiveMQ. MQTT Security Fundamentals – MQTT Message Data Integrity. Dostopno
na: http://www.hivemq.com/blog/mqtt-security-fundamentals-mqtt-message-data-integrity
[8. 3. 2016].
[17] Rowe W. Non-real-time data interchange IoT protocols: Consider your options
Dostopno na: http://internetofthingsagenda.techtarget.com/feature/Non-real-time-data-
interchange-IoT-protocols-Consider-your-options [9. 3. 2016].
[18] Schneider S. Understanding The Protocols Behind The Internet Of Things. Dostopno
na: http://electronicdesign.com/iot/understanding-protocols-behind-internet-things [12. 3.
2016].
[19] Schuster D. IoT Messaging Protocols: Welcome. Dostopno na
https://iotprotocols.wordpress.com/2014/11/03/welcome/ [12. 3. 2016].
[20] Object Management Group, Inc. What is DDS?. Dostopno na:
http://portals.omg.org/dds/what-is-dds-3/ [12. 3. 2016].
[21] Eclipse Foundation. MQTT and CoAP, IoT Protocols. Dostopno na:
http://www.eclipse.org/community/eclipse_newsletter/2014/february/article2.php [12. 3.
2016].
[22] Janakiram M. 10 DIY Development Boards for IoT Prototyping, 2016. Dostopno na:
http://thenewstack.io/10-diy-development-boards-iot-prototyping/ [13. 3. 2016].
[23] Donald F. 10 best IOT Hardware platforms, 2015. Dostopno na:
http://www.gadgetronicx.com/10-best-iot-hardware-platforms/ [13. 3. 2016].
[24] Arduino. Arduino Build Process. Dostopno na:
https://www.arduino.cc/en/Hacking/BuildProcess [14. 3. 2016].
[25] Arduino. Learning: Language Reference. Dostopno na:
https://www.arduino.cc/en/Reference/HomePage [14. 3. 2016].
[26] Arduino. Getting Started: Arduino Software (IDE). Dostopno na:
https://www.arduino.cc/en/Guide/Environment [14. 3. 2016].
[27] Arduino. Class for DHTxx sensors. Dostopno na:
http://playground.arduino.cc/Main/DHTLib [14. 3. 2016].
[28] O'Leary N. Arduino Client for MQTT. Dostopno na: http://pubsubclient.knolleary.net/
[15. 3. 2016].
[29] Arduino. Getting Started: Install the Arduino Software (IDE) on on Linux. Dostopno
na: https://www.arduino.cc/en/Guide/Linux [16. 3. 2016].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
88
[30] Arduino. Getting Started: What is Arduino?. Dostopno na:
https://www.arduino.cc/en/Guide/Introduction [16. 3. 2016].
[31] Arduino. Arduino Products. Dostopno na: https://www.arduino.cc/en/Main/Products
[16. 3. 2016].
[32] Ruggeri L. Top 5 Wireless Ways to Communicate with your Controller, 2015.
Dostopno na: http://www.open-electronics.org/top-5-wireless-ways-to-communicate-with-
your-controller/ [28. 3. 2016].
[33] RS Components. 11 Internet of Things (IoT) Protocols You Need to Know About.
Dostopno na: http://www.rs-online.com/designspark/electronics/knowledge-item/eleven-
internet-of-things-iot-protocols-you-need-to-know-about [28. 3. 2016].
[34] RF Wireless World. IoT Wireless Technologies OR IoT Wireless Standards. Dostopno
na: http://www.rfwireless-world.com/Terminology/IoT-wireless-technologies.html [28. 3.
2016].
[35] Smith M. Understanding The Common WiFi Standards [Technology Explained], 2011.
Dostopno na: http://www.makeuseof.com/tag/understanding-common-wifi-standards-
technology-explained/ [18. 4. 2016].
[36] Voo B. 802.11ac Wi-Fi Explained: What Is It & Why It’s Cool. Dostopno na:
http://www.hongkiat.com/blog/wireless-ac-explained/ [18. 4. 2016].
[37] Winkle W. Gigabit Wireless? Five 802.11ac Routers, Benchmarked, 2013. Dostopno
na: http://www.tomshardware.com/reviews/wi-fi-802.11ac-router,3386.html [18. 4. 2016].
[38] Orsini L. How To Set Up Your Raspberry Pi For The First Time, 2014. Dostopno na:
http://readwrite.com/2014/01/20/raspberry-pi-everything-you-need-to-know/ [7. 5. 2016].
[39] Klosowski T. How the Raspberry Pi 3 Benchmarks Against Older Models, 2016.
Dostopno na: http://lifehacker.com/how-the-raspberry-pi-3-benchmarks-against-older-
models-1762417275 [7. 5. 2016].
[40] Eclipse Foundation. Mosquitto. Dostopno na:
http://projects.eclipse.org/projects/technology.mosquitto [16. 5. 2016].
[41] Smith C. By the Numbers: 85+ Amazing Android Statistics, 2016. Dostopno na:
http://expandedramblings.com/index.php/android-statistics/ [22. 5. 2016].
[42] Statista, Inc. Number of apps available in leading app stores, 2016. Dostopno na:
http://www.statista.com/statistics/276623/number-of-apps-available-in-leading-app-stores/
[8. 6. 2016].
[43] Eclipse Foundation. Eclipse Paho Android Service. Dostopno na:
http://www.eclipse.org/paho/clients/android/ [7. 7. 2016].
Realno-časovna komunikacija mobilnih aplikacij s senzorji
89
[44] International Organization for Standardization. ISO/IEC 20922:2016: Information
technology - Message Queuing Telemetry Transport (MQTT) v3.1.1. Dostopno na:
http://www.iso.org/iso/catalogue_detail.htm?csnumber=69466 [7. 7. 2016].
[45] White M. MQTT: An Open Source Push Messaging Alternative, 2014. Dostopno na:
https://developer.zebra.com/docs/DOC-2315 [7. 7. 2016].
[46] Meier R. An update on Eclipse Android Developer Tools, 2015. Dostopno na:
http://android-developers.blogspot.si/2015/06/an-update-on-eclipse-android-
developer.html [7. 7. 2016].
[47] Android Open Source Project. Android Studio: The Official IDE for Android. Dostopno
na: https://developer.android.com/studio [14. 7. 2016].
[48] Thornsby J. Code Introduction to Android Wear: The Basics, 2014. Dostopno na:
http://code.tutsplus.com/articles/introduction-to-android-wear-the-basics--cms-22042 [22.
7. 2016].
[49] Android Open Source Project. Design: Android Wear. Dostopno na:
https://developer.android.com/design/wear/index.html [22. 7. 2016].
[50] Motorola Mobility LLC. Moto 360. Dostopno na:
http://www.motorola.com/us/products/moto-360 [2. 8. 2016].
[51] Leggetter P. Realtime Web Apps: Approaching $150 million invested in realtime web
companies, 2013. Dostopno na: http://realtimewebapps.com/approaching-100-million-
invested-in-realtime-web-companies/ [9. 8. 2016].
[52] Arduino. Products: Arduino Yun. Dostopno na:
https://www.arduino.cc/en/Main/ArduinoBoardYun [14. 8. 2016].
[53] DomoticX. Temperatuur en luchtvochtigheid sensor DHT11. Dostopno na:
http://domoticx.nl/webwinkel/index.php?route=product/product&product_id=230 [17. 8.
2016].
[54] Gartner, Inc. Forecast: The Internet of Things, Worldwide, 2013. Dostopno na:
http://www.gartner.com/newsroom/id/2636073) [17. 8. 2016].
[55] Ironpaper. Marketing Opportunities for the Internet of Things, 2014. Dostopno na:
http://www.ironpaper.com/webintel/articles/marketing-opportunities-for-the-internet-of-
things/ [17. 8. 2016].
[56] Leggetter P. History, Background, Benefits & Use Cases of Realtime, 2013. Dostopno
na: https://www.leggetter.co.uk/2013/10/28/history-background-benefits-use-cases-
realtime.html [17. 8. 2016].