Scriptie ingediend tot het behalen van de graad van PROFESSIONELE BACHELOR IN DE ELEKTRONICA-ICT
Access management applications for Tapazz and KeyWi Francis Didden Departement Wetenschappen en Techniek Opleiding Elektronica-ICT Academiejaar 2014-2015
Interne promotor: Jeroen Doggen Externe promotor: Maarten Kooiman
Versie: 12 juni 2015
Dankwoord
Ik zou graag mijn bedrijfspromotor, Maarten Kooiman willen bedanken voor zijn begeleiding en zijn steun in het slagen van het project. Ook Stijn Hooft zou ik willen bedanken, want zonder zijn hulp zou het nooit gelukt zijn om zo vlot en correct te kunnen werken. Ook Jeroen Doggen zou ik willen bedanken voor zijn steun achter de schermen en zijn raad over de praktische kant van de stage. Antwerpen, 12 juni 2015 Francis Didden
i
Abstract De opdracht van mijn stage bestaat erin twee applicaties te maken die ongeveer dezelfde functionaliteit hebben. De applicaties moeten draadloos hardware aanspreken die aangesloten is op een elektronisch slot en zo het slot kunnen openen en sluiten. De reden dat ik deze opdracht heb gekozen is dat de samenwerking tussen hardware en software mij altijd al gefascineerd heeft en dat dit met het oog op mijn toekomst een zeer interessant project is. De eerste applicatie is voor Tapazz en de tweede voor KeyWi. Tapazz is een reeds bestaande dienst voor autodelen die een nieuwe optionele functionaliteit wil toevoegen met het draadloze slot voor de huurauto’s en KeyWi is een nieuw product is dat enkel gaat focussen op het draadloze slot en dan voor eender welk elektronisch slot. Dit houd in dat men een KeyWi op eender welk slot kan monteren en men zo effectief de sleutelbos kan elimineren. Men zal de applicaties ook kunnen gebruiken als een soort GPS tracker van de auto of van eender welk ander slot waar men de harware op aansluit, zodat men nooit meer kan vergeten waar de KeyWi geparkeerd of gelokaliseerd is. De twee applicaties werken dus samen met een stuk hardware dat in het geval van Tapazz ’Keyless Lock’ heet en voor KeyWi wordt het gewoon ’de KeyWi’ genoemd. Dit stuk hardware bevat de functionaliteit om elektronische sloten te openen en kan vanaf eender welke smartphone met de applicatie aangesproken worden. De informatie over de gebruikers en de toestellen (en over auto’s voor Tapazz) wordt opgehaald uit een database via een webservice die de backend aanspreekt. Voor Tapazz bestond deze backend reeds en deze spreek ik dus gewoon aan om de applicatie te maken, maar de backend voor de KeyWi applicatie heb ik zelf moeten maken. Ik had een moeilijke start van mijn stage omdat de programmeertaal die ik moest gebruiken voor de applicaties Java was en dat ik deze taal nog nooit eerder had gebruikt. Door niet op te geven, stap voor stap alle taken te onderzoeken en door de hulp van Tom Peeters heb ik het project tot een goed einde kunnen brengen. Alle ervaring die ik heb opgedaan heeft er toe geleid dat ik enorm veel heb bijgeleerd op professioneel en praktisch vlak.
ii
Inhoudsopgave
Dankwoord
i
Abstract
ii
1 Situering 1.1 Virtual Ignition 1.2 Tapazz . . . . 1.3 KeyWi . . . . 1.4 Collega’s . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1 1 1 2 3
2 Bespreking 2.1 Webservice, backend en database . . . 2.1.1 Webservice . . . . . . . . . . . 2.1.2 Backend . . . . . . . . . . . . 2.1.3 Database . . . . . . . . . . . . 2.1.4 Testen . . . . . . . . . . . . . 2.2 Applicaties . . . . . . . . . . . . . . . 2.2.1 Tapazz . . . . . . . . . . . . . 2.2.2 KeyWi . . . . . . . . . . . . . 2.2.3 Design van de KeyWi applicatie 2.3 Hardware . . . . . . . . . . . . . . . . 2.4 User tests . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
4 4 4 5 6 7 8 8 15 26 26 26
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 Resultaten
28
4 Besluit
29
A Webservice van KeyWi A.1 GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.1.1 / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30 30 30
iii
INHOUDSOPGAVE A.1.2 A.1.3 A.1.4 A.1.5 A.1.6 A.1.7 A.1.8 A.1.9 A.1.10 A.2 POST A.2.1 A.2.2 A.2.3 A.2.4 A.2.5 A.2.6 A.2.7 A.2.8 A.2.9 A.2.10 A.2.11 A.2.12 A.2.13 A.2.14 A.2.15
/user/:userId/:requestingUserId/:sessionKey(/) . . . /user/email/:email/:requestingUserId/:sessionKey(/) /forgot/password/:email(/) . . . . . . . . . . . . . /device/:deviceId/:userId/:sessionKey(/) . . . . . . /devices/:userId/:sessionKey(/) . . . . . . . . . . . /device/log/:deviceId/:userId/:sessionKey(/) . . . . /guestcodes/:userId/:sessionKey(/) . . . . . . . . . /guestcodes/device/:deviceId/:userId/:sessionKey(/) /time/:pattern(/) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Note . . . . . . . . . . . . . . . . . . . . . . . . . /register(/) . . . . . . . . . . . . . . . . . . . . . . /login(/) . . . . . . . . . . . . . . . . . . . . . . . /logout(/) . . . . . . . . . . . . . . . . . . . . . . /user/forgot/password/reset(/) . . . . . . . . . . . /user/delete(/) . . . . . . . . . . . . . . . . . . . . /user/change/name(/) . . . . . . . . . . . . . . . /user/change/email(/) . . . . . . . . . . . . . . . . /user/change/password(/) . . . . . . . . . . . . . . /user/profile/picture(/) . . . . . . . . . . . . . . . /device/edit(/) . . . . . . . . . . . . . . . . . . . . /device/remove(/) . . . . . . . . . . . . . . . . . . /guestcode/create(/) . . . . . . . . . . . . . . . . /guestcode/add(/) . . . . . . . . . . . . . . . . . . /guestcode/delete(/) . . . . . . . . . . . . . . . .
iv . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
30 31 31 32 32 33 33 34 34 34 34 35 35 36 36 37 38 38 39 40 41 41 42 43 44
Lijst van figuren
1.1 1.2 1.3
KBC logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tapazz logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . KeyWi logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1 2.2 2.3 2.4 2.7 2.8 2.9 2.12 2.13 2.15 2.16 2.17 2.18 2.20
Welkomst email . . . . . . . . . . . . . ERD diagram . . . . . . . . . . . . . . . Login . . . . . . . . . . . . . . . . . . . Profiel . . . . . . . . . . . . . . . . . . Openen en sluiten . . . . . . . . . . . . Route . . . . . . . . . . . . . . . . . . . KeyWi flowchart . . . . . . . . . . . . . Home screen . . . . . . . . . . . . . . . Home screen met KeyWi’s en gast codes KeyWi toevoegen . . . . . . . . . . . . KeyWi openen of sluiten . . . . . . . . . KeyWi info en aanpassen . . . . . . . . Geschiedenis van acties voor deze KeyWi Verzonden gast codes . . . . . . . . . .
v
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
1 2 2 5 6 8 9 12 13 15 17 18 20 21 22 23 25
Hoofdstuk
1
Situering 1.1
Virtual Ignition
Virtual Ignition is de naam van de bvba van Maarten Kooiman en Stijn Hooft. Het bedrijf heeft twee producten: Tapazz en KeyWi. Tapazz is een startup en een deel van de startit@kbc actie waarbij KBC nieuwe bedrijven een interessante groeiomgeving geeft. Dit betekent dat KBC een werkruimte verschaft te Antwerpen in de Boerentoren (Schoenmarkt 35) waar verschillende startups in dezelfde ruimte hun werk kunnen doen.
Figuur 1.1: KBC logo
1.2
Tapazz
Het eerste deel van mijn stage bestaat erin bij het bedrijf Tapazz (1.1) gaan meewerken aan een lopend project. Tapazz biedt een online platform aan waar je gemakkelijk je auto kan delen met andere mensen. Op deze manier werken ze aan een duurzame mobiliteit en samenleving. Het project waar ik aan mee zal werken is het automatiseren van het systeem van het huren van de auto: wanneer de huurder met zijn smartphone binnen een bepaalde radius van de verhuurde auto komt zal de auto automatisch opengaan door de hardware die aangesloten is op het slot van de auto. Ik en meneer Kooiman hebben er samen voor gekozen dat ik zowel
1
HOOFDSTUK 1. SITUERING
2
aan software- en hardware ontwikkeling zal meehelpen, wat natuurlijk mogelijk is door mijn opleiding die gefocust is op elektronica en ICT. Er is dus reeds een webservice aanwezig waarmee men de backend kan aanspreken die verbonden is met de database. In deze database zijn gebruikers, auto’s, boekingen en conversaties tussen gebruikers opgeslagen.
Figuur 1.2: Tapazz logo
1.3
KeyWi
Het tweede deel van mijn stage bestaat erin dat ik een backend en applicatie moet maken voor het product met de naam KeyWi (1.2) De applicatie heeft dezelfde functionaliteit als de Keyless Lock van Tapazz, maar wordt gebruikt als alleenstaand product. Dit houdt in dat de applicatie de KeyWi (de hardware) moet kunnen aanspreken en er voor kan zorgen dat een slot open gaat. Het doel van deze applicatie is het elimineren van de fysieke sleutelbos. Het grootste verschil met de applicatie van Tapazz is natuurlijk dat de KeyWi op eender welk elektronisch slot aangesloten kan worden en er dus in de webservice, backend en database geen ˜ n: sprake meer is van auto’s en boekingen. Er komen in de plaats twee nieuwe categorieA toestellen die de KeyWi’s voorstelt en gast codes die een functie toevoegt waarmee de eigenaar van een KeyWi toegang kan geven aan een vriend, familielid of personeel voor een bepaalde periode die hij zelf kan bepalen. Men kan de KeyWi hardware aankopen op de site http://getkeywi.com/.
Figuur 1.3: KeyWi logo
HOOFDSTUK 1. SITUERING
1.4
3
Collega’s
Ik werk vooral samen met Maarten Kooiman. Hij leidt de projecten die ik moet uitwerken en plant dus uit hoe en wanneer ik best welk taak doe. De technische begeleiding laat hij echter over aan Stijn Hooft die de webservice, backend en site van Tapazz heeft gemaakt. Stijn heeft mij al enorm geholpen met het maken van de webservice en backend van KeyWi. Daarnaast is er ook Olivier De Niel, ook een student (grafisch ontwerp op AP) die de design voor de KeyWi applicatie heeft gemaakt. En ten slotte is er nog Hans Robeers, die ik zelf nooit ontmoet heb maar die de hardware voor de Keyless Lock en KeyWi heeft gemaakt. Ik dus veel in contact gekomen met zijn werk.
Hoofdstuk
2
Bespreking access management applications 2.1 2.1.1
Webservice, backend en database Webservice
De webservice en backend zijn geschreven in PHP [4] en ontwikkeld in NetBeans. Dit is een ideaal platform om tijdens het ontwikkelen meteen te kunnen testen omdat de code die men opslaat meteen naar een lokale server wordt gepusht. Deze lokale Apache server wordt verzorgd door XAMPP. De webservice structuur is in als bijlage toegevoegd. De versie voor Tapazz is gemaakt door Stijn Hooft en zal dus niet in mijn bespreking verwerkt worden en ook niet als bijlage toegevoegd worden. De webservice van KeyWi en de documentatie hierover, heb ik echter zelf geschreven en is hieronder als bijlage te vinden. Er zijn echter enkele functies weggelaten om veiligheids- en copyright redenen. De webservice wordt opgedeeld in POST en GET functies. POST voor data te schrijven naar de database en GET om data op te halen uit de database. Hiervoor wordt Slim (http: //www.slimframework.com/) als framework gebruikt. Er worden voor de POST functies extra checks uitgevoerd die de ingegeven waarden nakijken. Degene die overal gebeurt is natuurlijk of de waarden niet leeg zijn en voor de rest wordt er gecheckt of de ingegeven waarden de juiste lengte en/of formaat hebben. Wat er teruggestuurd wordt is bijna altijd in JSON geformatteerd (enkel de tijd van de server wordt in normale tekst doorgestuurd).
4
HOOFDSTUK 2. BESPREKING
2.1.2
5
Backend
De backend is opgedeeld in vier onderdelen: De service bevat enkel business logica en mag dus geen databanklogica bevatten. Hier gebeuren enkel taken die niets met de databank te maken hebben zoals het hashen van wachtwoorden en het sturen van emails. De data access layer wordt van hieruit aangesproken en krijgt de argumenten mee die nodig zijn. De data access layer voert queries uit op de database. Er kan nieuwe data naar de database gestuurd worden of er de database kan uitgelezen worden. De databank-rijen de worden teruggegeven worden omgezet in domein objecten met een assembler. De domeinen stellen de verschillende kolommen uit de database voor als objecten. De assemblers kunnen de rijen (arrays) uit de database vertalen naar een domein object, en een domein object vertalen naar een array die gecodeerd kan worden naar JSON.
Voor elke kolom in de database is er een categorie in de elk van deze vier onderdelen. Er is dus nog een speciale service: de email service. Hiervoor wordt de Mandrill (http:// mandrill.com/) email delivery service gebruikt. Deze keuze hebben we gemaakt omdat het een gratis API heeft die de mogelijkheid geeft om verschillende templates te maken voor elk type email dat moet verzonden worden. De documentatie voor Mandrill [2] was zeer goed geschreven en maakte het dus makkelijk om toe te passen. Hieronder staat als voorbeeld de mail (2.1) die een nieuwe gebruiker aankrijgt wanneer hij succesvol geregistreerd is.
Figuur 2.1: Welkomst email
HOOFDSTUK 2. BESPREKING
2.1.3
6
Database
De SQL database is ook via XAMPP in phpMyAdmin ontworpen. De Entity Relationship Diagram (ERD) (2.2) hieronder toont de structuur van de database.
Figuur 2.2: ERD diagram Bepaalde delen van de ERD zijn weggelaten of gecensureerd om veiligheids- en copyright redenen. De kolom ’devices’ bevat de parameters die de KeyWi beschrijven. ’DeviceId’ is de primaire sleutel en ’UserId’ is de refererende sleutel wat de link legt naar de eigenaar van de KeyWi. Het speciale aan deze kolom is dat de KeyWi’s toegevoegd worden aan de database door personeel van KeyWi wanneer ze besteld worden (de ’DeviceNumber’, ’SecurityNumber’, ’DeviceType’ en ’OrderStatus’ worden dan ingegeven). Later wanneer de gebruiker zijn KeyWi wil toevoegen aan zijn account wordt ’UserId’ veranderd naar zijn UserId. Dit betekent dus dat wanneer ’UserId’ 0 is de KeyWi van niemand is. Als een gebruiker een KeyWi wil toevoegen aan zijn account moet hij een ’DeviceNumber’ (op de KeyWi) en een ’SecurityNumber’ (in een email) ingeven en dan kan hij een ’DeviceName’ en ’DeviceDescription’ kiezen. ’Unlocked’ en ’UnlockedSpecial’ geven aan of het (speciale) slot open of toe is.
HOOFDSTUK 2. BESPREKING
7
De kolom ’devicelogs’ wordt gebruikt om elke keer dat een KeyWi geopend of gesloten wordt op te slaan wie, wanneer en waar dit deed. ’DeviceLogId’ is de primaire sleutel en ’DeviceId’ is de refererende sleutel wat de KeyWi aangeeft waarvoor de actie gebeurd is. De kolom ’guestcode’ bevat de data die een gast code voorstelt. Men kan een andere gebruiker toegang tot een KeyWi geven voor een bepaalde periode. ’GuestCodeId’ is de primaire sleutel, ’DeviceId’ is de eerste refererende sleutel die aangeeft voor welke KeyWi de gast code geldig is en ’UserId’ is de tweede refererende sleutel die aangeeft voor wie de gast code bedoeld is. De kolom ’user’ bevat alle gebruikers die een account gemaakt hebben. De primaire sleutel is ’UserId’. De ’ResetCode’ is voor mensen die hun wachtwoord vergeten zijn met ’CodeRequestDate’ dat de datum van de aanvraag bevat. Dit is nodig omdat de ’ResetCodes’ verwijderd worden na 20 minuten om veiligheidsredenen.
2.1.4
Testen
Nog een belangrijk onderdeel van de backend dat hiervoor nog niet besproken is, zijn de testen die voor alle methodes in de webservice, service, domein en data access layer geschreven zijn. Er wordt in deze testen gecheckt of de waardes die er normaal zouden moeten komen uit een query inderdaad echt bekomen worden. Dat betekent dus ook dat wanneer er zich een exception voordoet dat dit opgevangen wordt. De waardes in de database moeten om alle testen die de database aanspreken natuurlijk vaste waardes zijn zodat de resultaten vergeleken kunnen worden met de op voorhand vastgestelde waardes in de testen. Dit gebeurt doordat de database elke keer voor een test uitgevoerd wordt dezelfde update krijgt, waardoor alle waardes in de database gereset worden. Voor de testen van de data access layer wordt de taak die moet gebeuren echt uitgevoerd: er wordt iets geschreven naar of gelezen uit de database en het resultaat wordt vergeleken met de verwachte data. Voor de testen van de service wordt een mock data access object aangemaakt dat een dummy is dat geen echte taak uitvoert maar gewoon checkt of de return type overeenkomt met wat er verwacht wordt. Zo wordt dus enkel de functionaliteit getest van de service zelf en niet van de service en de data access layer. Voor de testen van de webservice wordt de url van de webservice aangesproken die men wil testen. De meegegeven waardes moeten bij een GET functie gewoon mee in de URL meegegeven worden, maar voor een POST functie moeten de waardes als parameters meegegeven worden. De bekomen JSON string die men terugkrijgt na het uitvoeren van de functie wordt vergeleken met wat er zou moeten uitkomen. Dit houdt dus in dat eigenlijk de volledige flow van het proces wordt getest door deze ene test. Het is dan uiteraard belangrijk dat deze testen extensief alle mogelijke checks en acties die op elk niveau gebeuren testen.
HOOFDSTUK 2. BESPREKING
2.2
8
Applicaties
Beide applicaties zijn native Android [1] applicaties, wat betekent dat ze geschreven zijn in Java [3]. Ik heb ze ontwikkeld in Android Studio, de zeer succesvolle opvolger van Eclipse op vlak van Android Java applicaties. Dit was de eerste keer dat ik deze taal en dit platform ooit had gebruikt, maar ik heb ondervonden dat het na even inwerken zeer vlot werken is. De basis van de beide applicaties, Tapazz en KeyWi, is natuurlijk de gebruikerskant: men moet zich kunnen aanmelden, maar vanaf dat de gebruiker aangemeld is verschillen de applicaties.
2.2.1
Tapazz
Op de account pagina (2.3) van de aangemelde gebruiker kan men kiezen tussen verschillende functionaliteiten. Men kan een lijst van je eigen auto’s bekijken, je boekingen die op dat moment lopen, je profiel en je inbox. Er is ook een apart icoon om je af te melden.
Figuur 2.3: Login
HOOFDSTUK 2. BESPREKING
9
Op de profiel pagina (2.4) kan men zijn eigen profiel bekijken met bovenaan alle persoonsinformatie en daaronder een profielfoto.
Figuur 2.4: Profiel In de inbox (2.5a) vindt men een lijst van alle laatste berichten van een briefwisseling met een andere gebruiker. Als men op het bericht klikt dan krijgt men de volledige conversatie (2.5b) te zien of als men op de reply knop klikt dan kan men vanuit de applicatie een bericht sturen (2.5b) naar de zender van het bericht.
HOOFDSTUK 2. BESPREKING
10
(a) Inbox
(b) Briefwisseling
(c) Antwoord sturen
HOOFDSTUK 2. BESPREKING
(a) Auto’s
11
(b) Specifieke auto
Als je naar je auto’s (2.6a) gaat krijg je dus een lijst van de auto’s waar je op kan klikken. Voor de auto die je selecteerd krijg je in het volgende scherm (2.6b) twee opties: je kan de hoofdfunctie van de applicatie gebruiken, namelijk de Keyless Lock aanspreken om je auto te openen of je kan de locatie van de auto opzoeken in Google maps. Het scherm met alle boekingen van de gebruiker toont welke auto geboekt is voor een bepaalde periode. Enkel als de tijd op onze server overeenkomt met een tijd binnen deze periode kan de auto geselecteerd worden. Wanneer de periode verlopen is zal de boeking verwijdert worden uit de database en dus ook uit de lijst. Wanneer men een van de boekingen selecteert krijgt men hetzelfde scherm als bij je eigen geslecteerde auto.
HOOFDSTUK 2. BESPREKING
12
Keyless Lock Wanneer men naar de pagina (2.7) gaat van de Keyless Lock begint de smartphone automatisch te zoeken naar Bluetooth toestellen in de buurt. Als het juiste toestel in de buurt is, wat bepaald wordt door het MAC-adres van de Keyless Lock, begint de smartphone te connecteren. Als dit de eerste keer is dat de connectie moet gebeuren zal er eerst een pairing request gestuurd worden, maar dit wordt zonder dat de gebruiker het merkt verwerkt in de achtergrond. Er gebeurt dan een verificatie. Wanneer er verbinding is kan de gebruiker door op het slot icoon te klikken de auto openen en sluiten.
Figuur 2.7: Openen en sluiten Ik heb voor de Bluetooth connectie de code van een open source applicatie gebruikt omdat na twee weken dezelfde onoplosbare bug te hebben dit een veel vlottere oplossing was. De applicatie was een Bluetooth terminal. De broncode is op GitHub (https://github.com/ Sash0k/bluetooth-spp-terminal) te vinden en de applicatie zelf in de Google Play Store (https://play.google.com/store/apps/details?id=ru.sash0k.bluetooth terminal). De code is onder een Apache 2.0 licentie uitgegeven en mag dus voor commerci¨ele doeleinden gebruikt worden.
HOOFDSTUK 2. BESPREKING
13
Locatie Wanneer men op de locatie knop klikt dan gaat men naar een nieuwe pagina (2.8) die een Google Map laat zien met de huidige locatie als startpunt en de locatie van de auto (uit de database) als eindpunt. Men kan dan kiezen wat de snelste weg is naar de auto. Voor de weg naar de locatie heb ik de GPS module van het mobile device moeten aanspreken om de huidige locatie van de gebruiker te gebruiken. Ik gebruik daarnaast een open source bibliotheek die te vinden is op Github (https://github.com/jd-alexander/Google-Directions-Android), omdat Android toestellen jammer genoeg geen Google Directions ondersteunen. Waar deze library voor zorgt is dat er een polyline op de map verschijnt die de snelste weg naar de auto toont.
Figuur 2.8: Route
HOOFDSTUK 2. BESPREKING
14
Boekingen Wanneer de boeking is afgelopen krijgt men op het account scherm een melding in het rood bovenaan het scherm dat deze melding geeft. Men kan dan voorlopig niets anders doen dan eerst naar de pagina te gaan om je aantal kilometers in te vullen. Men krijgt op deze pagina automatisch hoeveel het vorige aantal kilometers was en dan moet men het huidige aantal kilometers en de datum invullen. Men kan vervolgens ook een rating geven van hoe de boeking je bevallen is en men kan optioneel ook een bericht sturen naar de eigenaar van de auto. Besluit Aan deze applicatie ben ik 4 weken bezig geweest aan het begin van mijn stage. Daardoor heb ik gemerkt dat er nog veel verbeterd zou kunnen worden met de nieuwe kennis die ik heb opgedaan bij het maken van de KeyWi applicatie. Voor mijn stage hebben we er echter voor gekozen de focus meer te leggen op de KeyWi applicatie en de KeyWi backend.
HOOFDSTUK 2. BESPREKING
2.2.2
15
KeyWi
De KeyWi applicatie moet als functionaliteit hetzelfde kunnen als de Tapazz applicatie, maar anders dan bij de Tapazz heb ik voor KeyWi de volledige mogelijkheden om een account te maken en beheren in de applicatie moeten steken, omdat er voor KeyWi voorlopig enkel de applicatie is en er voor Tapazz al een site bestaat, waar men deze dingen kan doen. De volledige functionaliteit en de flow van de applicatie is hieronder afgebeeld in een flowchart ()2.9).
Figuur 2.9: KeyWi flowchart Wanneer de gebruiker de applicatie van de Google Play Store (https://play.google.com/store/ apps/details?id=com.keywi.keywi) heeft gedownload en ge¨ınstalleerd, hij eerst een account zal moeten cre¨eren. Het eerste scherm dat de gebruiker ziet is het login scherm (2.10a), met daaronder de knoppen om te registeren of om een vergeten wachtwoord te vervangen. In het registratieformulier (2.10b) moet de gebruiker zijn email adres ingeven, wat ook fungeert als zijn gebruikersnaam. Daarnaast moet hij zijn voor- en achternaam ingeven. Als laatste moet natuurlijk ook een wachtwoord gekozen worden, dat niet korter is dan 8 tekens en niet langer dan 20. Voor de zekerheid is er ook het veld waar de gebruiker een tweede keer zijn wachtwoord moet ingeven als confirmatie. De gebruiker wordt dan vanaf dat beide velden ingevuld zijn op de hoogte gesteld of de wachtwoorden overeenkomen. De pagina waar de gebruiker kan melden dat hij zijn wachtwoord vergeten is (2.11a) bestaat slechts uit ´e´en veld: het email adres van de gebruiker. Wanneer hij zijn email adres ingeeft en het ook degelijk bestaat in onze database, zal er een email verstuurd worden met een reset code. De applicatie zal dan naar het volgende scherm (2.11b) gaan waar de gebruiker de hierboven vermelde code kan ingeven en een nieuw wachtwoord kan kiezen, waar natuurlijk dezelfde voorwaarden van toepassing op zijn, als bij het registeren.
HOOFDSTUK 2. BESPREKING
16
(a) Login
(b) Registreer
(a) Wachtwoord vergeten
(b) Kies nieuw wachtwoord
HOOFDSTUK 2. BESPREKING
17
Eens de gebruiker ingelogd is dan krijgt hij een scherm (2.12) te zien met drie opties: Een nieuwe KeyWi toevoegen, wat natuurlijk enkel zal gaan wanneer de gebruiker reeds in het bezit is van de hardware. Een nieuwe gast code toevoegen, wat de mogelijkheid geeft om een KeyWi van een andere gebruiken te openen en sluiten. Een ’shop’ icoontje dat verwijst naar de site waar men alsnog een KeyWi kan aankopen als dit nog niet gebeurt was.
Dit scherm komt enkel tevoorschijn wanneer er nog geen enkele KeyWi of gast code is toegevoegd aan de ingelogde user zijn account.
Figuur 2.12: Home screen
HOOFDSTUK 2. BESPREKING
18
Wanneer er dus ´e´en van deze twee wel al aan de account is toegevoegd zal de gebruiker een ander scherm (2.13) zien dat bestaat uit twee lijsten: Bovenaan staat de lijst met alle KeyWi’s die de gebruiker bezit, met onderaan de lijst een knop om nog nieuwe toe te voegen. De items in deze lijst bestaan slechts uit twee elementen. Een icoon, dat voorstelt welk type KeyWi het is en de naam van de KeyWi. Het icoon heeft een witte achtergrond wat aanduid dat het om een eigen bezeten KeyWi gaat en een groen pictogram, welke dus het type uitbeeld. Onderaan staat de lijst met de gast codes die door andere gebruikers naar de huidig ingelogde gebruiker gestuurd zijn. Als de periode waarin de gebruiker toegang heeft nog niet begonnen is dan staat er rechts in het item hoeveel seconden, minuten of dagen het nog duurt eer hij de KeyWi zal kunnen gebruiken. Wanneer de periode begonnen is staat er hoeveel seconden, minuten of dagen er nog resteren. Zoals bij de lijst met KeyWi’s is er ook een icoon, maar de achtergrond is groen om aan te duiden dat het een gast code is en het witte pictogram toont weer welk type de KeyWi is. Naast de naam van de KeyWi staat bij elke gast code nu ook de naam van de eigenaar.
Figuur 2.13: Home screen met KeyWi’s en gast codes
HOOFDSTUK 2. BESPREKING
(a) Profiel
19
(b) Profielfoto
Wanneer de gebruiker op de knop om het menu te openen klikt dan krijgt hij de optie om zich af te melden. Rechts bovenaan staat een wit icoon dat verwijst naar de profielpagina (2.14a). Hier kan de gebruiker zijn persoonsgegevens aanpassen. De huidige waardes zijn reeds ingevuld. De velden die men kan aanpassen zijn email, voornaam, achternaam en wachtwoord, net zoals bij de registratie mogelijk is. Een extra functionaliteit hier is de mogelijkheid om een profielfoto toe te voegen. Wanneer men op het icoon klikt bovenaan de pagina dan komt men op nog een andere pagina (2.14b). Daar staat centraal de reeds gekozen profielfoto of een generiek icoon. Hier krijgt de gebruiker de keuze om zijn camera te openen of in zijn smartphone te gaan zoeken voor een reeds genomen foto. Wanneer de gebruiker tevreden is met zijn foto kan hij deze uploaden naar de server. Op het scherm om een nieuwe KeyWi toe te voegen aan je account (2.15) staan, zoals al eerder vermeld in het deel over de database, twee velden waar men het MAC adres van de KeyWi en een veiligheidsnummer toegezonden naar de gebruiker bij de aankoop van de KeyWi moet ingeven. Er wordt dan gecheckt of dit toestel wel bestaat en/of nog niemand anders de eigenaar is van dit toestel. Als het mogelijk is dit toestel toe te voegen dan krijgt de gebruiker drie nieuwe velden te zien om zijn KeyWi te personaliseren. De gebruiker krijgt de opties om een type te kiezen uit een lijst van verschillende mogelijkheden voor wat voor een slot de KeyWi gebruikt zal worden: voor een auto, een huis, een locker of een algemene keuze als er nog een
HOOFDSTUK 2. BESPREKING
20
ander type slot gebruikt zou worden. De gebruiker kan ook een eigen gepersonaliseerde naam te kiezen voor zijn KeyWi en een beschrijving die de gasten die een gast code zouden toegestuurd krijgen, kunnen lezen. De beschrijving is wel optioneel omdat het niet absoluut nodig achten. Als men de KeyWi heeft toegevoegd dan komt men terug op de hoofd pagina en verschijnt de nieuw toegevoegde KeyWi in de lijst op de manier hierboven vermeld.
Figuur 2.15: KeyWi toevoegen Op het scherm waar de gebruiker zijn ontvangen gast codes kan ingeven vindt men maar ´e´en veld, namelijk hetgene waar de code moet ingevuld worden. Deze veiligheid is ingebouwd zodat de ontvangende gebruiker nog kan selecteren welke gast codes hij wil aannemen. Als men de gast code heeft toegevoegd dan komt men terug op de hoofd pagina en verschijnt de gast code in de onderste lijst zoals hierboven vermeld.
HOOFDSTUK 2. BESPREKING
21
Als eigenaar
Figuur 2.16: KeyWi openen of sluiten Als men in de lijst op de hoofdpagina ´e´en van zijn eigen KeyWi’s selecteert dan gaat men naar het scherm van de KeyWi zelf (2.16). Op dit punt zal de applicatie automatisch proberen te connecteren met de KeyWi op dezelfde manier als in de Tapazz applicatie (zie hierboven). Als men geconnecteerd is dan kan men met de knoppen ’UNLOCK’ en ’LOCK’ een signaal sturen naar de KeyWi dat het elektronische slot waar het aanhangt opent of sluit. In het menu van deze pagina staan naast het uitloggen 4 verschillende functies die extra functionaliteit bevatten: Opties (2.17): dit item stuurt je naar een pagina waar je de eigenschappen van een KeyWi kan veranderen: het type, de naam en de beschrijving. De oude waardes die eerder ingesteld zijn bij het aanmaken van de KeyWi staan ingevuld in de velden. Zo heeft deze pagina de dubbele functie van de ingestelde informatie weergeven en tegelijkertijd de mogelijkheid om deze aan te passen. De laatste andere mogelijkheid is het verwijderen van de KeyWi van deze account. Dit maakt het mogelijk de KeyWi bij een andere account toe te voegen. Men moet wel als extra veiligheid zijn wachtwoord ingeven als men zijn KeyWi wil verwijderen.
HOOFDSTUK 2. BESPREKING
22
Figuur 2.17: KeyWi info en aanpassen Geschiedenis van alle acties (2.18): dit is een pagina met een lijst van alle acties die voor deze KeyWi ondernomen zijn. Dat betekent dat dus elke keer dat de gebruiker of ´e´en van de gebruikers die een gast code hebben gekregen voor deze KeyWi de ’UNLOCK’ of ’LOCK’ acties hebben aangesproken gedocumenteerd staat in een lijst. Elke item heeft links de profielfoto van de gebruiker die de actie heeft uitgevoerd en zijn naam. Daarnaast staat de datum en tijd dat de actie is uitgevoerd en helemaal rechts staat de uitgevoerde actie. Ook de locatie van elke actie is opgeslagen. Men kan deze bekijken als men op de log entry klikt, want dan opent een Google Map met een marker op de positie waar de actie gebeurd is.
HOOFDSTUK 2. BESPREKING
23
Figuur 2.18: Geschiedenis van acties voor deze KeyWi Zenden van een gast code voor deze KeyWi (2.19a en 2.19b): de eigenaar van een KeyWi kan naar eender wie een gast code zenden. Alles wat hij nodig heeft is hun email adres (ze moeten dus nog geen geregistreerd lid zijn van KeyWi). Op de pagina om een gast code te verzenden moet de gebruiker dus eerst de email van de gast invullen en vervolgens kan hij de begin en eind datum en tijd aanduiden op een kalender en klok. De data zijn automatisch ingesteld om de huidige tijd te tonen. De gast code mag niet in het verleden gepland worden, maar er is een marge van 15 minuten zodat alles rustig ingevuld kan worden. De einddatum mag natuurlijk ook niet voor de startdatum vallen. Ten slotte kan er optioneel nog een boodschap meegezonden worden naar de ontvanger van de gast code.
HOOFDSTUK 2. BESPREKING
(a) Gast code zenden
24
(b) Gast code zenden
Lijst met alle gast codes die voor deze KeyWi verzonden zijn (2.20): elk item in deze lijst geeft aan naar welke gast codes, die nog niet vervallen zijn, verzonden zijn. Links staat de profielfoto van de ontvanger met daarnaast zijn naam (of het email adres als de gebruiker nog geen account heeft aangemaakt). Rechts staat de periode van wanneer tot wanneer de gast code geldig zal zijn of is. Nog meer rechts staat een kruis, wat betekent dat als men op ´e´en van de items klikt dit zal verwijderd worden. Wat dus betekent dat de gast code verwijdert wordt en de gast geen toegang meer zal hebben tot je KeyWi.
HOOFDSTUK 2. BESPREKING
25
Figuur 2.20: Verzonden gast codes Rechts bovenaan de hoofdpagina staat ten slotte een map icoon. Als men hierop klikt gaat de GPS aan en wordt de laatst geweten co¨ordinaten van de KeyWi uit de database gehaald. Met deze informatie wordt een Google Map geopend die de verschillende mogelijke wegen laat zien die de gebruiker zou kunnen nemen naar de locatie waar de KeyWi is. Hier is een verschillende methode gebruikt dan voor Tapazz gebruikt is, omdat na lang zoeken deze manier de gebruikers meer dan ´e´en mogelijke route aanbood. Als gast Als men zelf geen KeyWi bezit maar een vriend je een gast code heeft gestuurd dan kan men door op ´e´en van je ontvangen gast codes te klikken de pagina openen die er hetzelfde uitziet als degene als je hem zelf bezit. Het verschil zit er in dat er in het menu enkel de uitlog functie staat. Men heeft als gast dus maar een beperkte mogelijkheid tot acties: het openen en sluiten van de KeyWi en de locatie van de KeyWi, wat zeker voor gasten handig van pas kan komen. Als men een nieuwe gast code toevoegt dan moet men dus een account hebben die als email adres hetzelfde gebruikt dat ook de gast code heeft ontvangen. Als men de code uit de email ingeeft dan kan voegt men de gast code toe aan de account, zoals hierboven al besproken.
HOOFDSTUK 2. BESPREKING
2.2.3
26
Design van de KeyWi applicatie
De design van alle pagina’s die te zien is op de screenshots hierboven is ontworpen door Olivier de Niel, een student Grafisch ontwerp op de AP hogeschool. Hij koos deze design gekozen op basis van een moodboard, waarvoor onderzoek is gedaan naar de concurrentie en andere bestaande applicaties. De kleuren in de applicatie is hij gaan zoeken in de kleurenpsychologie: de groene kleur geeft de applicatie een ecologische, welgestelde en natuurlijke feel. De donkere kleuren in het algemeen geven de applicatie een serieus karakter wat hij belangrijk achtte om de gebruikers gerust te stellen dat het gebruiken van de applicatie volledig veilig is. De kleurenanalyse en andere vormgeving heeft Olivier zelf gedaan, maar natuurlijk met inspraak van Maarten Kooiman en mijzelf, omdat ik soms aanpassingen moest aanbrengen omdat de functionaliteit anders zou lijden onder het design.
2.3
Hardware
De hardware, dus de Keyless Lock of de KeyWi, was al op voorhand grotendeels af en ik moest dus gewoon de met Bluetooth connecteren en de commando’s sturen om het elektronische slot te openen en te sluiten. Om te testen was de mogelijkheid om een slot te openen tijdelijk vervangen door het aansturen van enkele LED’s die dan weergaven welke commando gestuurd was. Bijvoorbeeld openen deed een groene LED branden en sluiten een rode.
2.4
User tests
De laatste week van mijn stage hebben Maarten Kooiman, Olivier de Niel en ik user tests gedaan met vijf verschillende gebruikers. Er was redelijk veel constructieve kritiek maar steeds op dezelfde punten. Dit betekent dus dat de user test op zich geslaagd is, maar dat er aan de applicatie nog enkele zaken verbeterd moeten worden. De grootste problemen en hun oplossingen zijn hieronder opgesomd: Er zijn drie verschillende schermen die iets te maken hebben met gast codes en dat bracht elk van onze testers in de war. Het scherm om gast codes die naar de ingelogde gebruiker zijn gezonden werd soms verward met het scherm om een gast code te verzenden. Onze oplossing hiervoor is een duidelijkere interface cre¨eren die bijvoorbeeld met een verklarende tekstlabel werkt. De twee schermen om een gast code te zenden en om alle verzonden gast codes te bekijken gaan we ook anders moeten ordenen en benoemen. We zullen ze
HOOFDSTUK 2. BESPREKING
27
waarschijnlijk onder ´e´en knop steken die dan vervolgens een duidelijkere keuze bied aan de gebruiker. Op de home pagina was het nut van twee verschillende knoppen om ’iets’ toe te voegen niet duildeijk. Ze moeten in ´e´en knop gebundeld worden en dan pas de optie geven om een KeyWi of een gast code toe te voegen. De layout van verschillende schermen was niet ideaal voor op kleinere schermen. Op het scherm om een KeyWi toe te voegen valt bijvoorbeeld de helft van de layout weg door het soft keyboard dat de onderkant van het scherm inneemt. Dit verwarde sommige testers omdat ze niet door hadden dat de pagina nog verder naar beneden doorging. Dit kan opgelost worden met een functie die ervoor zorgt dat de pagina automatisch scrollt nadat het laatste zichtbare veld is ingevuld. Het belangrijkste dat we gemerkt hebben dat onduidelijk was, is dat de gebruikers het menu dat nog extra functionaliteit bevat niet vonden. Dit is deels doordat de oudere versies van Android op oudere smartphones nog een hardware knop hebben om het menu te openen. De testers kenden dit systeem niet omdat dit in nieuwere versies van Android opgelost is doordat er een duidelijk visuele menu knop op het scherm staat. In mijn applicatie was er dus geen visuele indicatie dat er nog een menu bestond met extra functionaliteit. We zullen dus voor oudere versies van Android nog een knop in de layout moeten plaatsen die dezelfde functie heeft als de menu knop.
Hoofdstuk
3
Resultaten De applicaties zijn allebei zeer goed geslaagd en bekomen zo effici¨ent mogelijk de gewenste functies. Voor Tapazz is de applicatie zeker een mooie aanwinst. De mogelijkheid om je auto te kunnen openen is op het moment nog uniek en kan dus zeker zorgen voor een grotere klantenbasis en bied voor de huidige klanten een extra snufje. Voor KeyWi is de betekenis van de applicatie en de backend nog veel groter omdat dit de basis is van het product. Het is de start van iets nieuws en de impact op de technologische markt mag zeker niet onderschat worden. De user tests hebben echter nog enkele punten die verbeterd moeten worden aan het licht gebracht. In de vakantie zal ik als studentenjob dan ook verder werken aan de applicaties om ze te verbeteren en optimaliseren.
28
Hoofdstuk
4
Besluit De applicaties spreken draadloos de hardware aan en kunnen zo een elektronisch slot openen, wat het belangrijkste doel was van dit project. Doordat hierrond nog de nodige gebruikersinteractie en nuttige functies, zoals de route naar de hardware, zijn gebouwd is het uiteindelijke resultaat zoals het beoogd was. De Tapazz applicatie zal als extra steun voor de leden van de Tapazz car sharing service gebruikt worden. De KeyWi applicatie is op zich de basis van het nieuwe product en zal dus onmisbaar zijn in de toekomst van dit product. Ik ben er van overtuigd dat het algemene doel van een stage om iets bij te leren zeer goed bereikt is met alle ervaring die ik heb opgedaan. Ook al was het begin wat traag is mijn leercurve sterk gestegen doorheen de weken en leer ik nu nog steeds elke dag nieuwe dingen.
29
Bijlage
A
Webservice van KeyWi The webservice for the KeyWi application(s) (and website) is documented below. webservice, backend and database are all present on the OpenShift server.
The
All queries presented to the webservice have to contain the user ID of the logged in user and a valid session key provided to the user when he logs in. This of course means that for queries when the user is not yet logged in this is not the case. If the wrong session key is entered there will be a JSON reply notifying the user that he is not authorized: {”Error”:{”Code”:100,”Message”:”User not authorized”}}
A.1 A.1.1
GET /
Description Returns a standard text: ”Welcome to the webservice of KeyWi!”
A.1.2
/user/:userId/:requestingUserId/:sessionKey(/)
Description Returns the user with a specific user ID.
30
BIJLAGE A. WEBSERVICE VAN KEYWI
31
Results Success:
{”UserId”:”1”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePicture } Wrong user ID: {”Error”:{”Code”:100,”Message”:”User with this user ID not found”}}
A.1.3
/user/email/:email/:requestingUserId/:sessionKey(/)
Description Returns the user with a specific email address. Results Success:
{”UserId”:”1”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePicture } Wrong email: {”Error”:{”Code”:100,”Message”:”User with this email address not found”}}
A.1.4
/forgot/password/:email(/)
Description Returns the user with the email address. Results Success
{”UserId”:”1”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePicture } Wrong email address: {”Error”:{”Code”:200,”Message”:”No user with this email address found”}}
BIJLAGE A. WEBSERVICE VAN KEYWI
A.1.5
32
/device/:deviceId/:userId/:sessionKey(/)
Description Returns the device with a specific device ID. Results Success:
{”DeviceId”:”2”,”UserId”:”1”,”DeviceNumber”:”EE:EE:EE:EE:EE:EE”,”DeviceType”:”Car”,”DeviceName” Description ”:”Car key”,”Latitude”:”51.116924”,”Longitude”:”4.656442”,”Unlocked”:”0”,”UnlockedSpecial”:”0”} Wrong user ID: {”Error”:{”Code”:100,”Message”:”This KeyWi was not found”}}
A.1.6
/devices/:userId/:sessionKey(/)
Description Returns a list of devices that are owned by a specific user with this user’s user ID. Results Success:
[{”DeviceId”:”2”,”UserId”:”1”,”DeviceNumber”:”EE:EE:EE:EE:EE:EE”,”DeviceType”:”Car”,”DeviceName” Description
”:”Car key”,”Latitude”:”51.116924”,”Longitude”:”4.656442”,”Unlocked”:”0”,”UnlockedSpecial”:”0”},{”D
BIJLAGE A. WEBSERVICE VAN KEYWI
33
Description ”:”Door key”,”Latitude”:”51.116924”,”Longitude”:”4.656442”,”Unlocked”:”0”,”UnlockedSpecial”:”0”}] Wrong user ID or user doesn’t own any devices: {”Error”:{”Code”:100,”Message”:”No KeyWi was found”}}
A.1.7
/device/log/:deviceId/:userId/:sessionKey(/)
Description Returns the activity history for a specific device with the device’s device ID. Results Success:
[{”DeviceLogId”:”2”,”DeviceId”:”2”,”UserId”:”1”,”Action”:”Closed”,”Date”:”2014-03-13 12:00:00”,”Latitu 03-12 12:00:00”,”Latitude”:”51.116924”,”Longitude”:”4.656442”}] The requesting user (by user ID) is not the owner of the device: {”Error”:{”Code”:100,”Message”:”User not authorized”}} No logs exist for this device or the device doesn’t exist: {”Error”:{”Code”:100,”Message”:”No log found for this KeyWi”}}
A.1.8
/guestcodes/:userId/:sessionKey(/)
Description Returns the guest codes for a user. Results Success:
[{”GuestCodeId”:”5”,”DeviceId”:”3”,”DeviceOwner”:”1”,”UserId”:”2”,”GuestEmail”:”
[email protected]” 03-13 12:00:00”,”AccessEnd”:”2014-06-01 12:00:00”,”GuestMessage”:”Hello”}] Wrong user ID or user hasn’t received any guest codes:
BIJLAGE A. WEBSERVICE VAN KEYWI
34
{”Error”:{”Code”:100,”Message”:”No guest codes found”}}
A.1.9
/guestcodes/device/:deviceId/:userId/:sessionKey(/)
Description Returns the guest codes that were sent for a specific device. Results Success:
[{”GuestCodeId”:”1”,”DeviceId”:”2”,”DeviceOwner”:”2”,”UserId”:”1”,”GuestEmail”:”
[email protected]” 03-12 12:00:00”,”AccessEnd”:”2017-06-01 12:00:00”,”GuestMessage”:”Hello”},{”GuestCodeId”:”2”,”Devic 03-13 12:00:00”,”AccessEnd”:”2016-06-01 12:00:00”,”GuestMessage”:”Hello”}] No guest codes sent from this device: {”Error”:{”Code”:100,”Message”:”No guest codes found”}} Requesting user isn’t the owner of the device: {”Error”:{”Code”:100,”Message”:”User not authorized”}}
A.1.10
/time/:pattern(/)
Description Returns the current time in a pattern (e.g.: /time/Y-m-d%20H:i:s) Result 2005-04-12 18:46:21
A.2
POST
A.2.1
Note
Every POST function has a check to see if all of the required parameters are included in the request: {”Error”:{”Code”:100,”Message”:”Please fill in all required fields”}}
BIJLAGE A. WEBSERVICE VAN KEYWI
A.2.2
35
/register(/)
Description Registers a new user and also create a session key because the user is automatically logged in. Values email: the email address of the new user (also functions as the username) password: the user chooses a password for his account firstName: user’s first name lastName: user’s last name Results Success:
{”UserId”:”4”,”Email”:¨
[email protected]”,”FirstName”:”firstName”,”LastName”:”lastName”,”ProfilePictur User with this email address already exists: {”Error”:{”Code”:100,”Message”:”User with this email address already exists”}} Password length must be 8 characters or more: {”Error”:{”Code”:100,”Message”:”Password must be 8 characters or more”}} Password length must be 20 characters or less: {”Error”:{”Code”:100,”Message”:”Password must be 20 characters or less”}} Invalid email format: {”Error”:{”Code”:100,”Message”:”Invalid email”}}
A.2.3
/login(/)
Description Logs in the user with his email and password and returns a session key.
BIJLAGE A. WEBSERVICE VAN KEYWI
36
Values email: the email address of the new user (also functions as the username) password: the user chooses a password for his account Results Success:
{”UserId”:”1”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePicture ,”SessionKey”:”82e4t71aab384e8a76d13677e05b9575”} Wrong email or password: {”Error”:{”Code”:100,”Message”:”User with this email or password not found”}}
A.2.4
/logout(/)
Description Logs the user out, which means the current session key is invalidated. Values userId: the user ID of the logged in user sessionKey: the currently active session key associated with the logged in user Results Success: {”Message”:”Logged out”}
A.2.5
/user/forgot/password/reset(/)
Description The user can choose a new password with a reset code when he has forgotten his old one.
BIJLAGE A. WEBSERVICE VAN KEYWI
37
Values email: the email address of the user resetCode: the reset code a user receives in his email password: the new password the user has chosen Results Success:
{”UserId”:”2”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePictu } Wrong or expired reset code: {”Error”:{”Code”:200,”Message”:”This code is invalid or has expired”}} Password length must be 8 characters or more: {”Error”:{”Code”:100,”Message”:”Password must be 8 characters or more”}} Password length must be 20 characters or less: {”Error”:{”Code”:100,”Message”:”Password must be 20 characters or less”}}
A.2.6
/user/delete(/)
Description Deletes the account of a user, which means the user, his devices and their guest codes are deleted from the database. Values userId: the user ID of the logged in user password: the user has to enter his password for added security sessionKey: the currently active session key associated with the logged in user
BIJLAGE A. WEBSERVICE VAN KEYWI
38
Results Success: {”Message”:IJour account was successfully deleted”} Wrong password: {”Error”:{”Code”:100,”Message”:”Incorrect password”}}
A.2.7
/user/change/name(/)
Description Change a user’s first and/or last name Values userId: the user ID of the logged in user firsName: user’s new first name lastName: user’s new last name sessionKey: the currently active session key associated with the logged in user Results Success:
{”UserId”:”2”,”Email”:”
[email protected]”,”FirstName”:”William”,”LastName”:”Shakespeare”,”Profile }
A.2.8
/user/change/email(/)
Description Change a user’s email address
BIJLAGE A. WEBSERVICE VAN KEYWI
39
Values userId: the user ID of the logged in user email : the new email address password: the user has to enter his password for added security sessionKey: the currently active session key associated with the logged in user Results Success:
{”UserId”:”2”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePicture } Wrong password: {”Error”:{”Code”:100,”Message”:”Incorrect password”}} Invalid email format: {”Error”:{”Code”:100,”Message”:”Invalid email”}}
A.2.9
/user/change/password(/)
Description Change a user’s password Values userId: the user ID of the logged in user email: the user’s email address newPassword : the new password password: the user has to enter his password for added security sessionKey: the currently active session key associated with the logged in user
BIJLAGE A. WEBSERVICE VAN KEYWI
40
Results Success:
{”UserId”:”2”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePictu } Wrong password: {”Error”:{”Code”:100,”Message”:”Incorrect password”}} Chosen password is the same as the current password: {”Error”:{”Code”:100,”Message”:IJou must choose a different password”}} Password length must be 8 characters or more: {”Error”:{”Code”:100,”Message”:”Password must be 8 characters or more”}} Password length must be 20 characters or less: {”Error”:{”Code”:100,”Message”:”Password must be 20 characters or less”}}
A.2.10
/user/profile/picture(/)
Description Uploads the profile picture to the database. Values userId: the user ID of the logged in user profilePicture: the picture as a base64 encoded string sessionKey: the currently active session key associated with the logged in user Results Success:
{”UserId”:”1”,”Email”:”
[email protected]”,”FirstName”:”Francis”,”LastName”:”Didden”,”ProfilePicture abc”}
BIJLAGE A. WEBSERVICE VAN KEYWI
A.2.11
41
/device/edit(/)
Description Changes the device’s name, tpe and description. Values deviceName: a user chosen name for the device deviceType: a user chosen type for the device description (optional): a bit of text that describes the device and its use deviceId: the ID of the device where the changes have to be made userId: the user ID of the logged in user sessionKey: the currently active session key associated with the logged in user Results Success:
{”DeviceId”:”2”,”UserId”:”1”,”DeviceNumber”:”EE:EE:EE:EE:EE:EE”,”DeviceType”:”Car”,”DeviceName” The device doesn’t exist in our database: {”Error”:{”Code”:100,”Message”:”This KeyWi was not found”}}
A.2.12
/device/remove(/)
Description Removes the device from a user’s account (the userId and all user chosen data is set to null, because the device has to stay in the database) Values deviceId: the ID of the device which has to be removed password: the user has to enter his password for added security userId: the user ID of the logged in user
BIJLAGE A. WEBSERVICE VAN KEYWI
42
sessionKey: the currently active session key associated with the logged in user Results Success:
{”DeviceId”:”2”,”UserId”:null,”DeviceNumber”:”EE:EE:EE:EE:EE:EE”,”DeviceType”:”Car”,”DeviceName” The device doesn’t exist in our database: {”Error”:{”Code”:100,”Message”:”This KeyWi was not found”}} Wrong password: {”Error”:{”Code”:100,”Message”:”Incorrect password”}} User with this user ID doesn’t exist: {”Error”:{”Code”:100,”Message”:”User with this user ID not found”}} The device isn’t owned by the currently logged in user: {”Error”:{”Code”:100,”Message”:”User not authorized”}}
A.2.13
/guestcode/create(/)
Description The owner of a device can send guest codes to existing or unregistered users. Values deviceId: the ID of the device for which the guest code has to be created deviceOwner: the ID of the user that owns the device (the sender) guestEmail: the email of the user that will recipient the guest code accessStart: the date and time when the access to the device starts accessEnd: the date and time when the access to the ends guestMessage (optional): a message to the recipient of the guest code password: the user’s password must be entered for added security sessionKey: the currently active session key associated with the logged in user
BIJLAGE A. WEBSERVICE VAN KEYWI
43
Results Success:
{”GuestCodeId”:”6”,”DeviceId”:”2”,”DeviceOwner”:”1”,”UserId”:null,”GuestEmail”:”
[email protected]”, 03-13 20:00:00”,”AccessEnd”:”2016-06-01 20:00:00”,”GuestMessage”:”Message”} When a guest code with these exact parameters already exists: {”Error”:{”Code”:100,”Message”:”This guest code already exists”}} The user with this user ID doesn’t exist: {”Error”:{”Code”:100,”Message”:”User with this user ID not found”}} Wrong password: {”Error”:{”Code”:100,”Message”:”Incorrect password”}} Wrong guest email format: {”Error”:{”Code”:100,”Message”:”Invalid guest email”}} The date can’t be later than 2037 (https://en.wikipedia.org/wiki/Year 2038 problem) {”Error”:{”Code”:100,”Message”:”The date can´t be later than the year 2037”}} The end date can’t lie before the start date {”Error”:{”Code”:100,”Message”:”The end date can´t lie before the start date”}} The start date can’t lie more than 15 minutes in the past {”Error”:{”Code”:100,”Message”:”The start date can´t lie more than 15 minutes in the past”}}
A.2.14
/guestcode/add(/)
Description Adds the received guest code to your account. Values accessCode: the code received in an email which makes sure the guest code is for you guestEmail: the logged in user’s email address which will be compared to the guest email address userId: the user ID of the logged in user
BIJLAGE A. WEBSERVICE VAN KEYWI
44
sessionKey: the currently active session key associated with the logged in user Results Success:
{”GuestCodeId”:”3”,”DeviceId”:”3”,”DeviceOwner”:”1”,”UserId”:”2”,”GuestEmail”:”
[email protected]”,” 12-13 12:00:00”,”AccessEnd”:”2016-06-01 12:00:00”,”GuestMessage”:”Hello”} Wrong access code: {”Error”:{”Code”:100,”Message”:”Wrong access code”}}
A.2.15
/guestcode/delete(/)
Description The owner of a device can delete any of his sent guest codes. Values deviceOwner: the owner of the device/sender of the guest code/the currently logged in user guestCodeId: the ID of the guestcode to be deleted sessionKey: the currently active session key associated with the logged in user Results Success: {”Message”:”The guest key was successfully deleted”} Guest code not found in the database: {”Error”:{”Code”:100,”Message”:”Guest code not found”}} The device for this guest code is not owned by the logged in user {”Error”:{”Code”:100,”Message”:”User not authorized”}}
Bibliografie
[1] Android developers documentation. https://developer.android.com/index.html. 8 [2] Mandrill api documentation. https://mandrillapp.com/api/docs/. 5 [3] Oracle technology netword - java. http://www.oracle.com/technetwork/java/index.html. 8 [4] Php documentation. https://php.net/docs.php. 4
45