Hacking af dørtelefonen

Så hvorfor egentlig gå i gang med at hacke dørtelefonen? Årsagen kunne have været en række bekvemmelighedsgrunde (og var det delvist), men for vores vedkommende, var det primært for at kigge nærmere på ‘Android Things’, og fungere som et ‘proof of concept’. Vi valgte derfor at lave en klar afgrænsning fra start, og fokuserede på telefonens knap, der benyttes til at åbne dørene ned til gaden. Vores mål var at lave et system, hvor vi igennem en mobil applikation, kunne lukke gæster ind, uden nogen fysisk kontakt med dørtelefonen.

Vi startede derfor med at tage et kig ind i maven på telefon, for at se hvilken mekanisme den brugte til at signalere døråbning. Det viste sig at være et stykke plastic (den fysiske knap), der trykker en metal klips ind på en base. Herved skabes en forbindelse, der så sender et signal til dørene om at åbne.

For at simulere det tryk, blev det hurtigt klart at vi måtte lave en form for digital kontakt, mellem de to komponenter.

For at simulere det tryk, blev det hurtigt klart at vi måtte lave en form for digital kontakt, mellem de to komponenter.

Android Things

Til at styre den digitale kontakt, benyttede vi en Raspberry Pi 3, hvorpå vi havde installeret ‘Android Things’. 

‘Android Things' er langt hen af vejen en Android pendent til den poulære Arduino platform, som gør det nemt at lave kode, der kan interagere med den fysiske verden gennem sensorer, motorer, lys og lignende. ‘Android Things’ er en simplificeret udgave af det traditionelle Android styresystem, målrettet ‘Internet of things’ enheder, der gør, at det imødekommer de hardware specs, som ‘Internet of things’ enheder typisk har. Det kan installeres på mange forskellige boards, herunder den populære og prisvenlige Raspberry Pi 3.

‘Android Things’ blev introduceret af Google i December 2016, og selv om navnet er nyt, var der mere tale om en relaunch, af deres eksisterende operativsystem, Brillo. Brillo blev introduceret tilbage i Maj 2015, og var Google’ markering på ‘Internet of Things’ platform markedet, og et umiddelbart resultat af opkøbet af Nest. Det blev dog aldrig den store succes, og udviklingen til Brillo afvigede meget fra den traditionelle udvikling til Android, på trods af at være baseret på netop Android. Det er der gjort op med i ‘Android Things’, og udviklingen er nu fuldstændig tilsvarende, og giver mulighed for at benytte de samme API’er, som der også blev gjort brug af i dette projekt.

Prototyping

Da opsætningen af ‘Android Things’ var klaret, begyndte vi at bygge den digitale kontakt. Til at starte med lavede vi opsætningen på et breadboard, for at sikre vi nemt kunne skifte komponenter, og lave målinger på kredsløbet. Vores store bekymring ved projektet, var at systemet ville riste dørtelefonen. Vi havde derfor sørget for at have et multimeter ved hånde, og lavede rigeligt med målinger, inden vi koblede det til dørtelefonen.

Selve opsætningen vi endte up med, var inspireret af et projekt fra Arduino Starter Kit. Den komponent der agerer som kontakt i opsætningen, og styrer hvornår der skal være forbindelse, hedder en Optocoupler. En Optocoupler fungerer som et relæ, og ved et sende et signal til den, kan man styre om den skal skabe forbindelse, i det tilkoblede system.

Android-things-Internet-Firebase-hacking-door-2

Skulle projektet for alvor give mening, var det også væsentligt og finde en måde hvorpå kontakten, kunne fjernstyres. For at kunne kommunikere med ‘Android Things’ enheden, og slå kontakten til og fra, valgte vi at benytte Firebase Realtime Database.

 

Firebase som backend

I og med at Android Things er baseret på Android, kan man også bruge mange af de almindelige Android libraries, herunder Firebase. Fordelen ved at benytte Firebase til dette projekt, var at der ikke ville opstå et behov for at oprette en direkte forbindelse mellem mobil applikationen og ‘Android Things’ applikationen, og samtidig kunne vi udnytte Raspberry Pi’ mulighed for at forbinde til Wifi. Selve databasen vi oprettede, var utrolig simpel, og bestod af en enkel boolean, der fortalte om dørene skulle åbne eller lukke. Strukturen i Firebase databasen, afviger fra den klassiske tabel baseret struktur, man kender fra SQL, og er istedet struktureret som JSON objekter.

Følgende viser den komplette database benyttet til dette projekt:

{ "open" : false }

Putting it all together

Vi endte ud med følgende opstilling, hvor forbindelsen til dørtelefonen skete på henholdsvis metal klipsen og basen.

Android-things-Internet-Firebase-hacking-door-5.jpeg

Alt der skulle tilføjes i mobil applikation, var en database reference, og på den sætte en ‘ValueEventListener’, for at sikre applikationen konstant kendte dørenes tilstand.

 
FirebaseDatabase database = FirebaseDatabase.getInstance();
databaseReference = database.getReference("open");
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        setDoorBtnState(!dataSnapshot.getValue(boolean.class));
    }

For at ændre dørenes tilstand, blev der tilføjet en knap med en ‘OnClickListener’, hvor i vi ændrede database værdien.

 
@Override
    public void onClick(View v) {
        databaseReference.setValue(true);
    }

I ‘Android Things’ applikationen, skulle der første oprettes en forbindelse til systemet.

 
final String PIN_OPTOCOUPLER = "BCM6";
PeripheralManagerService service = new PeripheralManagerService();
try {
    gpio = service.openGpio(PIN_OPTOCOUPLER);
    gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
} catch (IOException e) {
    e.printStackTrace();
}

Herefter oprettede vi en metode, til at styre tilstanden af Optocoupleren.

    private void setOctoState(boolean isOn) {
        try {
            gpio.setValue(isOn);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Android-things-Internet-Firebase-hacking-door-3

 

I ‘Android Things’ blev der ligeledes oprettet en database reference og sat en ‘ValueEventListener’, hvor den nye værdi fortalte om dørene skulle åbne eller lukke. For at sikre at en afbrudt forbindelse ikke ville resulteret i et scenarie, hvor dørene konstant ville åbne, blev der tilføjet en Handler, der afbrød systemet efter 2 sekunder.

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        boolean isOpen = dataSnapshot.getValue(boolean.class);

        if (isOpen) {
            setOctoState(true);

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    setOctoState(false);
                    databaseReference.setValue(false);
                }
            }, 2000);
        }
    }

Da vi havde færdiggjort testen af vores prototype, og havde en fungerende version, besluttede vi at bygge en “pæn” version. Vi gik fra et breadboard, til en printplade, og fik hele opsætningen til at passe i den officielle Rasberry Pi case.

Den færdige opsætning.

Den færdige opsætning.

Afrunding

Som nævnt i starten, var projektet mest et ‘proof of concept’, og da dørtelefoner varierer meget i deres opbygning, er det ikke sikkert det kan overføres 1:1 til netop din dørtelefon. Vi kan da også lige så godt indrømme, at vi ved den endelige test, opdagede vi en lille uhensigtsmæssighed. Det viste sig nemlig at på vores dørtelefon, skal røret være løftet før man kan trykke folk ind. Det opdagede vi ikke ved den indledende test, da dørtelefonen var skilt ad, og røret dermed var “løftet”. Det minimerer på mange måder forbrugsværdien for vores vedkommende, men alt i alt fik vi det ud af projektet, vi havde håbet på, nemlig at undersøge ‘Android Things’ nærmere. 

Android things

Hele opsætningen af ‘Android Things’ viste sig at være enkel, og understregede at Google virkelig mener det, når de siger ‘low barrier to entry’. Alt det kræver, er en basal viden om IT og Android programmering. Udviklingen foregår helt på lige fod med udvikling til Android, og man kan samtidig benytte de eksisterende API’er, som f.eks. Firebase. Det betyder at ‘Android Things’ har potentiale til at accelerere ‘Internet of things’ markedet, og har med deres OS gjort det attraktivt, specielt for eksisterende Android udviklere, at kigge mere i den retning. 

Har man dog ikke den store erfaring med elektronik, kan man dog støde ind i problemer. Her kan det anbefales, at kigge nærmere på Arduino/Genuino starter kit, der leverer en række projekter, med varierende kompleksitet. Projekterne giver en rigtig god forståelse for kommunikationen med elektriske komponenter, der kan samtidig nemt kan overføres til ‘Android Things’.

Firebase

Brugen af Firebase, viste sig også at være meget effektiv. Opsætningen var hurtig overstået, og med brugen af ‘ValueEventListener’, oplevede vi opdateringstider der konsekvent lå på omkring 1 sekund, når vi aktiverede kontakten fra mobil applikationen. 

Så skulle du sidde med en lyst til at hoppe på ‘Internet of things’ bølgen, er det bare med at komme i gang. Google har i hvert fald leveret nogle rigtig gode værktøjer til at komme i gang, og har i den grad overrasket positivt. Specielt muligheden for at benytte eksisterende API’er, som Firebase i det here projekt, er meget brugbart.

 

Af Andreas Alstrøm Sørensen
Junior Android udvikler hos Touchlogic