Open sesame!

In ons studentenhuis was het ieder jaar tijdens de introductie van de Radboud Universiteit weer een probleem: wie loopt er tijdens het uitgaan naar huis om de deur te openen voor logees die willen slapen? Met 10 introlopers is het op die manier érg lastig om ongestoord het einde van je meter bier te halen. Al jaren riepen we dat we de deur maar eens moesten automatiseren. Uiteindelijk kwam ik op de proppen met een vrij eenvoudig systeem om dit te realiseren. Velen vroegen mij daarna hoe ik dit precies heb aangepakt. Het leek me een leuk onderwerp voor mijn allereerste blog.

Wij hadden het geluk dat onze deur al een elektrisch slot had. Met een schakelaar in elke kamer konden we mensen binnenlaten, zonder in badjas de trap af te hoeven. Het leek een logische keuze om hier iets op aan te sluiten, dat via een signaal van een mobiele telefoon dezelfde schakelaar enkele seconden zou indrukken. Natuurlijk niet fysiek met een robotarm, maar door dezelfde draden met elkaar te verbinden.

Bij mijn opleiding had ik al eens gewerkt met een Arduino Uno. Dit was ook voor dit idee een prima uitgangspunt. Om dit apparaatje met internet te verbinden, gebruikte ik een EthernetShield. Daarnaast was er nog iets nodig om de draden te schakelen; een relaismodule.

Naast de hardware, moest ook de nodige software geprogrammeerd worden. Ik ga hier nu niet al te diep op in, maar ik zal mijn best doen om het idee te omschrijven. Een Arduino is veel te zwak om een versleutelde verbinding op te zetten zoals bijvoorbeeld banken gebruiken. Daarom was er een simpelere versleuteling nodig. Ik koos (bij gebrek aan modernere libraries voor Arduino) voor SHA-1. Daarmee maak je een hash-code. Zo’n hash is ontworpen om alleen bij exact dezelfde invoer hetzelfde resultaat te hebben, zonder dat de invoer achterhaald kan worden. Als simpelweg een hash van je wachtwoord verstuurt via internet, kunnen kwaadwillenden dit afluisteren en zo dezelfde hash gebruiken om nogmaals je deur te openen.

Om dit op te lossen, genereer je niet een hash van je wachtwoord, maar van je wachtwoord met een parameter erbij die steeds anders is. Met het oog op meerdere gebruikers koos ik voor tijd. Voor het gemak gebruikt het uiteindelijke programma http als protocol, hetzelfde als websites. Bij het openen van de deur vraag je eigenlijk een webpagina op, waarbij je informatie in de link meegeeft. Ongeveer zo:

http://het-ip-adres-van-je-deur:poortnummer/key=45fb8c3ffbf25ee069bed26a4c7cd96208260f87&time=1459539357

De key is hier de hash van het wachtwoord gevolg door de huidige tijd in Epoch Time (de tijd in seconden na 1 januari 1970) en time is de huidige tijd. Het antwoord van de Arduino is op het moment van schrijven:

Authentication time-out. Current system time: 1459539401 (44 sec)

Dit komt doordat ik de hash-code enige tijd gegenereerd heb voordat ik hem testte met een link. Een hash-code is namelijk maar geldig binnen een tijdsframe van 5 seconden. Op die manier wordt voorkomen dat iemand de verbinding afluistert en zelf naar binnen kan.

De code en gebruikte libraries voor de Arduino: Doorlock

Natuurlijk is het een voorwaarde dat je Arduino van buitenaf benaderbaar is. In je router kun je daarvoor ‘port-forwarding’ instellen. Verkeer wat dan van buitenaf naar je modem wordt gestuurd, komt dan op de juiste plek binnen je netwerk terecht. Hierbij merk ik graag op dat in mijn programmacode het ip-adres dynamisch wordt toegewezen door een DHCP-server. In mijn router krijgt de Arduino altijd hetzelfde ip-adres. De informatie over het aansluiten van je relaismodule staat in de code.

Uiteindelijk wil je natuurlijk niet elke keer handmatig een link maken om mensen je woning te laten betreden. Om dit te automatiseren, schreef ik een eenvoudige Android-app. Dit heeft niks meer te maken met het deurslot zelf, dus volsta ik met het geven van een Android-package: Open Sesame!

Ik hoop dat je zo een idee hebt gekregen over de werking van mijn elektronische deurslot. Als je nog vragen hebt, stel ze gerust!