{"id":498,"date":"2017-07-09T22:23:43","date_gmt":"2017-07-09T20:23:43","guid":{"rendered":"https:\/\/www.pingu-mobil.de\/iot\/?p=498"},"modified":"2021-05-14T10:07:48","modified_gmt":"2021-05-14T08:07:48","slug":"home-security-besser-spaet-als-nie","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2017\/home-security\/home-security-besser-spaet-als-nie\/","title":{"rendered":"Home Security: Besser sp\u00e4t als nie"},"content":{"rendered":"<p>Bis jetzt gab es von uns schon Berichte zur Sensorik, zum Alarmsystem auf dem Pi und \u00fcber den Web-Service, der die Funktionalit\u00e4ten des Systems \u00fcber eine REST-Schnittstelle exponiert. Was noch fehlt ist die mobile Android-App, die dem Eigenheimbesitzer die Kontrolle \u00fcber sein Alarmsystem gibt. Deshalb widmen wir den letzten Blog-Eintrag diesem Thema.<\/p>\n<p>Die App wurde in drei gro\u00dfen Schritten erstellt. Zuerst wurden die M\u00f6glichkeiten der Nutzerinteraktion konzipiert und ein Design mit entsprechender Navigation zwischen mehreren Ansichten, im Android-Jargon <em>Activity<\/em>, entwickelt. Die Navigation durch die App sieht dabei wie folgt aus:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-499\" src=\"http:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/activities.png\" alt=\"\" width=\"822\" height=\"315\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/activities.png 822w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/activities-300x115.png 300w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/activities-768x294.png 768w\" sizes=\"(max-width: 822px) 100vw, 822px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Als erstes loggt sich ein Nutzer \u00fcber die Anmeldedaten seines Alarmsystems ein. Die eingegebenen Daten werden lokal abgelegt, sodass bei wiederholtem \u00d6ffnen der App der Nutzer angemeldet bleibt. Bei erfolgreicher Anmeldung wird der Nutzer auf die Home-Activity weitergleitet. Hier gibt es eine Fu\u00dfzeilennavigation, die dem Anwender je nach Auswahl eine Liste aller Sensoren und Aktoren, Regeln oder Benachrichtigungen anzeigt. Abh\u00e4ngig von der Liste, die angezeigt wird, sind auch die Menu-Buttons in der Toolbar unterschiedlich. Beispielsweise ist es m\u00f6glich \u00fcber einen Menu-Button den Einwahlmodus zu starten, wenn man sich in der Listenansicht der Sensorik befindet. In der Ansicht f\u00fcr Regeln k\u00f6nnen neue hinzugef\u00fcgt werden und wenn die Benachrichtigungsliste zu sehen ist, wird dem Nutzer angeboten einen eingeschalteten Alarm zu deaktivieren \u2013 sofern einer aktiv war. Durch das Klicken auf ein Listenelement kommt man auf die jeweilige Detailansicht, in der entweder Sensor-, Regel- oder Benachrichtigungsdetails angezeigt werden. Von der Home-Activity aus kann der Nutzer auch zu einer Settings-Activity navigieren, von der aus Nutzername und Passwort ge\u00e4ndert werden k\u00f6nnen. Ebenso kann man sich hier explizit vom System abmelden. Nach der Realisierung der Darstellung erfolgte die Abbildung der Alarmsystementit\u00e4ten als Java-Klassen in der App, d. h. Modellierung von Sensorklassen, Regeln, etc. und deren Adapterklassen, um die Eigenschaften einfach im UI darstellen zu k\u00f6nnen. Insbesondere die Abstraktion durch Adapterklassen erm\u00f6glichte einen gro\u00dfe Wiederverwendbarkeit des UI-Codes, sodass EINE allgemeine Listenanzeige implementiert wurde, die letztlich aber individualisiert sowohl Informationen f\u00fcr Ger\u00e4te, Regeln und Nachrichten anzeigen konnte. Des Weiteren wurden neben Activities auch eigene Dialoge implementiert, um dem Nutzer das \u00c4ndern seines Passworts oder auch das Hinzuf\u00fcgen von Sensoren\/Aktoren zu Regeln zu vereinfachen. Einige Screenshots der Anwendung verdeutlichen das eben gesagte nochmal:<\/p>\n<p><a href=\"http:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/screenshots.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-502 size-full\" src=\"http:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/screenshots.png\" alt=\"\" width=\"1224\" height=\"343\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/screenshots.png 1224w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/screenshots-300x84.png 300w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/screenshots-1024x287.png 1024w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/screenshots-768x215.png 768w\" sizes=\"(max-width: 1224px) 100vw, 1224px\" \/><\/a><\/p>\n<p>Der zweite Schritt bestand dann darin, die App mit dem Web-Service kommunizieren zu lassen. Gem\u00e4\u00df des Single-Responsibility-Prinzips haben wir bewusst davon abgesehen, Netzwerkanfragen in den Activities selbst durchzuf\u00fchren. Stattdessen wurde eine zentrale Klasse <em>RemoteAlarmSystem<\/em> implementiert, die den Gro\u00dfteil aller Web-Service-Methoden kapselt und \u00fcber Instanzmethoden der aufrufenden Activity zur Verf\u00fcgung stellt. Ebenso wird das Transformieren von App-Objekten zu JSON-Daten und umgedreht direkt in der Klasse \u00fcbernommen. Damit wurde die Komplexit\u00e4t der Netzwerkkommunikation an einer zentralen Stelle gel\u00f6st und nicht komplett \u00fcber die Anwendung gestreut. Innerhalb der Klasse RemoteAlarmSystem wird das <a href=\"https:\/\/github.com\/google\/volley\"><em>Volley<\/em><\/a>-Framework verwendet, um asynchrone HTTP-Anfragen an den Web-Service zu stellen. Das Framework hat sich als wesentlich einfacher und schlanker als die Entwicklung mit <a href=\"https:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html\"><em>AsncTask<\/em><\/a> herausgestellt. Feinheiten, wie das Verwerfen von Requests beim Anhalten einer Activity, wurden auch ber\u00fccksichtigt.<\/p>\n<p>Die letzte Aufgabe in der App-Entwicklung konzentrierte sich auf das Empfangen von Push-Benachrichtigung, ohne die die App zweifellos an Effektivit\u00e4t einb\u00fc\u00dfen w\u00fcrde, da nur so Alarme auch zeitnah dem Eigenheimbesitzer mitgeteilt werden k\u00f6nnen. Um die Benachrichtigungen zu realisieren, verwendeten wir die <a href=\"https:\/\/firebase.google.com\/docs\/cloud-messaging\/\">Dienste der Google Firebase Cloud<\/a>. In der Cloud-Umgebung wurde zun\u00e4chst ein \u00f6ffentlicher API-Schl\u00fcssel generiert, \u00fcber den sowohl die App als auch das Alarmsystem den Cloud-Messaging-Dienst aufrufen. In der App erfolgte anschlie\u00dfend die Implementierung zweier Services, die parallel zur Anwendung im Hintergrund laufen und im st\u00e4ndigen Kontakt mit der Cloud auf eintreffende Nachrichten warten. Des Weiteren erzeugt einer der Services einen Token, welcher nur f\u00fcr ein spezielles Ger\u00e4t gilt. Dieser Token wird dem Alarmsystem mitgeteilt, das dann wiederum bei allen Cloud-Anfragen den Token mitgibt, um nur an das jeweilige Zielger\u00e4t Push-Nachrichten zu senden. Das bedeutet im Umkehrschluss, das jedes Alarmsystem korrekterweise nur Nachrichten an das Android-Ger\u00e4t sendet, das sich auch beim Alarmsystem angemeldet und seinen Token mitgeteilt hat. Mittels Postman kann das entsprechend auch getestet werden.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-503\" src=\"http:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/Screenshot_1499630953.png\" alt=\"\" width=\"188\" height=\"334\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/Screenshot_1499630953.png 1080w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/Screenshot_1499630953-169x300.png 169w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/Screenshot_1499630953-576x1024.png 576w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/Screenshot_1499630953-768x1365.png 768w, https:\/\/www.iot-embedded.de\/iot-2017\/wp-content\/uploads\/sites\/2\/2017\/07\/Screenshot_1499630953-864x1536.png 864w\" sizes=\"(max-width: 188px) 100vw, 188px\" \/><\/p>\n<p>Zu guter Letzt:<\/p>\n<p>Um mal einen \u00dcberblick \u00fcber unseren Code zu bekommen: <a href=\"https:\/\/github.com\/HomeSecurity\">https:\/\/github.com\/HomeSecurity<\/a><br \/>\nGenerell ganz n\u00fctzlich, falls noch jemand nach einer guten Projektstrukturierung mit Git sucht: <a href=\"http:\/\/nvie.com\/posts\/a-successful-git-branching-model\/\">http:\/\/nvie.com\/posts\/a-successful-git-branching-model\/<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bis jetzt gab es von uns schon Berichte zur Sensorik, zum Alarmsystem auf dem Pi und \u00fcber den Web-Service, der die Funktionalit\u00e4ten des Systems \u00fcber eine REST-Schnittstelle exponiert. Was noch fehlt ist die mobile Android-App, die dem Eigenheimbesitzer die Kontrolle<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/498"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/comments?post=498"}],"version-history":[{"count":1,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/498\/revisions"}],"predecessor-version":[{"id":552,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/498\/revisions\/552"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/media?parent=498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/categories?post=498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/tags?post=498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}