Lösung: Sicherheit mit dem Internet-of-Things
Stecke den Grove Hub mit einem Grove Kabel an Port A des M5Stacks an. Stecke nun an einen beliebigen Port des Grove Hubs mittels eines Grove Kabels die CardKB Komponente an. Verbinde die RFID Komponente mit Hilfe eines Grove Kabels mit einem beliebigen, freien Port des Grove Hubs.
Schließe nun die Fingerkomponente mit einem Grove Kabel an Port C des M5Stacks an.
Steck mit einem Grove Kabel den Pb.Hub an den Grove Hub an. Stecke anschließend an den Steckplatz mit der Nummer des Pb.Hubs mit einem weiteren Grove Kabel den PIR Sensor (auch unter dem Namen Motion Sensor bekannt). Die RGB Komponente kommt an Steckplatznummer 1.
Verbinde mit einem Grove Kabel einen weiteren Grove Hub mit Port B des M5Satcks. Mit zwei weiteren Grove Kabeln werden die Laser Tx und die Laser Rx Komponenten an beliebige Steckplätze des Grove Hubs angeschlossen.
Im nächsten Schritt muss die Benutzeroberfläche des M5Stacks erstellt werden.
Ziehe dafür sieben Labels untereinander auf den Bildschirm. Der Name des obersten Labels wird auf labelTop geändert, der Text auf “Button A: Passwort setzen”. Daneben muss ein roter Kreis erstellt werden. Der Name des nächsten Labels wird auf password geändert, der Text kann unverändert bleiben.
Das nächste Label wird auf LabelMid umbenannt und der Text “Button B: Karten ID hinzufügen” ergänzt. Auch hier wird daneben wieder ein roter Kreis erstellt.
Das Label darunter wird als fingerstate benannt.
Das darauffolgende Label bekommt den Namen “labelBottom” und wird um den Text “Button C: Finger scannen” erweitert. Auch hier wird auf der rechten Seite ein roter Kreis erstellt.
Das nächste Label mit dem Namen pirLabel bekommt den Text “Bewegung…”.
Das unterste Label wird als laserLabel benannt und der Text “Lichtschranke” hinzugefügt.
Nun kann mit der Programmierung in UI Flow begonnen werden. Zunächst sollen alle Label ausgeblendet werden. Dies wird erreicht indem die Label einen leeren String anzeigen sollen. Auch die Kreise und das Passwort sollen nicht sichtbar sein.
Nun muss eine neue Variable mit dem Namen configMode angelegt und mit dem Wert 1 initialisiert werden.
Damit die Lichtschranke, die die Komponenten Laser RX und LAser Tx verwendet muss ein uart Block eingefügt werden.
Bei richtiger beziehungsweise falscher Eingabe soll nicht nur der M5Stack aufleuchten sondern auch die zusätzliche RGB Led Komponente, die am Pb.Hub steckt. Zu Beginn soll diese rot leuchten. Um dies umzusetzen wird der Block benötigt.
Der Hauptteil des Programms soll nicht nur einmal, sondern mehrfach ausgeführt werden. Dazu wird ein Loopblock benötigt.
Je nachdem, welchen Wert die Variable configMode hat, soll etwas anderes passieren. Um diesen Sachverhalt umzusetzen, wird ein Switch Case Statement benötigt. Abhängig vom Wert der Variable configMode, wird ein anderer Case ausgeführt.
Es werden fünf verschiedene Cases erstellt. Außerdem gibt es einen Default Block, der betreten wird, wenn keiner der Cases eintritt.
Im Falle, dass der Wert der Variable configMode 1 ist,
soll der Benutzer ein neues Passwort setzen können.
Damit er dies kann, müssen wir zunächst eine Funktion
mit dem Namen savePassword schreiben. Dazu
braucht man aus der Kategorie Function den
entsprechenden Block.
Erst wenn dieser Block angelegt und richtig benannt
wurde, kann man im Case die Funktion aufrufen.
Ist der Wert also nun 1, wird in diesen Fall gegangen
und die Funktion savePassword aufgerufen. Dabei wird
dann in den entsprechenden Codeblock gesprungen
und dieser ausgeführt.
Damit der Benutzer überhaupt erfährt, dass er ein
neues Passwort setzen kann, wird der Wert der
Variablen entsprechend angepasst.
Um das Passwort zu speichern, muss die Taste A
gedruckt werden. Diese Information soll dem Benutzer
aber erst angezeigt werden, wenn er bereits mehr als
ein Zeichen auf der Tastatur eingegeben hat. Um dies
umzusetzen, brauchen wir eine if-else Verzweigung.
Ähnlich wie beim Switch Case wird auch hierfür wieder
eine Bedingung benötigt, in diesem Fall soll aber
geprüft werden, ob bereits auf der Tastatur etwas
eingegeben wurde. Je nachdem wird in einen der zwei
Zweige gegangen und der Variable ein neuer Wert
zugewiesen. Anschließend wird auch der Variable Password das auf der Tastatur eingegebene
Zeichenkette zugewiesen.
Für den nächsten Case wird überprüft ob der Wert der
configMode Variable ist und ob auf der Tastatur
zuletzt das Escape Zeichen gedrückt wurde. Um dies
zu überprüfen, brauchen wir wieder eine
zusammengesetzte Bedingung. Damit festgestellt
werden kann, ob zuletzt das Escapezeichen gedrückt
wurde, brauchen wir aus dem Block CardKB den Block
getKey. Dieser gibt uns den Wert der zuletzt
gedrückten Taste. Die Escapetaste hat den Wert 27
demnach vergleichen wir, ob zuletzt die Taste mit dem
Wert 27 gedrückt wurde. Ist beides der Fall gehen wir in
den Block rein und dieser wird ausgeführt.
Um eine neue Kartennummer zu speichern wird wieder eine Funktion benötigt. Diese wird saveCard benannt.
In diesem Schritt muss die saveCard-Methode implementiert werden. Es muss geprüft werden, ob eine Kart ein der Nähe ist.
Für die erste Bedingung brauchen wir die Karten UID.
Diesen Block findet man in der Kategorie Units unter
RFID. Da wir kontrollieren möchten, dass die Nummer
nicht einfach leer ist, holen wir aus der Kategorie text
eine leere Zeichenkette. Für den zweiten Teil der
Bedingung brauchen wir aus der Kategorie Unit den
Block card near. Ist eine Karte am Scanner angelegt
wird dieser Block zu true ausgewertet. Sind beide
Bedingungen wahr, wird in den do Teil der IF
Verzweigung reingegangen. Dort wird der Modus auf 3
gesetzt, sowie die Kartennummer in die Variable Uid
gespeichert. Zuvor muss diese variable natürlich
angelegt werden. Dies kann in der Kategorie Variables
gemacht werden.
Ist der Wert der Variable configMode 3, soll ein neuer Finger gespeichert werden. Dafür muss eine Funktion saveFinger angelegt werden.
In der Funktion wird eine If-Else
Verzweigung mit einer weiteren else if Bedingung gebraucht. Die Blöcke für den Fingerscan findet man in der Kategorie Units unter Finger.
Im Hauptblock des Programms muss nun der Falls, dass configMode den Wert 4 hat, angepasst werden. Hier wird die neu erstellte Funktion saveFinger aufgerufen.
Wird ein Finger an die Komponente gelegt, der nicht gespeichert ist, sollder M5Stack rot aufleuchten. Der Block getUnknown, in dem das Verhalten bei Scan eines unbekannten Fingers festgelegt wird, kann in der Kategorie Unit gefunden werden.
Wird ein gespeicherter Finger gescannt und ist der Wert der Variable configMode 5, also der Modus, in welchem ein Entsperren
möglich sein soll, soll der M5Stack grün leuchten und dies anzeigen.
Im Fall dessen, dass configMode den Wert 4 hat, soll angezeigt werden, dass das Haus mit Drücken desButton C gesperrt werden kann.
Im Defaultblock befindet sich die Logik der Lichtschrank sowie die Logik zum Entsperren.
Um die Lichtschranke auch im Code zu implementieren, brauchen wir eine weitere if-else Verzweigung im Default
Block. Die Zeile findet man in der Kategorie Units bei Pb.hub. Durch
diese „if-Abfrage“ kontrollieren wir, ob der Wert, der vom Steckplatz 0 am Pb.Hub (in unserem Fall vom MotionSensor) erhalten wird, größer als 1000 ist oder nicht. Wenn er größer als 1000 ist, so wurde ein Bewegung erkannt und wir wollen dementsprechend eine Meldung anzeigen lassen. Sollte der Wert unter 1000 liegen, so wissen wir, dass es zu keiner Bewegung kam – auch hier soll
eine passende Meldung sichtbar werden.
Damit bei Eingabe des Passworts dieses auch angezeigt wird, muss das Label den auf der Tastatur eingegebenen String anzeigen.
Im nächsten Schritt muss überprüft werden, ob die an den Scanner angelegte Karte mit der gespeicherten Karte übereinstimmt. Dafür wird eine neue Funktion namens checkCard benötigt.
Innerhalb dieser Funktion
brauchen wir eine If-Else If- Verzweigung. Diese kann in der Kategorie Logic nach Auswahl des If-else Blocks mit dem kleinen blauen Zahnrad erstellt werden. Für die If Bedingung benötigen wir eine zusammengesetzte if Bedingung. Denn es soll überprüft werden, dass einerseits eine Karte in der Nähe ist und andererseits, dass die UID der Karte mit der gespeicherten UID übereinstimmt. Ist dies der Fall, soll der M5Stack grün aufleuchten und einen Ton abspielen. Außerdem soll der Kreis für die Karte am Bildschirm grün werden und Karte erfolgreich ausgegeben werden. Nach einer Sekunde soll das Leuchten wieder erlöschen. Im Else-if Zweig soll der Fall abgedeckt werden, dass zwar eine Karte angelegt wurde, diese jedoch nicht mit der gespeicherten Karte übereinstimmt. Dafür brauchen wir auch wieder eine zusammengesetzte Bedingung.
Um den Code um die Funktionalität der Lichtschranke zu erweitern, muss eine weitere Funktion mit dem Namen laserMethod erstellt werden.
Bei der Implementierung der Funktion werden wieder uart Blöcke gebraucht. Ist der Wert größer als 0, wurde die Lichtschranke durchbrochen.
Wenn sowohl das Passwort, Kartennummer und Finger stimmen, soll das Haus entriegelt werden. Dafür wird eine verschachtelte IF Bedingung benötigt.
Wird das Haus entsperrt, soll dies auch am Display des M5Stacks angezeigt und der m5Stack grün leuchten.
Wie bereits zu Beginn erwähnt, läuft der Code in einer Schleife und wird dadurch immer und immer wieder ausgeführt. Zwischen den Ausführungen soll aber eine Zehntel Sekunde liegen, weshalb der Timerblock benötigt wird.
Auch die drei Button A, B und C sollen eine Funktionalität bekommen. Zuerst wird Button A implementiert, wofür der entsprechende Block ausgewählt werden muss.
Beim Betätigen der Taste A wird nun also ausgeführt, was sich innerhalb des Blocks befindet. Button A soll verschiedene Funktionalitäten bekommen, je nachdem in welchen Modus sich das Programm gerade befindet. Ist der Wert der Variable 1 soll das neue Passwort gespeichert werden, ist der Wert 5 und die eingegeben Zeichenkette richtig, soll das Passwort auf erfolgreich gesetzt werden. Dafür wird eine if Verzweigung gebraucht. Zuerst müssen wir die Bedingung zusammenbauen. Ist diese Bedingung wahr, wird alles ausgeführt, was sich im do Teil des Ifs befindet. Zuerst soll die eingegeben Zeichenkette in der Variable Passwort gespeichert werden und der Wert von configMode auf 7 gesetzt werden. Außerdem werden auch den Variablen varTop und varBottom neue Werte zugewiesen.
Ist der Wert von configMode 5 und das auf der Tastatur eingegebene Wort stimmt mit dem Passwort überein, soll die RGB LED Komponente sowie der M5Stack selbst aufleuchten. Außerdem soll ein Ton abgespielt und der entsprechende Kreis grün sowie Text angezeigt werden. Nach einer Sekunde soll der M5Stack zum Leuchten aufhören.
Ist der Wert von configMode 5, stimmt das Passwort jedoch nicht mit dem eingegebenen überein, soll der M5Satck rot leuchten.
Weil die angelegte Karte erst bei Betätigung der Taste B gespeichert werden soll, brauchen wir auch
Funktionalität im Button B. Dafür müssen wir aus der
Kategorie Events den benötigten Block holen. Button B soll den Modus auf 4 setzen sowie einen neuen Finger speichern.
Damit bei Drücken des Button C auch wirklich etwas geschieht, müssen wir den entsprechenden Block anlegen. Dies funktioniert genauso wie bei Button A. Innerhalb des Blocks benötigen wir eine if-else Verzweigung. Momentan soll nur etwas passieren, wenn der Wert der ConfigMode Variable genau 4 ist. Dies ist also unsere If Bedingung. Da am Bildschirm auch angezeigt werden soll, dass das Haus verriegelt wurde, müssen die entsprechenden variablen angepasst werden. Außerdem soll der Benutzer ein visuelles Signal bekommen. Um den M5Stack rot leuchten zulassen, brauchen wir wieder den RGB Block aus der Kategorie Hardwares. Nach einer Sekunde soll das rote Leuchten zum Erlöschen kommen, deswegen wird mit Hilfe des Timer Blocks eine Sekunde gewartet und dann RGB auf schwarz eingestellt. Nun soll der Benutzer die Möglichkeit haben das Haus zu entsperren. Außerdem sollen die Kreise rot angezeigt werden. Dies kann mit dem Block Circle in der Kategorie UI gemacht werden. Schließlich soll der Modus auf 5 geändert werden.