Is het mogelijk om Node.js te gebruiken voor IoT? PROMOTOR: DH DIETER DE PREESTER PROJECT PERFORMED BY
STIJN VAN HULLE TO ACHIEVE THE DEGREE BACHELOR IN THE
NEW MEDIA AND COMMUNICATION TECHNOLOGY HOWEST | 2015-2016
Bachelorproef Stijn Van Hulle
WOORD VOORAF Mijn naam is Stijn Van Hulle en ik ben student aan Howest Kotrijk waar ik New Media & Communication Technology studeer. Voor ik begon met deze opleiding had ik al een grote interesse in IT. Na 3 jaar studeren heb ik ondertussen ontdekt waar ik mij wil in specialiseren: webdevelopment, zowel backend als frontend. Naast deze passie heb ik in het tweede jaar het vak datacommunicatie gekregen waar we les kregen over hardware en waar ik als project gekozen heb om met een Adam Module te leren werken. Toen ik de prijs te horen kreeg (150 tot 300 euro) was ik wel even geschrokken en met dat het programmeren ervan op een zeer laag niveau lag was de conclusie ook wel snel gemaakt om daar later niet mee verder te werken. In het vak Backend App Development kreeg ik de mogelijkheid om een project te kiezen die met Internet of Things te maken heeft. Mijn keuze was dan ook zeer snel gemaakt om daarvoor te kiezen en daarmee begon ook de zoektocht naar wat het goedkoopst en het gemakkelijkst was om een dergelijk systeem op te zetten. En daarom luid mijn vraag ook: “Is het mogelijk om Node.js te gebruiken voor Internet of Things”. In deze document zult je aan de hand van een prototype dit te weten komen. Graag wil ik nog Dieter De Preester bedanken bij de raadgeving en feedback doorheen het maken van deze bachelorproef.
3
Bachelorproef Stijn Van Hulle
ABSTRACT Internet of Things is een markt dat aantal jaar geleden ontstaan is door de evolutie van het web. Het begon allemaal toen dat apparaten zoals een printer, een router toegang kregen tot het internet. Dit maakte het mogelijk om van overal ter wereld waar je internettoegang hebt af te printen of aanpassingen op je pc te doen zonder dat je fysiek aanwezig hoeft te zijn. Deze trend werd groter toen dat Philips Hue uit kwam met lampen die je via je smartphone overal ter wereld kan bedienen. Camera’s op afstand, slimme koelkasten, slimme deurvergrendeling. Dit zijn allemaal voorbeelden van hoe dat Internet of Things zeer belangrijk zal worden voor klanten alsook voor ontwikkelaars. Er is dan ook een moment gekomen dat er meer ‘dingen’ dan mensen op het internet zich bevinden. Dit jaar zijn er ook een aantal voorbeelden geweest waar hackers een auto konden bedienen van op afstand, alles wordt wel slimmer door deze nieuwe trend maar is dat wel goed en hoe wapenen wij ons daartegen qua security? Alsook hoe creëer ik een systeem waar ik demotica kan bedienen zonder dat ik honderden euro’s moet uitgeven aan een professioneel systeem?
4
Bachelorproef Stijn Van Hulle
VERKLARENDE WOORDENLIJST Angular: Angular is een webapplicatie framework van Google die het MVVM hanteert. Adam Module: Een systeem dat via een ethernetkabel wordt aangestuurd en waar je lichten en andere demotica mee kan aansturen, vooral gebruikt bij grote bedrijven. Zeer prijzig. AMD: AMD staat voor Asynchroon Module Definition en is een Javascript specificatie die het mogelijk maakt om met behulp van require en define Javascript bestanden te laden. Common.js: Een project dat oorspronkelijk door een Mozilla medewerker gemaakt was. Common.js wordt momenteel als een module patroon in Node.js, Browserify en Webpack gebruikt. Gulp:·Met Gulp is het mogelijk bij wijzigingen van code een actie te starten. Een actie kan zijn dat je aan Gulp zegt van neem alles Javascript bestanden en steek ze in één groot bestand. Jade: Jade is een templating engine die zorgt voor het renderen naar HTML code. MongoDB: MongoDB is een document-georiënteerde database waarbij geen relaties zoals bij MYSQL gelegd kunnen worden. Het is gebaseerd op BSON (binaire JSON). MVVM: Model View Viewmodel is een patroon die het mogelijk maakt om de view en de logica van elkaar te scheiden. Daarvoor zal het viewmodel de data doorspelen naar de view. Oauth2: Oauth is een open standaard die het mogelijk maakt om een login zeer beveiligd te maken. Momenteel wordt Oauth dan ook gebruikt bij Facebook, Google, … Oauth 2 is de opvolger en heeft dan ook nog meer beveiliging dan zijn voorganger. Python: Python is een programmeertaal die ondertussen al 25 jaar oud is maar door de opkomst van IoT een boost heeft gekregen. De syntax van Python is een beetje verschillend met andere talen: er wordt gewerkt met tabs in plaats van haakjes. Relay: Met een relay is het mogelijk om gelijk welk apparaat aan en uit te zetten. Een relay sluit het circuit af bij een 0 en opent het bij een 1. Kan soms omgekeerd zijn maar dat hangt af van welk systeem dat je gebruikt.
5
Bachelorproef Stijn Van Hulle
FIGURENLIJST Figuur 1 Het web ( bron: HTTP://info.cern.ch/hypertext/WWW/TheProject.html) 15 Figuur 2 Web 1.0 tot 3.0 (bron Google) _________________________________________ 15 Figure 4 Laatste image (bron: HTTP://www.cl.cam.ac.uk/cgi-bin/xvcoffee) ________ 16 Figure 4 Eerste webcam (bron: Wikipedia)_______________________________________ 16 Figuur 5 Groei IoT (bron: Google) _______________________________________________ 17 Figuur 6 REST (bron: Google) ___________________________________________________ 18 Figure 8 Webhooks (bron: HTTP://www.payworksmobile.com/) _________________ 19 Figuur 9 Voorbeeld Webhooks (bron: HTTP://www.trello.com)___________________ 20 Figuur 10 Sockets (url: HTTPs://sdzupload.s3.amazonaws.com/prod/upload/p3ch1_Communication%20is%20usuall y%20unsynchronized%2C%20i.e.%20the%20client%20requests%2C%20the%20 server%20responds%20-%20New%20Page1.png) __________________________ 21 Figuur 11 MEAN (bron: Google) ________________________________________________ 24 Figuur 13 Schema backend _____________________________________________________ 27 Figuur 14 Schema sensoren ____________________________________________________ 28 Figure 15 Google cloud (bron: Google) __________________________________________ 31 Figure 16 Amazon Cloud (bron: HTTP://www.amazone.com) _____________________ 31 Figuur 17 Azure (bron: Google) _________________________________________________ 32 Figuur 18 Node Ubuntu (bron: HTTPs://portal.azure.com) _______________________ 33 Figure 19 Node empty (bron: HTTPs://portal.azure.com) _________________________ 34 Figuur 20 Node starter (bron: HTTPs://portal.azure.com) ________________________ 34 Figuur 21 Adafruit (bron: Google) _______________________________________________ 37 Figuur 22 Connector (bron: Google) ____________________________________________ 38 Figuur 23 Arduino taal (bron: HTTPs://upload.wikimedia.org/wikipedia/en/d/d9/Arduino_1.0_IDE,_Ubuntu_1 1.10.png) _________________________________________________________________ 38 Figure 24 Arduino Wifi shield (bron: HTTPs://www.arduino.cc) ___________________ 39
6
Bachelorproef Stijn Van Hulle
Figure 25 Arduino Wifi Shield (bron: HTTP://www.rudiniemeijer.nl/wpcontent/uploads/Arduino-met-WiFi-Shield.jpeg) ____________________________ 39 Figuur 26 Arduino Ethernet Schield (bron: HTTPs://www.arduino.cc) _____________ 40 Figuur 27 Arduino Yun (bron: HTTPs://www.arduino.cc) _________________________ 40 Figure 28 Raspberry Pi 2 (bron: HTTPs://www.raspberrypi.org/) _________________ 42 Figure 29 Raspberry Pi starter kit (bron: HTTP://static.webshopapp.com/shops/069283/files/040344200/raspberry-pistarter-kit.jpg) _____________________________________________________________ 43 Figuur 30 GPIO (bron: HTTP://g01.a.alicdn.com/kf/HTB1yYWiJXXXXXcCaXXXq6xXFXXXQ/Gratisverzending-framboos-pi-2-t-uitbreidingskaart-diy-kit-40p-regenboog-cablegpio-uitbreidingskaart.jpg) _________________________________________________ 43 Figure 31 Pins (bron: HTTP://i1.wp.com/cdn.makezine.com/uploads/2014/02/gpiodescriptions.png?zoom=2&resize=620%2C378) _____________________________ 44 Figuur 32 GrovePi (bron: HTTP://www.smartliving.io/kits) _______________________ 45 Figuur 33 Scanning Pi __________________________________________________________ 48 Figuur 34 Connecteer Raspberry Pi _____________________________________________ 49 Figure 35 i2detect (bron: HTTP://www.dexterindustries.com/grovepi/) ___________ 50 Figuur 36 Screenshot streamer _________________________________________________ 54 Figuur 37 Voorbeeld webcam __________________________________________________ 55 Figuur 38 Base64 webcam _____________________________________________________ 56 Figuur 39 Passport (bron: HTTP://passportjs.org/images/twitter-card.png) ________ 70 Figuur 38 Login scherm ________________________________________________________ 75 Figuur 39 Camerascherm ______________________________________________________ 75 Figuur 40 Startscherm _________________________________________________________ 76 Figuur 41 Homekit (bron: HTTP://www.apple.com) ______________________________ 78 Figuur 42 Weave (bron: HTTPs://www.getstructure.io/blog/everything-i-learnedabout-googles-brillo-and-weave-at-ubiquity-dev-summit) ___________________ 79 Figuur 43 Azure IoT Hub (bron: HTTPs://azure.microsoft.com/enus/documentation/articles/iot-hub-what-is-iot-hub/) _______________________ 80
7
Bachelorproef Stijn Van Hulle
8
Bachelorproef Stijn Van Hulle
INHOUDSOPGAVE Woord Vooraf ______________________________________________________________ 3 Abstract ___________________________________________________________________ 4 Verklarende Woordenlijst _____________________________________________________ 5 Figurenlijst _________________________________________________________________ 6 Inhoudsopgave _____________________________________________________________ 9 Inleiding __________________________________________________________________ 12 1 Achtergrond _____________________________________________________________ 14 Het Web ______________________________________________________________ 14
Web 1.0 __________________________________________________________ 14
Web 2.0 __________________________________________________________ 15
Web 3.0 __________________________________________________________ 15
Internet Of Things _______________________________________________________ 16 Standaarden ___________________________________________________________ 18
Rest _____________________________________________________________ 18
Webhooks ________________________________________________________ 19
Ieee P2413 _______________________________________________________ 20
Protocollen ____________________________________________________________ 21
Websockets _______________________________________________________ 21
Xmpp ____________________________________________________________ 21
Coap ____________________________________________________________ 22
Dds _____________________________________________________________ 22
Mqtt ____________________________________________________________ 22
Node.Js Als Een Platform __________________________________________________ 23 1.5
Mean ______________________________________________________________ 24
2 Het Scenario _____________________________________________________________ 26 Praktisch ______________________________________________________________ 26 Technisch______________________________________________________________ 27 Visualiseren ____________________________________________________________ 28 3 Cloud __________________________________________________________________ 30 Keuze Os ______________________________________________________________ 30 Cloud Keuze ____________________________________________________________ 31
9
Bachelorproef Stijn Van Hulle
Installatie Cloud _________________________________________________________ 33 Soorten _______________________________________________________________ 33 Installatie Node.Js + Mongodb _____________________________________________ 35 4 Hardware _______________________________________________________________ 37 Aruindo _______________________________________________________________ 37 Raspberry Pi ___________________________________________________________ 41
Operating System __________________________________________________ 41
Hardware _________________________________________________________ 42
Connectie ________________________________________________________ 42
Grovepi _______________________________________________________________ 45
Sensoren _________________________________________________________ 46
5 Installatie _______________________________________________________________ 48 Installatie Grovepi _______________________________________________________ 48 Configuratie Raspberry Pi _________________________________________________ 48 Configuratie Grovepi _____________________________________________________ 50 Lees/Schrijf Naar Sensoren ________________________________________________ 51
C# ______________________________________________________________ 51
Node.Js __________________________________________________________ 53
Python ___________________________________________________________ 53
Camera _______________________________________________________________ 54 Mqtt _________________________________________________________________ 57 6 Applicatie _______________________________________________________________ 60 Frontend ______________________________________________________________ 60
Angular __________________________________________________________ 60
Module Laders ____________________________________________________ 63
Require.Js ________________________________________________________ 64
Webpack _________________________________________________________ 66
Browserify ________________________________________________________ 68 Sockets __________________________________________________________ 69
Backend _______________________________________________________________ 70
Passport __________________________________________________________ 70
Sockets __________________________________________________________ 71
Mqtt Client _______________________________________________________ 72
Mongoose ________________________________________________________ 73
10
Bachelorproef Stijn Van Hulle
Voorbeeld _____________________________________________________________ 75 7 Alternatieven ____________________________________________________________ 78 Homekit _______________________________________________________________ 78 Project Brillo ___________________________________________________________ 79 Azure Iot Hub __________________________________________________________ 80 8 Besluit __________________________________________________________________ 82 Algemeen Besluit ________________________________________________________ 82 Persoonlijk Besluit _______________________________________________________ 83 Referentielijst _____________________________________________________________ 84 Bijlages __________________________________________________________________ 87
11
INLEIDING Internet of Things ofwel IoT is de trend waarbij je apparaten slim maakt en connecteert met het web, op dit moment zijn er zelfs meer ‘dingen’ op het internet dan personen die geconnecteerd zijn via een laptop/smartphone. Om dit meer met cijfers te vergelijken: 3.2 miljard mensen en 4.9 miljard sensors zitten momenteel op het internet. In de komende 5 jaar wordt er verwacht dat dit aantal nog meer zal stijgen tot wel 50 miljard sensoren of ‘dingen’ op het internet. In dit document zult je alles te weten komen over connecteren van ‘dingen’ op het internet en daarbij zult je eerst een beetje uitleg krijgen over hoe het web ontstaan is en hoe het web geëvolueerd is naar wat het op dit moment is. Voor dat je dan kan starten met het kijken naar welke hardware je wilt kopen zult je eerst een beetje meer informatie moeten krijgen van welke protocollen er bestaan om data te verzenden als daarbij ook wat de veiligheid is van bepaalde protocollen. Het kiezen van de juiste hardware is ook iets zeer belangrijk, sommige hebben meer geld over om een IoT omgeving op te zetten dan andere. Hierbij is het dan ook belangrijk dat je meer informatie krijgt over welke hardware wat aan kan en welke alternatieven er zijn die werken. Het gebruik van Node.js in een IoT omgeving zal op verschillende manieren worden aangetoond en wat het best van allemaal is zal mee verder worden gewerkt en uitgewerkt worden tot een applicatie.
12
1. ACHTERGROND
1 ACHTERGROND Om te kunnen beginnen met het kiezen van de juiste hardware en programmeertaal zult je eerst een beetje meer informatie krijgen moeten krijgen over het ontstaan van het web. Het ontstaan van Internet of Things dat geconnecteerd is met het web alsook de verschillende protocollen en standaarden die het web hanteert.
HET WEB Het internet heeft de laatste jaren een enorme grote boost gekregen. Het web zoals het is uitgevonden heeft zoveel verandering gemaakt en het blijft maar evolueren. Wat de toekomst van het web brengt zal je in dit hoofdstuk te weten komen alsook de geschiedenis van het web. Sinds 2008 zorgt China voor het grootste percentage van onlinegebruikers. In China heeft zelfs 46,9 procent van de bevolking toegang tot het internet en het gemiddelde dat een persoon per week online is 18 uren. In België, waar veel al jaren online zijn is dat maar 13 uren. Dat heeft al een idee dat het IoT daarbij zeer belangrijk zal worden als er nog meer mensen internet mogelijkheden krijgen. WEB 1.0 In 1993 kwam het web toegankelijk voor het grote publiek en in die tijd ontstond een website vooral uit tekst en hyperlinks. Hyperlinks connecteerden de verschillende pagina met elkaar en dit was dan ook de enige interactiviteit dat er bestond. Alsook was het niet mogelijk om content te uploaden of aanpassingen te doen, het waren statische pagina’s.
Bachelorproef Stijn Van Hulle
Figuur 1 Het web ( bron: HTTP://info.cern.ch/hypertext/WWW/TheProject.html)
WEB 2.0 Rond 2000 ontstond een revolutie van het web en deze revolutie werd al rap omgedoopt tot web 2.0. Wat het grote verschil was met zijn voorstaande versie was vooral de gebruiker kon aanpassingen maken op de websites. De websites werden dynamisch en door gebruik te maken van PHP in de backend van de site was het mogelijk om meer te doen dan tekst te tonen. Dat was dan ook te tijd waarbij Flash veel gebruikt werd. In de frontend ontstond Javascript om de interactie in de browser te verwezenlijken. Daarnaast werd CSS gebruikt voor de opmaak van HTML-pagina. Daarnaast had je nog XML, JSON, AJAX, ... Dat zijn allemaal nieuwe protocollen die tijdens deze tijden ontstonden en gebruikt worden. Een groot voorbeeld van Web 2.0 zijn blogs, Facebook, Youtube, Wiki’s, RSS-feeds en de lijst gaat zo nog verder. WEB 3.0 Web 3.0 daarentegen gaat vooral over het verstaan van data. Semantic Web is dan ook een naam die enorm veel samen met Web 3.0 wordt gebruikt, als een component van Web 3.0. Semantic Web gaat meer over de techniek en over een standaardframework. Een groot voorbeeld daarvan is Google, wanneer je een hond zoekt zal je informatie krijgen met de daarbij horende afbeeldingen en indien nodig asielen in de buurt. Al deze gegevens staan op het web maar moeten wel begrepen worden en daarvoor bestaat Semantic Web. Een definitie daarvan luidt: “Het semantisch web zou je grofweg kunnen definiëren als een web van verbanden tussen informatie op het internet, waardoor nieuwe inzichten kunnen ontstaan”.
Figuur 2 Web 1.0 tot 3.0 (bron Google)
15
Bachelorproef Stijn Van Hulle
INTERNET OF THINGS Het basisidee achter Internet of Things is dat toestellen en hardware met elkaar verbonden zijn via het internet. Een paar voorbeelden van hardware die met elkaar verbonden worden via het internet zijn sensoren, mobiele telefoons, laptops, koelkasten, lichten, … Deze lijst wordt constant aangevuld om dat er meer en meer nieuwe apparaten online komen. Met al deze nieuwe apparaten online gaan er nieuwe interacties kunnen ontstaan alsook zal er een volledige nieuwe kijk nodig zijn op het besturen van al die apparaten.
Figure 4 Eerste webcam (bron: Wikipedia)
In 1991 hebben studenten aan de universiteit van Cambridge de eerste webcam gebouwd. Doordat het toekomen bij een lege koffiemachine soms zo frustrerend was voor de studenten hebben we puur toevallig de eerste webcam gecreëerd. Deze eerste webcam had een resolutie van 129×129 pixel zwart wit en een FPS van 1. Volgens de standaarden nu zou dat heel weinig zijn.
Figure 3 Laatste image (bron: HTTP://www.cl.cam.ac.u k/cgi-bin/xvcoffee)
Tot in augustus 2001 kon je nog meekijken naar de eerste webcam maar ondertussen is deze stream offline gehaald maar hierboven kan je de laatste afbeelding daarvan zien. Dit is waarschijnlijk een van de eerste apparaten die geconnecteerd was met het internet. Alles connecteren met elkaar zal groeien tot het maken van een Smart Home waar dat alles van elektronica geconnecteerd is via het internet. Bij het connecteren daarvan zal je een apparaat slim kunnen maken en zal het met andere apparaten kunnen luisteren om bepaalde actie te ondernemen. Een voorbeeld daarvan is: je komt thuis en je lichten gaan aan en je favoriete nummer begint te spelen in de achtergrond. Als de trend hem blijft voorzetten zal er naar slimme huizen ook een slimme stad komen. Denk maar aan wat er onlangs is gebeurd in Gent, ze hebben in een volledige ring/weg de lichten slim gemaakt en ze geconnecteerd met elkaar. Dit maakt het mogelijk dat bij geen verkeer de lichten automatisch op rood worden gezet alsook de mogelijkheid dat het ene licht achter het andere automatisch groen wordt. Ze zullen als het ware luisteren naar elkaar.
16
Bachelorproef Stijn Van Hulle
Figuur 5 Groei IoT (bron: Google)
17
Bachelorproef Stijn Van Hulle
STANDAARDEN Om een kijk te nemen op Internet of Things en de werking daarvan zal er eerst een beetje uitleg gegeven moeten worden over welke standaarden er gebruikt worden om dit al te verwezenlijken. Momenteel is er nog geen standaard protocol die gebruikt wordt bij het uitwisselen van data zoals het wel bestaat bij Wifi. REST
Figuur 6 REST (bron: Google)
REST staat voor Representational State Transfer en werd in 2000 voor het eerst geïntroduceerd door Roy Fielding. REST wordt vooral gebruikt om hoge performance en schaalbaarheid te maken. REST is daarnaast een staatloze architectuur en gebruikt het CRUD (create, read, update, delete) design patroon.
Operation Create
SQL
HTTP
INSERT PUT / POST
Read (Retrieve) SELECT GET
DDS write read / take
Update (Modify) UPDATE POST / PUT / PATCH write Delete (Destroy) DELETE DELETE
dispose
Rest is een architectuur die vooral bij een API-call gebruikt worden om de data en de view van elkaar te scheiden alsook kan je aan een REST-call autorisatie toevoegen zoals OAUTH die het mogelijk maken om een zeer beveiligde manier te maken van data ophalen en wegschrijven. Bij een REST-call kan de server een XML alsook een JSON formaat teruggeven van de data, deze 2 zijn de meest voorkomende formaten om data terug te geven alsook om data door te sturen naar de server.
18
Bachelorproef Stijn Van Hulle
WEBHOOKS
Figure 7 Webhooks (bron: HTTP://www.payworksmobile.com/)
Webhooks zijn gebaseerd op HTTP-calls maar heeft als groot verschil dat Webhooks een HTTP-POST of anders gezegd een callback sturen als er iets veranderd. Je kunt dit best vergelijken met wanneer er data veranderd op de server dat dan de server een notificatie stuurt. Webhooks verzorgen die notificatie aan de hand van een POST-call naar je eigen server.
19
Bachelorproef Stijn Van Hulle
Een voorbeeld van deze implementatie is wat er gebruikt wordt bij de API van Trello: je stuurt op je server een HTTP POST naar de servers van Trello met een callbackurl, deze URL is een api op je server die een HTTP post is. Wanneer er dan bv op Trello een kaart naar afgewerkt wordt gesleept zal de Trello server via Webhooks een HTTP-POST sturen naar je API waar je dan de data kan opvangen en op anticiperen indien nodig.
Figuur 8 Voorbeeld Webhooks (bron: HTTP://www.trello.com)
IEEE P2413 Standaardiserings organisatie IEEE is momenteel bezig om voor Internet of Things een standaard te maken en dit noemt als projectnaam IEEE P2413. Dit is een samenwerking van een 24-tal bedrijven zoals Oracle, Cisco Systems, Huawei Technologies, General Electric en Qualcomm. Dit zou een standaard moeten worden om data te delen tussen apparaten wat nu nog niet echt het geval is. Op volgende site kan je meer informatie over dit project krijgen: https://standards.ieee.org/develop/project/2413.html
20
Bachelorproef Stijn Van Hulle
PROTOCOLLEN WEBSOCKETS Websockets is een protocol die full-duplex verkeer toelaat over een TCP/IP kanaal. Er wordt ook http gebruikt maar dat wordt alleen maar voor de eerste handshake gebruikt, als dit gebeurd is zal de rest van de communicatie over TCP/IP verlopen. Websockets creëren een bidirectioneel communicatiekanaal tussen server en cliënt. De data wordt verstuurd in frames die zowel tekst als binaire data kan zijn. Er zijn wel speciale frames nodig die de connectie openhouden of indien nodig de connectie kunnen sluiten. Websockets gebruiken dezelfde poort als dat voor een site, 80 en 443 maar het websocket protocol definieert wel om volgende syntax te gebruiken: ws:// en wss://.
Figuur 9 Sockets (bron: HTTPs://sdzupload.s3.amazonaws.com/prod/upload/p3ch1_Communication%20is%20usually%20unsynchronized%2C%20i.e.%20t he%20client%20requests%2C%20the%20server%20responds%20-%20New%20Page1.png)
XMPP XMPP staat voor Extensible Messaging And Presence Protocol en is open protocol die het mogelijk maakt om realtime data door te sturen over TCP/IP. Origineel werd dit Jabber genoemd en werd dan ook door de Jabber open source community in 1999 ontwikkeld. Deze berichten worden verstuurd via XML en momenteel is dit een protocol die niet meer zoveel gebruikt wordt. Dit werd vooral gebruikt voor VOIP, file transfers, gaming en IOT. Instant messages zoals MSN en Google talk gebruikten dit open protocol om data door te sturen, dit maakte het mogelijk met gelijk welke applicatie die XMPP ondersteunde communicatie te doen. Tot 2013 werd XMPP gebruikt voor Google Talk, het probleem was vooral de veiligheid en quality of service. Individuele organisaties konden een eigen IM service opzetten maar konden toch communiceren naar andere IM services. Met dit protocol was het moeilijk voor Google om de overstap te maken naar video chatting en meerdere personen in een IM service. En zo werd Google Hangouts geïntroduceerd die geen gebruik meer maakt van XMPP.
21
Bachelorproef Stijn Van Hulle
COAP Coap staat voor Constrained Application Protocol en is een protocol die in de applicatie laag van het OSI model zit. Het wordt vooral gebruikt voor kleine sensoren, switches. Het is gebaseerd op het HTTP protocol en is gemaakt om de load op resources goed te beheren en het zeer simpel te houden. Daarnaast heeft Coap multicast support alsook resource discovery en asynchroon berichten uitwisselen. Coap wordt veel gezien om het standaard protocol te worden om communicatie tussen slimme apparaten en IoT te verwezenlijken. Het brengt als het ware REST naar IoT apparaten. DDS DDS staat voor Data Distribution Service en is een realtime protocol die vooral bij Machine to Machine middleware gebruikt wordt. Deze standaard is gebaseerd op het principe van publish en subscribe. MQTT MQTT werkt op het principe van het publish-subscribe messaging pattern en gebruikt het TCP/IP protocol om de connecties op te zetten. Op de server hoeft een message broker te draaien waartoe alle apparaten hun data kunnen sturen. Voor dat je kunt sturen van data zal je eerst moeten abonneren op een bepaalde topic en doorheen de communicatie zal je dan die bepaalde topic gebruiken voor het versturen van data. Momenteel wordt dit enorm veel gebruikt bij IoT apparaten maar ondertussen gebruikt Facebook MQTT bij hun messaging systeem. Hieronder vindt je een lijst van methodes die je kunt gebruiken bij MQTT. Connect: Connecteer tot de MQTT-broker Disconnect: Wacht tot alle connecties zijn afgesloten en sluit dan de TCP/IP connectie. Subscribe: Volg een bepaalde topic UnSubscribe: Stop met volgen van een bepaalde topic Publish: Verstuur data over een bepaalde topic.
22
Bachelorproef Stijn Van Hulle
NODE.JS ALS EEN PLATFORM Node.js is een systeem zoals je PHP, ASP.NET MVC en Ruby On rails hebt. Het is een systeem dat gebruikt wordt om de backend van een website te onderhouden alsook waar je de applicatie of site host. Dit werd gemaakt door Ryan Dahl in 2009 die dit vooral als pushtechnologie wilde gebruiken maar ondertussen is Node.js wel uitgegroeid als een groot backend systeem. Bij Node.js is er ook nog een packages systeem NPM die alle verschillende modules voor je applicaties voorziet. Vandaag de dag draait Node.js op elk systeem: Windows, Linux, Os x. In dit document zult je ook te weten komen op welk systeem je Node.js het best draait om niet te veel verlies van snelheid te hebben. Een van de grootste voordelen om Node.js te gebruiken is dat Node.js non-blocking is en dat wil zeggen wanneer je een bepaald programma start zal hij niet alles synchroon doen (van boven naar beneden uitvoeren en stoppen bij elke regel code) maar asynchroon. Als er een bepaald deel is, bijvoorbeeld het lezen van een bestand, die langer duurt, zal hij dat op de eventloop stoppen en zal de rest van het programma zonder probleem verder werken. Daarnaast is Node.js volledig singlethreaded wat ook zeer belangrijk is in de Node.js wereld. Node.js applicaties worden geschreven in Javascript en de Javascript-Engine, meestal is dit de V8 engine van Chrome maar Microsoft heeft een alternatieve voor Node.js gemaakt die draait op de Chakracore Javascript engine(momenteel nog in bèta), HTTPs://github.com/nodejs/node-chakracore. Een aantal voorbeelden van services die Node.js gebruiken als hun backend systeem zijn: Netflix, Godaday.com, Walmart, Yahoo, IBM, ... Ondertussen wordt Node.js niet alleen als backend van een website gebruikt maar ook gebruikt om een applicatie te schrijven die niet in de browser werkt. Het grootste voorbeeld hiervan was Popcorn Time. Node.js zal dan ook een framework worden die overal bijna gebruikt zal kunnen worden en dat is allemaal mogelijk met 1 taal: Javascript.
23
Bachelorproef Stijn Van Hulle
1.5
MEAN
MEAN is de afkorting voor MongoDB, Express, Angular.js en Node.js en is dan ook een samenhang van 4 systemen die zeer dicht bij elkaar werken. Wanneer je Node.js wilt gebruiken zal je meestal ook gebruik willen maken van MongoDB. MongoDB is een document-georiënteerde database systeem waarbij je geen schema moet aanmaken en waarbij alle data opgeslagen wordt in een BSON formaat, Binairy JSON. Daarnaast heb je Express die vooral de routing en het framework biedt om communicatie over HTTP eenvoudig te laten verlopen alsook is het mogelijk om volledig met Express en natuurlijk Jade een applicatie te schrijven. Je hoeft dus met Express een frontend bibliotheek te gebruiken Wil je toch een frontend bibliotheek gebruiken kan je gebruikt maken van Angular.js die zich vooral zal bezighouden met de data van de MongoDB te visualiseren en indien nodig op te slaan.
Figuur 10 MEAN (bron: Google)
24
2. HET SCENARIO
2 HET SCENARIO Om een IoT omgeving te kunnen verstaan is dit best uit te leggen aan de hand van een voorbeeld of anders gezegd een scenario opstellen met alle stappen die daarbij horen. Na het scenario te schetsen komt de uitleg over het prototype zelf.
PRAKTISCH
Figuur 1iot apparaat
Het idee van het scenario in een praktisch geheel is een applicatie bouwen waarbij je je lichten kan aanzetten. Dit kan gebeuren via het internet, ongeacht waar je je bevindt. Na het aansteken van lichten is het ook de bedoeling dat je een relay kan aan of uitzetten met een daarbij zelfgekozen toestel. Daarnaast is er een schakelaar aanwezig waarbij je ook de lichten zonder tussenkomst van de cloud kan aanzetten. Wanneer je dan een licht aansteekt zal je ook rechtstreeks op de applicatie kunnen zien dat dat licht aangegaan is.
Temperatuur en luchtvochtigheid zijn ook iets dat via de cloud bekeken kan worden om dan later een grafiek daarvan maken om de temperatuur van de afgelopen dagen te bekijken. Naast het verzenden van de data naar de cloud is het ook mogelijk om dit te tonen op het RGB scherm. Daarnaast is er in deze praktische voorstelling een camera geplaatst waarbij je van op afstand ervoor kan zorgen dat hij foto’s neemt en doordat er een bewegingssensor aangesloten is kan er bij beweging een foto genomen worden. Als laatste is er een ultrasonische sensor aangesloten die kan meten hoever een bepaald voorwerp staat en deze data wordt in cm doorgestuurd naar de cloud waar je dan via de applicatie dat kan bekijken.
Bachelorproef Stijn Van Hulle
TECHNISCH
Figuur 11 Schema backend
We starten met een Raspberry Pi waar een Arduino(GrovePi) geconnecteerd is via de GPIO pinnen. Op de Raspberry Pi draait een Python script die de sensoren controleert en dit via een MQTT naar de Azure Cloud stuurt. Daarop draait een Ubuntu server die al deze data leest en realtime doorstuurt naar de sockets. Naast het doorsturen naar de sockets wordt dit ook via de Node.js server naar de MongoDB gestuurd die de data update. Op de Ubuntu server draait er een MQTT-broker die de data van de Raspberry Pi ophaalt, bij het ophalen wordt er tussen MQTT en de sockets een verbinden gezet zodat de sockets bijgewerkt worden. Dit maakt het mogelijk dat je realtime in de applicatie de data zal kunnen zien. In bijlage 1 kan je de mappenstructuur bekijken van hoe de applicatie is opgebouwd.
27
Bachelorproef Stijn Van Hulle
VISUALISEREN Wanneer er een scenario opgesteld is kan er gekeken worden naar het prototype. Daarvoor is het belangrijk om uit te zoeken welke hardware je wilt gebruiken als ook de verschillende sensoren. In dit hoofdstuk zal dit allemaal uitgelegd worden. In dit prototype kan je de temperatuur en vochtigheid aflezen, 3 verschillende lampen aansteken, beweging detecteren, afstanden aflezen, een relay aansturen en berichten op het lcd-scherm tonen.
Figuur 12 Schema sensoren
In het voorbeeld dat uitgewerkt zal worden zitten alle sensoren op de GrovePi en wordt de camera rechtstreeks op de Raspberry Pi aangesloten. De keuze van GrovePi zal je verder in het document vinden en alternatieven voor dit systeem zullen ook aangehaald worden.
28
3. CLOUD
3 CLOUD In dit hoofdstuk zal u meer info krijgen over de keuze van OS alsook de keuze van cloud systeem. Daarna zal je mee info krijgen over het installeren van het Node.js en het databasesysteem MongoDB.
KEUZE OS Als Linux distributie systeem kan je best kiezen voor Ubuntu maar je kan ook andere Linux distributie systemen gebruiken zolang we maar de mogelijkheid hebben om Node.js te installeren. Als je een voorstander bent van Windows te gebruiken is dit ook perfect mogelijk maar dan kies je best voor een Windows Server. Bij het installeren van de Windows Server kies je best ook de modus zonder GUI en alleen maar de Powershell commandolijn. Door gebruik te maken van de Powershell commandolijn zal de snelheid van je Node.js applicatie veel sneller zijn om dat bepaalde bestanden die daarvoor nodig zijn niet op de harde schijf zullen staan. Als gevolg heb je dan ook veel meer plaats voor data. Het grootte nadeel van Windows over Linux te gebruiken is dat je een licentiekost zal moeten betalen voor de server wat bij Linux totaal niet het geval is. De Linux terminal is ook veel eenvoudiger om mee te werken dan wat je kan met CMD van Windows of Powershell. Na de kost heb je ook nog het probleem dat Windows niet zo snel kan laden als Linux wat dan ook een probleem heeft bij het draaien van Node.js. Hieronder kan je een test zien uitgevoerd door Joseph Bill. Deze test werd gedaan met de Apache Benchmark tool en kan je ook duidelijk zien dat bij een Linux server je tot bijna 2x betere performance kunt hebben. Zie bijlage 4 voor de statistieken.
Bachelorproef Stijn Van Hulle
CLOUD KEUZE De keuze van cloud dienst is ook iets zeer belangrijks. De keuze voor dit prototype is gelijk omdat alle grootte cloud aanbieders even snel of even krachtig kunnen zijn. Hieronder zie je de 3 grootste die momenteel aanbieden wat wij nodig hebben. Voor het prototype gaan we verder met Microsoft Azure Cloud omdat je daar meer keuze hebt bij het aanmaken van een Node.js server. Google Cloud:
Figure 13 Google cloud (bron: Google)
Amazon Cloud:
Figure 14 Amazon Cloud (bron: HTTP://www.amazone.com)
31
Bachelorproef Stijn Van Hulle
Microsoft Azure cloud:
Figuur 15 Azure (bron: Google)
32
Bachelorproef Stijn Van Hulle
INSTALLATIE CLOUD In dit voorbeeld zijn we begonnen op Microsoft Azure Cloud met een lege Ubuntu 14.04 Server en hebben daar Node.js samen met MongoDB geïnstalleerd. Na deze 2 werd dan ook de MQTT-broker daaraan toegevoegd om dit alles aan elkaar te koppelen. De reden waarom ik gekozen heb om een lege Ubuntu server te nemen is omdat ik volledige toegang hierover heb en ook wat er allemaal bij geïnstalleerd is.
SOORTEN In Microsoft Azure Cloud zijn er wel nog mogelijkheden om een soort template te installeren waar Node.js al op staat. Bitnami is een package die de nieuwste versie van Node.js, Apache, Python en Reddis gebruikt. Dit maakt het gemakkelijker om een start server te hebben waar alles wat je nodig hebt al op staat. Als je gebruik wilt maken van Nginx dan kan je best een andere soort template kiezen maar als Apache wilt gebruiken kan perfect verder gaan met deze Template.
Figuur 16 Node Ubuntu (bron: HTTPs://portal.azure.com)
33
Bachelorproef Stijn Van Hulle
Daarnaast kan je ook een website aanmaken, deze bevat een server maar daar kan de gebruiken niet aan. Je gebruikt Node.js als een web applicatie waarbij je alleen je applicatie kan aanpassen
Figure 17 Node empty (bron: HTTPs://portal.azure.com)
Wil je meer dan een simpele Node.js server of wil je gewoon beginnen met een site die gebaseerd is op Express dan kan je een Starter Site gebruiken. Er zal standaard al de nodige middleware aanwezig zijn samen met een paar routing voorbeelden. Als je niet veel van plan bent om de Node.js server aan te passen dan kan je best deze optie nemen.
Figuur 18 Node starter (bron: HTTPs://portal.azure.com)
34
Bachelorproef Stijn Van Hulle
INSTALLATIE NODE.JS + MONGODB Nu dat we een startomgeving hebben zal er gekeken moeten worden om Node.js en MongoDB te installeren. Momenteel heeft Node.js 2 versies ter beschiking: LTS met versie v4.3.2 en STABLE met versie v5.7.1. Wat je kiest is volledig wat je zelf wilt dat het best is. Als je een versie wilt met zeer weinig bugs die maar om de zoveel maand een update krijgt kan je best kiezen voor de LTS versie, hetzelfde als er bij Ubuntu wordt gedaan met de LTS versie is die zeer LTS: curl -sL HTTPs://deb.nodesource.com/setup_4.x | sudo -E bash sudo apt-get install -y nodejs STABLE: curl -sL HTTPs://deb.nodesource.com/setup_5.x | sudo -E bash sudo apt-get install -y nodejs
Om addons van NPM te verkrijgen kan je volgende commando uitvoeren: sudo apt-get install -y build-essential Nu dat we Node.js hebben geïnstalleerd kunnen we MongoDB installeren: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 echo "deb HTTP://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list sudo apt-get update sudo apt-get install -y mongodb-org Start de MongoDB server: sudo service mongod start
35
4. HARDWARE
4 HARDWARE Voor dat we starten met sensoren kopen moeten we een kijk nemen welke hardware we willen gebruiken alsook wat het goedkoopst is. Als je goedkoop wilt gaan kan je best beginnen met het kijken naar het Arduino platform, dat platform is zeer uitgebreid en heeft een aanbod van vele sensoren.
ARUINDO De eerste keuze voor de sensoren en hardware is Arduino omdat je voor niet veel geld een starter pack kan vinden die alle basis sensoren bevat. Al zeer snel vind je online verschillende starter packs die een basis van sensoren alsook alle kabels en een breadboard waar je de verschillende sensoren kan aansluiten. In dit pakket zit standaard een Arduino Uno R3 die een kloksnelheid heeft van 16 MHz. Daarnaast is er ook een starterkit tutorial voorzien die alles uitlegt met de daarbij horende programmavoorbeelden. De prijs hiervan is 99 euro en kan je kopen via volgende link: HTTPs://www.adafruit.com/products/68
Figuur 19 Adafruit (bron: Google)
Bachelorproef Stijn Van Hulle
Figuur 20 Connector (bron: Google)
Een nadeel voor te kiezen van Arduino is dat je vast zit aan de programmeertaal die Arduino hanteert. De Arduino taal is gebaseerd op Java, Processing gebruikt zo goed als dezelfde syntax dus als je bekend bent daarmee is de overstap zeer eenvoudig. Als je kan programmeren of je moet nog leren programmeren is het wel een taal die zeer eenvoudig is. Volgend voorbeeld illustreert hoe je een led om de seconde kan laten uitgaan om daarna terug aan te steken.
Figuur 21 Arduino taal (bron: https://upload.wikimedia.org/wikipedia/en/d/d9/Arduino_1.0_IDE,_Ubuntu_11.10.png)
38
Bachelorproef Stijn Van Hulle
Daarnaast is het moeilijk om de gegevens realtime door te sturen via een Arduino. Standaard heeft Arduino geen netwerkconnectiviteit. Gelukkig is de Arduino community al zeer goed uitgegroeid en heb je wel verschillende manieren om netwerkconnectie toe te voegen. Om Wifi te gebruiken in het Arduino platform heb je 3 verschillende opties: 1. Arduino Board + Arduino Wifi Shield Voor dit scenario heb je een Arduino Board nodig waar je via het board de verschillende sensoren/leds en weerstanden toevoegt. Wanneer dit gebeurd is voeg je de Arduino Wifi Shield bovenaan op het board toe en krijgt je standaard Arduino Board Wifi toegang. Zoals je kunt zien heeft het Wifi board ook een usbpoort maar dit is anders dan het main board. De functie daarvan is om de firmware van de Wifi Shield te updaten. Volgende video illustreert zeer goed hoe je daarmee programmeert: HTTPs://www.youtube.com/watch?v=dTy0Qg_cY6Y
Figure 22 Arduino Wifi shield (bron: HTTPs://www.arduino.cc) Figure 23 Arduino Wifi Shield (bron: HTTP://www.rudiniemeijer.nl/wp-content/uploads/Arduino-met-WiFi-Shield.jpeg)
2. Arduino Board + Arduino Ethernet Shield Het principe van de eerste optie is hier zo goed als hetzelfde. Het enige grootte verschil is dat er geen USB-poort voorzien is om de firmware te updaten. Maar er is wel een SD-card slot aanwezig dat het mogelijk maakt om bestanden op te slaan die over het netwerk gaan. Daarnaast kan je de space ook gebruiken als storage server.
39
Bachelorproef Stijn Van Hulle
Figuur 24 Arduino Ethernet Schield (bron: HTTPs://www.arduino.cc)
3. Arduino Yún Arduino Yún is van deze 3 de beste oplossing om dat deze Arduino gemaakt is om te gebruiken bij IOT. Dat maakt dat er Wifi en ethernet standaard voorzien is. Daarnaast is dit een volledig systeem dat zijn eigen rekenkracht heeft. Het grootte voordeel is dat je geen aparte module moet kopen om de netwerkvoorzieningen te voorzien. De Arduino Yún heeft een snelheid van 400MHz wat perfect is voor kleine sensoren aan te sluiten en het versturen van sensordata over het netwerk.
Figuur 25 Arduino Yun (bron: HTTPs://www.arduino.cc)
De conclusie dat je hieruit kan trekken is dat Arduino een geweldig platform is en een zeer lage instapdrempel heeft. De meeste Arduino’s zijn niet zo krachtig om Node.js of andere voorzieningen te installeren die niet de Arduino taal of voorzieningen zijn.
40
Bachelorproef Stijn Van Hulle
RASPBERRY PI Raspberry Pi is een platform die al aantal jaar verschillende producten uitbrengt en waar er ook een grote community is zoals er bij Arduino bestaat. Er bestaan ondertussen al talloze projecten die gemaakt zijn met de Raspberry Pi . Het grootte voordeel tegenover Arduino is dat je veel meer keuze hebt van programmatie omdat je zelf kan kiezen welke kernel of versie van Linux je gebruikt. Zelf heeft Raspberry Pi een OS gemaakt: Raspbian die gebaseerd is op Debian en voor dit project is dit OS perfect geschikt. OPERATING SYSTEM OS
Beschrijving
Noobs
Noobs is een installatiewizard die het mogelijk maakt om zelf te kiezen bij het opstarten welk OS je wilt gebruiken. Standaard is Raspbian de eerste optie. Dit is vooral geschikt voor beginners.
Raspbian(Debian Jessie)
Versie van Debian Jessie en ook de officiële versie die het meest wordt gebruikt. Standaard is Python. Scratch, Sonic Pi, Java. geïnstalleerd. Je hebt 2 versies hiervan: de gewone versie waarbij je de volledig desktop omgeving hebt en de lite versie waarbij alles van grafisch weggelaten is.
Openelec
Openelect is een opensource mediacenter waar je video’s kunt kijken.
Ubuntu Mate
Een versie van Ubuntu waarbij de desktop van Ubuntu beschikbaar is voor de Raspberry Pi
Snappy Ubuntu Core
Ook een versie van Ubuntu maar dan volledig zonder desktop en geschikt voor developers.
Windows 10 IoT Core
Sinds dat Raspberry Pi 2 is uitgekomen is het mogelijk om Windows 10 applicaties te schrijven die op de Raspberry Pi draaien. Dit is niet een volledig versie van Windows 10 en is vooral geschikt om een IoT applicatie te maken die met Windows samen werken.
OSMC
Een variant van Openelec en vooral geschikt om video’s te kijken en te streamen.
Pinet
Pinet is gemaakt om te gebruiken in de klas.
41
Bachelorproef Stijn Van Hulle
Risc OS
Open source OS voor ARM devices.
HARDWARE
Figure 26 Raspberry Pi 2 (bron: HTTPs://www.raspberrypi.org/)
De Raspberry Pi 2 heeft 1GB Ram en een kloksnelheid van 900 MHz, daarnaast zijn de pins uitgebreid naar 40. Alle bestaande projecten die met oudere Raspberry Pi ’s zijn gemaakt werken perfect met de nieuwste versie. CONNECTIE Zoals bij Arduino is het bij Raspberry Pi mogelijk om sensoren te kopen en die aan te sluiten op een breadboard die via de GPIO pins verbonden is met de Raspberry Pi . Het voordeel dat je werkt met Raspberry Pi is dat je zelf kan kiezen welk programmeertaal je gebruikt, Python, C, Node.js, … HTTP://www.myxlshop.nl/j-s-raspberry-pi-starterkit.html?id=33599560&gclid=CjwKEAiAmY3BRDh7pjvg46p1iYSJADQ78gNL5uvX4AhizFcm2sejx-AnOWcmtJmPGOvjGOtYvKhxoCw3jw_wcB
42
Bachelorproef Stijn Van Hulle
Figure 27 Raspberry Pi starter kit (bron: HTTP://static.webshopapp.com/shops/069283/files/040344200/raspberry-pistarter-kit.jpg)
Wanneer je een sensor wilt aansturen sluit je die sensor op het board aan. Bij sommige gevallen zal je bepaalde weerstanden ook moeten aansluiten om het te laten werken. Soms zal je moeten knoeien met kabels van GPIO pins van de Raspberry Pi naar de het board, wat dan ook een mispunt is. Maar daarvoor bestaat er een oplossing: een male to female DuPont lijn die je dan aansluit op een T- type GPIO uitbreidingskaart. Hieronder zie je een voorbeeld daarvan.
Figuur 28 GPIO (bron: HTTP://g01.a.alicdn.com/kf/HTB1yYWiJXXXXXcCaXXXq6xXFXXXQ/Gratis-verzendingframboos-pi-2-t-uitbreidingskaart-diy-kit-40p-regenboog-cable-gpio-uitbreidingskaart.jpg)
Voor dat je begint met aansluiten heb je een beetje kennis van waar welke pin zit, hieronder een voorbeeld van de code en waar welke pin zit. Als dit gebeurd is kan je beginnen met de verschillende sensoren op het board aan te sluiten alsook het
43
Bachelorproef Stijn Van Hulle
programmatie hiervan. In dit voorbeeld gebruiken we Python als programmeertaal en spreken we GPIO pins rechtstreeks aan.
Figure 29 Pins (bron: HTTP://i1.wp.com/cdn.makezine.com/uploads/2014/02/gpiodescriptions.png?zoom=2&resize=620%2C378)
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_UP) while True: if(GPIO.input(23) ==1): print(“Button 1 pressed”) if(GPIO.input(24) == 0): print(“Button 2 pressed”) GPIO.cleanup() Het nadeel dat ik vond om op deze manier te werken is dat je een basiskennis van resistors moet kennen en dat je ook goed moet weten welk pin voor welke GPIO input of output staat. Om daarmee vertrouwd te worden zal je dan ook beetje kennis moeten krijgen hierin en voor velen is da dan ook moeilijker om vertrouwd te worden. Wanneer je bv een ander project wilt doen en dus je board opnieuw moet indelen zal je dit moeten opschrijven waar je welke sensor plaatst. Door die GPIO uitbreidingskaart te gebruiken kan je wel al veel problemen voorkomen omdat je dan niet elke kabel juist moet plaatsen. 44
Bachelorproef Stijn Van Hulle
GROVEPI GrovePi is een systeem waar de verschillende sensoren met kabels aangesloten worden op de GrovePi, je kan dat dat het best vergelijken met het bijvoegen van Legoblokjes. GrovePi is de Grove versie die gemaakt is voor Raspberry Pi, daarnaast heb je ook nog de Arduino Grove Shield die het mogelijk maakt om bovenop je Arduino de Grove aan te sluiten. Met dat er 2 verschillende versies bestaan voor de verschillende platformen(Arduino en Raspberry Pi ) heeft de organisatie (Seedstudo) achter Grove gemaakt dat de verschillende sensoren op beide platformen perfect werken. GrovePi draait op Arduino en stuurt zijn gegevens via de pins door naar de Raspberry Pi die dat via Python opvraagbaar maakt. Elke sensor die je kunt bedenken bestaat ondertussen voor GrovePi en dit maakt het ook zeer makkelijk om te kiezen voor GrovePi omdat dit een volledig oplossing bied voor IoT op een zeer eenvoudige manier. Naast de eenvoud heb je geen vermindering van rekenkracht met dat GrovePi zorgt voor het omzetten naar leesbare data. In de documentatie kan je ook lezen dat het mogelijk is om Node.js code te gebruiken voor het lezen en verzenden van data. De GrovePi kost 29 euro maar het is mogelijk om een starterspakket te kopen van 99 euro met de basissensoren erbij.
Figuur 30 GrovePi (bron: HTTP://www.smartliving.io/kits)
45
Bachelorproef Stijn Van Hulle
SENSOREN Hieronder vind je een lijst van sensoren en hun prijs dat voor het prototype nodig is. Je kunt ook kiezen tussen een starterspakket waarbij al veel sensoren bij zitten voor 99 euro ofwel de GrovePi board van 29 euro met de verschillende sensoren apart gekocht. Soort Prijs 1 groene led 2,50 euro 1 rode led 2,50 euro 1 blauwe led 2,50 euro Raspberry Pi Camera 35,00 euro Relay 4,95 euro Button 2,50 euro Switch 3,50 euro Ultrasonisch 16,95 euro Motion sensor 9,95 euro Temperatuur en luchtvochtigheid sensor 8,95 euro LCD RGB-backlight 15,95 euro TOTAAL 105,25 euro
46
5. INSTALLATIE
5 INSTALLATIE In dit hoofdstuk krijgt je alle informatie over het installeren van de GrovePi met de daarbij horende programmeertalen.
INSTALLATIE GROVEPI Voor je begint met installeren kan je kiezen tussen een SD-kaartje kopen van Dexter Industries waarop alles qua configuratie van GrovePi alles vooraf geïnstalleerd is. Als je de installatie handmatig wilt doen kan je volgende stappen volgen om de configuratie op punt te stellen. Voor de Raspberry Pi kan je het best kiezen voor de Raspberry Pi 2.
CONFIGURATIE RASPBERRY PI Voordat je de GrovePi installeert moet je internet toegang hebben op de Raspberry Pi. Als dat niet het geval is kan je volgende stappen ondernemen. Neem een ethernet kabel en connecteer de Raspberry Pi met je netwerk. Voor dat je start heb je het IP-adres nodig om te connecteren. Daarvoor gebruik je best Pi Finder die op het netwerk zoekt naar het juiste IP adres: HTTP://ivanx.com/raspberrypi/
Figuur 31 Scanning Pi
Wanneer je het juiste IP-adres gevonden hebt kan je connecteren tot de Raspberry Pi. Als je os x draait kan je dat perfect met de terminal doen. Op Windows kan je een SSH verbinding via Putty opzetten. ssh
[email protected]
Bachelorproef Stijn Van Hulle
Figuur 32 Connecteer Raspberry Pi
Daarna sluiten je een USB Wifi dongle aan om connectie via Wifi te laten verlopen, met de nieuwe Raspberry Pi 2 hoef je niks van configuratie te doen om het apparaat in te stellen. Volgende stappen hoef je wel te ondernemen om te connecteren met je netwerk: Open je netwerk instellingen sudo nano /etc/network/interfaces
Een voorbeeld van een configuratie voor te connecteren met Wifi: “test” auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 auto wlan0 iface wlan0 inet dhcp wpa-ssid "test" wpa-psk "PASSWORD"
Vanaf dat dit gebeurd is kan je de ethernetkabel verwijderen en de Raspberry Pi opnieuw laten opstarten.
49
Bachelorproef Stijn Van Hulle
CONFIGURATIE GROVEPI Deze stappen zal ondernomen moeten worden om de connectie tussen GrovePi en Raspberry Pi vlekkeloos te laten verlopen. Kopieer het Github naar een zelfgekozen plaats op de Raspberry Pi : sudo git clone HTTPs://github.com/DexterInd/GrovePi
De toestemmingen van het installeer script zal je eerst moeten aanpassen om de installatie te starten: cd /GrovePi/Script/ sudo chmod +x install.sh
Start de installatie: sudo ./install.sh
De installatie zal nu starten en wanneer het script klaar is zal hij de Raspberry Pi herstarten en daarna kan je testen of de connectie werkt met volgend commando: sudo i2cdetect -y 1
Als er in de output iets gelijkaardigs als hieronder verschijnt is de connectie goed verlopen.
Figure 33 i2detect (bron: HTTP://www.dexterindustries.com/grovepi/)
50
Bachelorproef Stijn Van Hulle
LEES/SCHRIJF NAAR SENSOREN Voor het lezen en schrijven naar sensoren zijn er op het platform van Grove Pi een aantal bibliotheken beschikbaar voor een aantal programmeertalen: C#, Go, Node.js, Python, Scratch. De verschillende programmeertalen en hun werking zal je hieronder vinden. C# Om c# op Raspberry Pi te gebruiken is het de bedoeling dat je Windows 10 IoT Core voor Raspberry Pi 2 installeert, als je een oudere versie van Raspberry Pi hebt zal je het onderstaande niet kunnen testen of uitvoeren. Je kan via de Noobs installeer kiezen om Windows 10 IoT Core te installeren. Als je hem zelf wilt flashen kan je dit via volgende site doen: HTTPs://msiot.github.io/content/en-US/win10/GetStarted/SetUpYourDevice.htm Wanneer je dit hebt geïnstalleerd open je Visual Studio en kan je beginnen met coderen. Volgende video kan je helpen bij het proces van installatie tot het uitvoeren van je eerste code: HTTPs://www.youtube.com/watch?v=YSVofU4Hu5o Voor dat je kunt coderen in C# zal je eerst het NuGet package voor GrovePi moeten afhalen en dat kan je doen met het volgende commando: Install-Package GrovePi
51
Bachelorproef Stijn Van Hulle
Deze code illustreert hoe je een flitsend licht kan maken door gebruik te maken van het led lampje die in dit geval op digitale poort 4 aangesloten is. using System.Threading.Tasks; using Windows.ApplicationModel.Background; using GrovePi; using GrovePi.Sensors; namespace Driver { public sealed class SimpleDriver : IBackgroundTask { private readonly IBuildGroveDevices _deviceFactory = DeviceFactory.Build; public void Run(IBackgroundTaskInstance taskInstance) { var led = _deviceFactory.Led(Pin.DigitalPin4); while (true) { led.ChangeState(SensorStatus.On); Task.Delay(500).Wait(); led.ChangeState(SensorStatus.Off); Task.Delay(500).Wait(); } } } }
Voor dit project zit alles van sensoren erin om mee te programmeren dus is het ook mogelijk om gebruik te maken van C# om te verwezenlijken wat wij gaan doen. Wanneer je nog een oudere Raspberry Pi hebt en dus niet versie 2 zal je geen Windows 10 IoT Core kunnen installeren.
52
Bachelorproef Stijn Van Hulle
NODE.JS Met dat het mogelijk is om Raspbian te gebruiken, gebaseerd op Debian, is het perfect mogelijk om Node.js te installeren. Nadat je Node.js kan draaien kunnen we volgend commando uitvoeren om de bibliotheken van GrovePi toe te voegen: npm install node-grovepi
Node.js kan op dit moment niet veel sensoren aansturen, momenteel is dat alleen maar mogelijk voor de Ultrasonisch sensor, licht sensor en de digitale poorten. Voor de RGB-led tekst in te stellen kunnen we dan ook niet Node.js gebruiken. Er is wel de mogelijkheid om dit volledig zelf te programmeren maar dat zal dan ook veel meer tijd in beslag nemen. PYTHON Voor Python is alles beschikbaar en kan je dus ook perfect alles aanspreken wat je wilt zonder problemen. Python is ook een taal die veel gebruikt wordt en zeker bij IoT. De syntax van Python tegenover andere talen is bijna hetzelfde, alleen moet je veel rekening houden met je tabs goed te plaatsen. Python werkt niet met ‘;’ en met ‘{}’ maar met ‘:’ en tabs. Eerst zal je de Python bibliotheek moeten installeren om van overal in het systeem scriptjes te kunnen schrijven. sudo python setup.py install Zoals we al getoond hebben in C# is onderstaand voorbeeld hetzelfde als die erboven maar dan de versie voor Python. Je merkt dan ook snel de eenvoud van de code wat een groot pluspunt is om Python te gebruiken. import time from grovepi import * led = 4 pinMode(led,"OUTPUT") while True: digitalWrite(led,1) time.sleep(0.5) digitalWrite(led,0) time.sleep(0.5)
53
Bachelorproef Stijn Van Hulle
CAMERA Om gebruikt te maken van de camera met een zo’n klein mogelijke latency kan je best gebruik maken van M-JPEG streamer. Wat deze streamer doet is zeer simpel, hij maakt geen video’s van de stream maar maakt zeer snel een afbeelding en stuurt dat dan door naar een webpagina. Je kan zelf kiezen welke resolutie alsook de fps voor de video. Hieronder zal je de verschillende stappen vinden voor het installeren van deze streamer.
Figuur 34 Screenshot streamer
Maak een map voor de streamer aan sudo mkdir mjpg-streamer
Haal de streamer van Github sudo git clone HTTPs://github.com/jacksonliam/mjpg-streamer.git .
Installeer bepaalde bibliotheken die samen moeten werken Sudo apt-get install libv4l-dev libjpeg8-dev imagemagick build-essential cmake subversion
Installeer M-JPEG streamer cd mjpg-streamer-experimental sudo make
Start streamer met een resolutie van 640x480 en 20 fps export LD_LIBRARY_PATH=. ./mjpg_streamer -o "output_HTTP.so -w ./www" -i "input_raspicam.so -x 640 -y 480 -fps 20 -ex night"
54
Bachelorproef Stijn Van Hulle
Als dat gebeurd is kan je je browser openen en surfen naar [ip rasbperry pi]:8080 en zal je de beelden in realtime te zien krijgen.
Figuur 35 Voorbeeld webcam
Als je de video stream lokaal wilt gebruiken zal dit perfect werken maar doordat de stream naar de server gestuurd moet worden zal je een paar aanpassingen moeten doen. De standaard M-JPEG streamer server pagina maakt het niet mogelijk om CORS te gebruiken. En daarom zal je daarnaast nog een Apache server moeten opzetten met een PHP-pagina die de laatste afbeelding van de stream ophaalt en dat vertaalt naar een Base64 string. Deze Base64-string kan je dan laten renderen in JSON-formaat, wat de server dan kan lezen. $img); echo json_encode($arr); ?>
55
Bachelorproef Stijn Van Hulle
Figuur 36 Base64 webcam
Naast het omzetten naar een leesbaar formaat zal je op je router thuis portforwarding moeten aanzetten. Daarvoor zal je poort 80, waar de Apache server draait, naar de buitenwereld moeten toelaten. Als da gebeurd is kan de data via de cloud perfect opgevraagd kunnen worden. Als je niet wilt dat bepaalde personen deze code zouden kunnen bekijken en terug zouden omzetten naar een afbeelding kan je best nog gebruik maken van AES. Dit is een encryptie die een private key nodig heeft. Je kan dan bij de Apache server dat encrypteren met die key en in de cloud decrypteren met diezelfde key.
56
Bachelorproef Stijn Van Hulle
MQTT Om de communicatie tussen de Raspberry Pi en de Node.js server realtime te verlopen kan je best kiezen om MQTT te gebruiken. MQTT wordt veel gebruikt om communicatie tussen IoT apparaten te voorzien. Voor deze standaard bestaan er veel soorten brokers maar je kan daarvoor best kiezen om HiveMQ te gebruiken. De volgende stappen moet je ondernemen om MQTT te installeren Je download van de site hun pakket en je plaats dit op een zelfgekozen plaats. HTTP://www.hivemq.com/downloads/. Er zit ook een script in om dit te laten starten op Windows dus HiveMQ kan je op elk platform naar keuze gebruiken. Met volgende commando’s kan je de MQTT server starten: sudo chmod 755 run.sh sudo ./run.sh
Om de security hiervan te verbeteren kan je best kiezen om de data te encrypteren met AES. Doordat je bij de Raspberry Pi en in de cloud een private key opslaat kan je een zeer beveiligde stream van data maken. Om MQTT te gebruiken bij Python kan je best gebruikt maken van Paho MQTTcliënt, hetzelfde held als de broker: de keuze is gelijk zolang het maar het protocol MQTT gebruikt. Volgend voorbeeld illustreert hoe je een verbinding maakt en de data leest.
57
Bachelorproef Stijn Van Hulle
import paho.mqtt.client as mqtt import paho.mqtt.publish as publish client = mqtt.Client() def on_connect(client, userdata, rc): print("Connected with result code "+str(rc)) client.subscribe("led1") def on_message(client, userdata, msg): if msg.topic=="led1": ok=grovepi.digitalRead(led1) if str(msg.payload)=="true" : if str(ok)=="0": grovepi.digitalWrite(led1,1) if str(ok)=="1": grovepi.digitalWrite(led1,1) else: grovepi.digitalWrite(led1,1) if str(msg.payload)=="false": if str(ok)=="0": grovepi.digitalWrite(led1,0) if str(ok)=="1": grovepi.digitalWrite(led1,0) else: grovepi.digitalWrite(led1,0) def init(): global client client.on_connect = on_connect client.on_message = on_message client.connect_async("raspberrypi.local", 1883, 60) client.loop_start()
58
6. APPLICATIE
6 APPLICATIE In dit hoofdstuk krijgt u meer informatie over de frontend en backend. De daar bijhorende technieken en keuzes van frameworks zullen hierbij ook worden toegelicht.
FRONTEND ANGULAR Voor de frontend kan je het best kiezen om Angular te gebruiken als MVVM samen met Bootstrap voor de lay-out op te bouwen. Voor de datums in een juist formaat te gieten en voor het eenvoudig gebruiken van ‘x aantal seconden geleden’ is Moment.js één van de beste frameworks om dit toe te passen. Jade samen met Angular gebruik je best om de layout op te bouwen, de keuze om deze 2 samen te gebruiken is omdat je elke pagina kan doen verschillen zonder veel Javascript code te schrijven. Het grootte voordeel van Jade is dat je met minder code hetzelfde als in HTML kan schrijven. Daarnaast heb je via dit systeem de mogelijkheid om de beveiliging backend te doen zonder dat de pagina’s in de public map zitten. Als je de routing gebruikt van Angular zal je nog een aanpassing moeten doen zodat je Jade kan laten weten om die bepaalde pagina te renderen. Je kunt niet zomaar Angular naar een HTML pagina laten verwijzen omdat we Jade gebruiken als rendering engine. Met de volgende code kan je Jade de index pagina laten renderen, ‘access’ hierbij is de controle of de gebruiker is aangemeld. Indien niet zal er een verwijzing naar de loginpagina gedaan worden.
Bachelorproef Stijn Van Hulle
router.get('/index',access, function (req, res) { fs.exists(path.join(__dirname, '../', 'views/main/index') + '.jade', function (exists) { if(exists){ res.render('main/index' ); }else{ res.render('template/error', { message: "Can't load", error: {} }); } }) }); Bij routes in Angular kan je dan de ‘TemplateUrl’ gelijk stellen aan de API-call die Jade de rendering zal laten doen, als dat gebeurd is zal er een HTML-pagina verschijnen.
61
Bachelorproef Stijn Van Hulle
var routes = function($routeProvider, $locationProvider) { $routeProvider .when('/', { name: 'home', redirectTo: '/live' }) .when('/plan', { name: 'plan', templateUrl: '/partials/plan', controller: 'planController', reloadOnSearch: false
}) $locationProvider.html5Mode(true); };
62
Bachelorproef Stijn Van Hulle
MODULE LADERS Voor dat je begint met Angular te implementeren is het best dat er een beetje kennis over module laders gedeeld wordt. Het probleem dat je vroeger had met het maken van applicaties in Javascript was als je functies in aparte bestanden wilde steken je dat dan op de juiste plaats in de HTML-code moest laden. Als dan een bepaalde code nodig is voor een bepaalde functie en dat nog niet geladen is zal dat voor veel problemen zorgen. Module laders hebben dat probleem opgelost doordat zij alle problemen oplossen van het laden van het juiste bestand. Het enige dat jij nog zal moeten doen is het juiste bestand op de juiste plaats gebruiken en op het einde hoef je maar één bestand in de HTML te plaatsen waarbij alles in juiste volgorde geladen wordt. Bij Node.js zit module-laders al van het begin er in en bij module laders zijn het keyword ‘Require’ en ‘Exports’ zeer belangrijk. Hieronder kan je een voorbeeld zien van hoe dat eruit ziet. var mysql var pool
= require('mysql'); = mysql.createPool({
host
:’NAME’,
user
: ‘NAME',
password : 'PASS', database : 'iot', connectTimeout: 2000 }); module.exports=pool; Om dit te gebruiken in frontend heb je momenteel 3 belangrijke bibliotheken die dit verwezenlijken en de daar bijhorende standaarden die er momenteel gehanteerd worden. Met gelijk welke bibliotheken kan je hetzelfde verwezenlijken maar qua syntax is er wel een groot verschil. De 3 grootste zijn: Require.js, Webpack en Browserify. Daarbij is Browserify de bibliotheek die het dicht aanleunt bij Common.js dat ook gebruikt wordt bij Node.js
63
Bachelorproef Stijn Van Hulle
REQUIRE.JS Allereerst zal je bij Require.js een startpunt moeten maken, een Javascript bestand waar alle requires staan die je zult nodig hebben doorheen je applicatie. Structuur: www/
index.html js/ • lib/
• •
• •
• •
file1.js file2.js
app.js require.js
Index.html: <script data-main="js/app.js" src="js/require.js"> App.js: In app.js, in dit geval, zal de juiste modules geladen moeten worden die je zult nodig hebben doorheen de applicatie. requirejs.config({ baseUrl: 'js/lib', paths: { app: '../app' } }); requirejs(['jquery', 'canvas', 'app/sub'], function($, canvas, sub) { $(‘body’).addClass(‘test’); });
64
Bachelorproef Stijn Van Hulle
Om modules te laden heb je 2 verschillende soorten: ‘Define’ en ‘Require’. Define gebruikt je wanneer je data wilt terugzenden en dus een export zou doen bij Node.js. Bij Require.js gebeurt dit dan via een return. Om data dan terug op te halen en dus een ‘require’ te doen zal je een array moeten meegeven als 1ste parameter en een functie als 2de parameter. Via de parameters van de functie kan de export(data of functies) van het andere bestand gebruikt worden define(function () { return { color: "black", size: "unisize" } }); require([“test"], function (test) { console.log(test.color); }); Als je toch meer de syntax wilt gebruiken van Common.js heeft Require.js daar ook code voor voorzien maar het is niet volledig volgens de normen van Common.js omdat je nog altijd de ‘define’ zal moeten gebruiken. define(function(require, exports, module){ var foo = require('foo'), bar = require('foo/bar'); exports.doSomething = function(){ console.log(foo + bar); }; }); Zoals je ziet is dit totaal anders dan bij Node.js en zal je ook veel code extra moeten schrijven. Het grootste nadeel van het gebruik van Require.js is dat je minder orde hebt over de code en ook vooral als je modules zou schrijven voor Node.js kan je deze niet zomaar gebruiken in de frontend. 65
Bachelorproef Stijn Van Hulle
WEBPACK Webpack gebruikt Common.js standaard maar als je toch meer voorstander bent van AMD kan je zelf kiezen wat je gebruikt. De 2 soorten zitten in dit framework en kan je ook samen gebruiken zonder veel probleem. Structuur: www/ • •
index.html js/ • lib/ • •
file1.js file2.js
app.js webpack.config.js Gulp.js •
• •
Index.html: Het beginpunt hierbij zal een bestand zijn die gemaakt wordt door de Webpack stream in Gulp. Gulp zal naar het configuratiebestand kijken van Webpack om te weten waar het begin Javascript bestand zich bevindt. <script src="js/app.bundle.js"> Gulp.js: var gulp = require('gulp'); var webpackConfig = require("./webpack.config.js"); gulp.task("webpack-build", function() { gulp.src(“/js”) .pipe(jshint()) .pipe(sourcemaps.init()) .pipe(stream(webpackConfig)) .pipe(sourcemaps.write()) .pipe(gulp.dest(“/js”)); });
66
Bachelorproef Stijn Van Hulle
Webpack.config.js: var webpack
= require("webpack");
module.exports = { entry: { app:__dirname + '/source/js/app.js' }, output: { publicPath: "HTTP://localhost:80/", path: __dirname + "/js", filename: '[name].bundle.js' }, module: { loaders: [] }, plugins: [] };
Dit is het beste als je code hebt gemaakt met behulp van Require.js maar daarnaast ook nog code wilt gebruiken van Node.js. Doordat Webpack beide soorten ondersteund kan je hiervoor zelf kiezen. Het nadeel bij het gebruik hierbij is dat je Gulp zal moeten gebruiken samen met een Webpackconfig-bestand. Als de configuratie goed staat zal je niet zoveel problemen ondervinden maar vanaf dat er iets misloopt bij de configuratie zal de code niet veranderd worden naar één Javascript file.
67
Bachelorproef Stijn Van Hulle
BROWSERIFY Browserify is van deze 3 het framework dat je het best kan vergelijken met Node.js en dus ook de volledige syntax volgt van de Common.js standaard. Je hebt daarbij geen configuratie bestand nodig, het enige dat je wel zal moeten doen voor het jezelf eenvoudiger te maken is een Gulpbestand schrijven die het commando van Browserify voor jou zal doen. Structuur: www/ • •
index.html js/ • lib/ • •
•
•
Gulp.js
app.js
file1.js file2.js
Index.html: <script src="js/app.bundle.js"> browserify main.js -o bundle.js Gulp.js: var gulp = require('gulp'); var browserify = require('gulp-browserify'); gulp.task('scripts', function() { gulp.src('src/js/app.js') .pipe(browserify({ insertGlobals : true, debug : !gulp.env.production })) .pipe(gulp.dest('./build/js')) });
68
Bachelorproef Stijn Van Hulle
Browserify lost veel van de problemen op die we met de vorige bibliotheken hadden dus kunnen we hier uit wel concluderen dat Browserify het beste framework is om te gebruiken voor ons prototype, wat je kiest is natuurlijk volledig je eigen keuze. SOCKETS Om sockets te laten werken met Angular zijn er bepaalde stappen die je moet ondernemen om dit vlot te laten verlopen. Allereerst zal je moeten zien dat er een websocket-server draait want anders zal je tot niets kunnen verbinden. Daarna zal je eerst een Factory moeten aanmaken die connecteert tot een adres. Als dat gebeurd is kan je in de controller de parameter toevoegen. app.factory('$socket', function(){ return io.connect('HTTP://37.59.114.49'); }); var mainController = function ($scope, $socket) { } In de Html zal je nog het Javascript bestand moeten in toevoegen, dit bestand zal door de socket server worden aangemaakt. Het voorbeeld hieronder is in de Jade syntax geschreven. script(src="/socket.io/socket.io.js") Volgend voorbeeld kan je gebruiken om een event listener te starten. $socket.on('temp', function(msg){ $scope.sensors.temp=msg; $scope.$apply(); }); Wanneer je over de socket een bericht wilt sturen kan je dit met volgend voorbeeld. $socket.emit('ledChange',{'led':lamp.led,'status':true});
69
Bachelorproef Stijn Van Hulle
BACKEND De backend zoals er al staat in dit document is gemaakt met Node.js. Daarbij is Express gebruikt om de communicatie over HTTP eenvoudiger te maken. Naast Express is Jade nog een module die zeker niet mag ontbreken in de applicatie maar zoals er al gezegd geweest wordt Jade niet volledig gebruikt. PASSPORT Voor de authenticatie en autorisatie gebruik je best Passport. Deze module maakt het mogelijk om zeer eenvoudig verschillende authenticatie technologieën aan toe te voegen. Wanneer je van plan bent om toegang via accounts toe te voegen tot de applicatie is het best dat je voor Passport-local kiest. Dit is de pure basis van inloggen en registeren. In bijlage 2 vind je een voorbeeld van de code voor Passport-local.
Figuur 37 Passport (bron: HTTP://passportjs.org/images/twitter-card.png)
Ben je van plan om Facebook, Google of Twitter toe te voegen tot je applicatie kan dit perfect met Passport. Zelf zal je niet veel moeten bekijken van hoe de Facebook login werkt maar zal je gewoon de verschillende keys invullen. Naast het inloggen tot bestaande systemen kan je ook token-based login aanmaken, dat is het best geschikt voor het beveiligen van eenvoudige API-calls. Wil je toch nog meer beveiliging kan je best kiezen voor Passport-Oauth2. Om nog een betere beveiliging te maken kan je in plaats van MD5 Bcrypt gebruiken. Het grootte verschil tussen deze 2 is dat wanneer je een wachtwoord hasht met Bcrypt het er altijd anders zal uitzien. Bij het inloggen, zal je dan een Bcrypt functie moeten uitvoeren die controleert of de hashing juist is. Dit is niet hetzelfde als een nieuwe hash dus Bcrypt zorgt voor een extra beveiliging.
70
Bachelorproef Stijn Van Hulle
SOCKETS Om een socket server op te zetten kan je gebruik maken van verschillende socket bibliotheken maar momenteel is Socket.io het gemakkelijkst om mee te werken. Zoals je al bij de frontend hebt kunnen lezen kan je een ‘emit’ sturen alsook een event listener aanmaken. Bij Socket.io is er een onderscheidt tussen ‘io.emit()’ en ‘socket.emit()’. Bij ‘io.emit()’ stuur je een bericht naar alle verschillende sockets die momenteel verbinding hebben met de server. Met ‘Socket.emit()’ daarentegen stuur je een bericht naar die bepaalde socket. Dus in het geval van het prototype dat we hebben zal je de temperatuur met ‘io.emit()’ versturen omdat alle personen die toegang hebben tot de applicatie dezelfde gegevens hoeven te zien. Socket.io is zo gemaakt dat hij terugvalt op oudere technieken als de technologie niet ondersteunt worden door de browser. Dus als bv Websocket niet ondersteund wordt door de browser maar Flash wel, dan zal Socket.io Flash gebruiken om de sockets te verzenden. 1. 2. 3. 4. 5. 6.
WebSocket Adobe Flash Socket AJAX long polling AJAX multipart streaming Forever Iframe JSONP Polling
Door deze techniek te gebruiken kan je veel meer browsers aanspreken. Volgende versies zijn ondersteunt. • • • • • • •
Internet Explorer 5.5+ Safari 3+ Google Chrome 4+ Firefox 3+ Opera 10.61+ Safari voor iPhone en iPad Android browser
In het volgende voorbeeld kan je zien dat er via de socket gecommuniceerd wordt met de MQTT-broker. Het python script die draait op Raspberry Pi zal dan het juiste lichtjes aansteken of uitdoen.
71
Bachelorproef Stijn Van Hulle
var client
= mqtt.connect('mqtt://raspberrypi.local');
client.subscribe('led1'); io.on('connection', function (socket) { socket.on('ledChange', function (msg) { var led = msg.led; var newStatus = msg.status; socket.emit("message", "led1"+ " is uitgegaan"); client.publish('led1', msg.toString()); }); } MQTT CLIENT Het volgende voorbeeld maakt connectie met de MQTT-broker en wanneer het Python script een verandering heeft van temperatuur zal hij via de subsciption temp de data doorsturen en de Node.js server zal deze dan in de MongoDB plaatsen. Naast het toevoegen van data in de database moet dit ook realtime getoond worden via de sockets. var client
= mqtt.connect('mqtt://raspberrypi.local');
client.subscribe('temp'); client.on('message', function (topic, message) { if(topic.toString()=="temp"){ var obj=JSON.parse(message.toString()); mongo.addData(topic.toString(),obj,function(err,result){ }); io.emit(topic.toString(),obj); } }
72
Bachelorproef Stijn Van Hulle
MONGOOSE De server zelf is al aangemaakt dus moet je alleen maar op de Node.js server nog een connectie maken met de server en de data toe te voegen. Daarbij zal eerste een connectie moeten opgezet worden en dat is mogelijk met het volgende scriptje. var mongodbURL
= 'mongodb:// ';
var db =mongoose.connect(mongodbURL); mongoose.connection.on("open", function () { console.log("connection met mongo server " + mongodbURL); //mongoose.connection.db.dropDatabase(); }); Toevoegen van data is mogelijk na het maken van een model en een schema. Een schema kan je het best vergelijken het instellen van datatypes bij een relationele database met het verschil dat het bij MongoDB perfect mogelijk is om nog aanpassingen te doen tot het schema zonder veel problemen. Zie bijlage 3 voor het aanmaken van een schema en een model. Volgende code maakt een nieuwe gebruiker aan en die wordt als laatste opgeslagen in de MongoDB. var user = new User({ lastname: "Lastname", firstname: "Firstname", email: "me @outlook.com", password: md5("test"), type: user }); User.save();
73
Bachelorproef Stijn Van Hulle
Volgende code zal alle gebruikers ophalen en daarbij het wachtwoord niet tonen. User.find({}, {password: 0}).populate('type').exec(function (err, docs) { if (err) { cb(err, null); } else { cb(null, docs); } });
74
Bachelorproef Stijn Van Hulle
VOORBEELD Het eindresultaat van het maken van de applicatie en het prototype kan je hieronder vinden. Om de code eens te bekijken kan je naar volgende URL gaan: https://github.com/stijnvanhulle/ControlYourHome
Figuur 38 Login scherm
Figuur 39 Camerascherm
75
Bachelorproef Stijn Van Hulle
Figuur 40 Startscherm
76
7. ALTERNATIEVEN
7 ALTERNATIEVEN In dit hoofdstuk gaan we op zoek naar systemen die zonder veel code bepaalde zaken voor je kunnen oplossen. Momenteel zijn er nog niet zoveel systemen die dit verwezenlijken alsook de systemen die bestaan hebben nog niet zoveel apparaten die er mee werken.
HOMEKIT In 2014 kondigde Apple Homekit aan, Homekit is een platform die het mogelijk maakt om bestaande apparatuur die al connecteerbaar is met ios van op afstand te bedienen. Het grootte voordeel van Homekit is dat developers Homekit in hun applicaties kunnen integreren en wanneer een bepaald apparaat het Homekit label heeft kan je de API daarvan gebruiken. Je hoeft dus zelf niet te weten hoe het apparaat communiceert want alles daarvan vangt Homekit voor jou op. Naast de eenvoud is het ook mogelijk om zo met andere apparaten te communiceren of anders gezegd dat een Philips Hue een actie op een ander apparaat kan aanzetten. Homekit maakt het dus mogelijk dat een ontwikkelaar enorm veel apparaten kan aansturen met een bijna identieke programmeercode. Dit maakt programmeren met IoT zoveel makkelijker. Momenteel zijn er nog niet veel apparaten die dit ondersteunen.
Figuur 41 Homekit (bron: HTTP://www.apple.com)
Bachelorproef Stijn Van Hulle
PROJECT BRILLO Project Brillo is het antwoordt van Google om iets gelijkaardigs te maken zoals Homekit. Daarbij is er bij Google nog niet veel informatie beschikbaar alsook dat er nog geen apparaten zijn die dit ondersteunen. Momenteel is er alleen maar een developer preview beschikbaar. Project Brillo draait op Android en naast dat het Google’s os gebruikt zal het Weave ondersteunen. Weave is een protocol dat ook door Google gemaakt is om de communicatie tussen verschillende IoT apparaten te vereenvoudigen. Weave gebruikt JSON om de communicatie tussen cloud en IoT apparaat te voorzien.
Figuur 42 Weave (bron: HTTPs://www.getstructure.io/blog/everything-i-learned-about-googles-brillo-and-weave-atubiquity-dev-summit)
79
Bachelorproef Stijn Van Hulle
AZURE IOT HUB
Figuur 43 Azure IoT Hub (bron: HTTPs://azure.microsoft.com/en-us/documentation/articles/iot-hub-what-is-iot-hub/)
Eén van de grootste systemen die het beste van alles biedt voor IoT apparaten is Azure IoT Hub. Het is een oplossing die een betrouwbare en beveiligde bidirectionele communicatie toelaat tussen verschillende IoT apparaten. Per apparaat wordt er authenticatie en een beveiligde verbinding opgesteld, dit wordt mogelijk gemaakt doordat elk apparaat een eigen key heeft die het mogelijk maakt om te connecteren tot de IoT Hub. Naast de beveiliging kan de apparaat logs van op afstand in de IoT Hub bekijken. Het grootste voordeel van deze oplossing is dat je zonder probleem van één apparaat tot miljoenen apparaten kunt gaan,. de schaalbaarheid is zeer goed. De keuze van protocol is ook zeer afhankelijk van je eigen keuzes, je kunt kiezen om de oplossing van Azure zelf te kiezen of om MQTT, HTTP of AMQP te integreren. Hetzelfde geldt voor de keuze van programmeertaal, ondertussen kan je kiezen tussen C#, Java of zelfs Node.js.
80
8. BESLUIT
8 BESLUIT ALGEMEEN BESLUIT Uit de bachelorproef kan er besloten worden dat er momenteel veel verschillende technieken op de markt bestaan om de communicatie tussen en naar één IoT apparaat te voorzien. Dit maakt het soms moeilijk voor ontwikkelaars om verschillende IoT apparaten aan te spreken. Daarvoor zijn er wel systemen zoals Homekit, Project Brillo en Azure IoT Hub beschikbaar. Maar ofwel moet je certificaten aankopen ofwel moet je volledig volgen wat het systeem aanbeveelt. Het komt er dus op neer dat je zeer afhankelijk bent van het systeem dat je wilt gebruiken. Met dat er momenteel nog niet echt een standaard is om de communicatie te laten verlopen is het best dat je het volledig zelf bouwt en daarvoor MQTT gebruikt als tussenkanaal. Dat je Node.js kunt gebruiken voor een IoT omgeving was al gekend maar de beste manier voor Node.js te gebruiken met zoveel mogelijk prestatie is Node.js als referentiepunt te gebruiken tussen het script dat op de hardware draait en de applicatie zelf. Als slot kan er besloten worden dat Node.js het perfecte systeem biedt om een IoT omgeving op te zetten en dat dit ook door de volledige systemen zoals Azure IoT Hub ondersteund wordt. Je kunt dus zelf volledig kiezen welk systeem je kiest maar toch nog altijd Node.js gebruiken.
Bachelorproef Stijn Van Hulle
PERSOONLIJK BESLUIT Voor mij was dit schrijven en vooral het maken van een IoT systeem zeer leerrijk. Naast dat ik enorm veel nieuwe kennis heb gekregen over de werking van een IoT systeem was het enorm interessant om de verschillende protocollen eens te vergelijken met elkaar en te zien wat het beste is om te gebruiken. Het kiezen van de juiste hardware vond ik zelf het moeilijkst omdat ik zelf geen hardware kennis had en dus zeker niet de verschillen kon zeggen. Met het schrijven van deze bachelorproef ben ik dan ook te weten gekomen welke hardware geschikt is en voor welke hardware je meer kennis nodig hebt om iets gelijkaardigs te verwezenlijken. Zelf had ik al eens met een Raspberry Pi gewerkt maar niet in deze schaal. De keuze om eerst te werken met kabels om de sensoren aan te sluiten was een keuze dat rap weg was wanneer ik een systeem vond die dat allemaal op zich neemt. Voor mij was dan ook zeer rap de keuze gemaakt dat Grove Pi meer zou voldoen aan men eisen. Met sockets had ik bijvoorbeeld als eens gewerkt maar op deze schaal nog niet of anders gezegd om de communicatie tussen een IoT apparaat en de sockets te voorzien was voor mij nog onbekend. In de eerste testen, toen ik nog werkte met een oudere Raspberry Pi , vond ik dat de snelheid van realtime data doorsturen zeer traag was. Dus toen begon dan ook de zoektocht van hoe kan ik dit rapper kon maken. Daarvoor begon ik eerst met een hardware upgrade of anders gezegd heb ik de Raspberry Pi 2 aangekocht die 2 keer rapper is dan zijn voorganger. De snelheid daarna was een zeer groot verschil maar toch miste ik nog altijd een manier om met events te werken. Want nu wordt alles in een loop gecontroleerd en bij fouten heeft dit vertragingen bij de sockets. En daarom begon mijn zoektocht naar systemen die alles op zich nemen. Weave is dan ook iets waar ik enorm naar uitkijk om mee te kunnen werken. Na het schrijven van deze bachelorproef is mijn interesse in hardware en IoT nog meer gegroeid en daarom probeer ik mij hierna nog meer te verdiepen in de verschillende technologiën.
83
Bachelorproef Stijn Van Hulle
REFERENTIELIJST 0fps. (sd). Common.js. Opgehaald van http://0fps.net/2013/01/22/commonjs-whyand-how/ Agraj Mangal. (sd). Authenticating Node.js Applications With Passport. Opgehaald van http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-withpassport--cms-21619 Apple. (sd). Homekit Apple. Opgehaald van http://www.apple.com/benl/ios/homekit/ Bill, J. (sd). Node.js Performance Benchmark on Windows vs. Linux. Opgehaald van http://josephbill.com/node-js-performance-benchmark-on-windows-vs-linux/ Catanzariti, P. (sd). Streaming a Raspberry Pi Camera Into VR With JavaScript. Opgehaald van http://www.sitepoint.com/streaming-a-raspberry-pi-camerainto-vr-with-javascript/ COAP. (sd). COAP. Opgehaald van http://coap.technology/ Condliffe, J. (sd). The World's First Webcam Was Created to Check a Coffee Pot. Opgehaald van http://gizmodo.com/5993583/the-worlds-first-webcam-wascreated-to-check-a-coffee-pot-remotely Davis, T. (sd). Webhooks. Opgehaald van https://webhooks.pbworks.com/w/page/13385124/FrontPage Dexterindustries. (sd). Setting Up The Software. Opgehaald van http://www.dexterindustries.com/GrovePi/get-started-with-thegrovepi/setting-software/ el-Khoury, R. (sd). Designing for the internet of things. Opgehaald van https://www.youtube.com/watch?v=tcUvg9jcfG8 Fardost, A. (sd). Internet of things - beyond our current imagination. Opgehaald van https://www.youtube.com/watch?v=sgMG7zRrcPk Gallagher, S. (sd). The future is the Internet of Things—deal with it. Opgehaald van http://arstechnica.com/unite/2015/10/the-future-is-the-internet-of-thingsdeal-with-it/ Goel, N. (sd). Browserify VS Webpack - JS Drama. Opgehaald van http://blog.namangoel.com/browserify-vs-webpack-js-drama Google. (sd). Brillo en Weave. Opgehaald van https://developers.google.com/brillo/ Hougland, B. (sd). What is the Internet of Things? And why should you care? Opgehaald van https://www.youtube.com/watch?v=_AlcRoqS65E Iculture. (sd). Homekit. Opgehaald van http://www.iculture.nl/dossiers/homekit/ 84
Bachelorproef Stijn Van Hulle
IEEE. (sd). Standard for an Architectural Framework for the Internet of Things (IoT). Opgehaald van https://standards.ieee.org/develop/project/2413.html Kitamura, M. U. (sd). Introducing WebSockets. Opgehaald van http://www.html5rocks.com/en/tutorials/websockets/basics/ Lyne, J. (sd). Everyday cybercrime and what you can do about it. Opgehaald van https://www.youtube.com/watch?v=fSErHToV8IU Mean. (sd). Mean info. Opgehaald van http://mean.io/ Mongodb. (sd). Mongodb. Opgehaald van https://www.mongodb.org/ Python. (sd). Python info. Opgehaald van https://www.python.org/ Require.js. (sd). Common.js in Require.js. Opgehaald van http://requirejs.org/docs/commonjs.html Saucedo, A. (sd). Web 3.0 - The Internet of Things! Opgehaald van https://www.youtube.com/watch?v=F_nbUizGeEY Shacklett, M. (sd). DDS solves major big data IoT problems. Opgehaald van http://www.techrepublic.com/article/dds-solves-major-big-data-iotproblems/ Trelllo. (sd). Webhooks. Opgehaald van https://developers.trello.com/advancedreference/webhook Webpack. (sd). Webpack. Opgehaald van https://webpack.github.io/ Whyte, A. V. (sd). The Future of the Internet of Things Is Amazing, If We Don’t Muck It Up. Opgehaald van http://www.huffingtonpost.com/alisa-valudes-whyte-/theinternet-of-things-future_b_8640360.html Wikipedia. (sd). AMD. Opgehaald van https://en.wikipedia.org/wiki/Asynchronous_module_definition Wikipedia. (sd). Create, read, update en delete. Opgehaald van https://en.wikipedia.org/wiki/Create,_read,_update_and_delete Wikipedia. (sd). Internet Of Things. Opgehaald van https://en.wikipedia.org/wiki/Internet_of_Things Wikipedia. (sd). Model View Viewmodel. Opgehaald van https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmode l Wikipedia. (sd). REST. Opgehaald van https://en.wikipedia.org/wiki/Representational_state_transfer
85
Bachelorproef Stijn Van Hulle
Wikipedia. (sd). Web 3.0 + semantic web. Opgehaald van https://en.wikipedia.org/wiki/Web_3.0 Wikipedia. (sd). Websocket. Opgehaald van https://en.wikipedia.org/wiki/en/WebSocket Wikipedia. (sd). Xmpp. Opgehaald van https://en.wikipedia.org/wiki/en/XMPP
86
Bachelorproef Stijn Van Hulle
BIJLAGES Bijlage 1:
87
Bachelorproef Stijn Van Hulle
Bijlage 2: var passport = require('passport'), LocalStrategy = require('passportlocal').Strategy,User = require('../data/models/user'), md5 = require('md5'); function findByEmail(email,password, fn) { User.find({email:email, password:md5(password)}).populate('type').exec(function (err, result){ if (err) throw err; var user= result[0]; if(user!=null && user.length!=0 && user.active==true){ return fn(null, user); }else{ return fn(null, null); } }); } passport.use('local',new LocalStrategy({ passReqToCallback : true, usernameField: 'email', passwordField: 'password'}, function(body, email, password, done) { process.nextTick(function () { findByEmail(email,password, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } return done(null, user); }) }); } ));
88
Bachelorproef Stijn Van Hulle
passport.serializeUser(function(user, done) { done(null, user); });
passport.deserializeUser(function(user, done) { done(null, user); });
89
Bachelorproef Stijn Van Hulle
Bijlage 3: var mongoose
= require("mongoose");
var Schema
= mongoose.Schema;
var user_type
= require("./user_type");
var schema = new Schema({ lastname: {type:String, unique:true}, firstname: {type:String, index:true}, email: {type:String}, password: {type:String}, type: {type: Schema.ObjectId, ref:'usertype'}, active: {type: Boolean, default:1}, createdOn: {type:Date, default:Date.now } });
schema.pre('save', function (next) { next(); });
module.exports=schema;
90
Bachelorproef Stijn Van Hulle
var mongoose = require("mongoose"); var schema = require('../schemas/user');
var model = mongoose.model('user', schema, "users"); //model,schema,collection
module.exports=model;
91
Bachelorproef Stijn Van Hulle
Bijlage 4:
92