Arduino, IoT, Java, Mikrocontroller, Softwarearchitektur
Kommentare 2

Teil 3: Das Internet der Dinge – Logik

Ein Experiment mit Arduino, MQTT, Apache ActiveMQ und Apache Camel

Im ersten Teil des Blogs wurde die Hardware und die Infrastruktur und im zweiten Teil die Vernetzung vorgestellt. Apache ActiveMQ wurde mit dem MQTT-Konnektor konfiguriert und die Arduino-Software Home Gateway beschrieben. Im letzten Teil des Blogs geht es um die intelligente Logik – die Fachlichkeit die entscheidet, was mit den gelesenen Werten der Sensoren passiert passieren soll und welche Aktoren angesteuert werden. Dazu wird das Framework Apache Camel verwendet.

Das Beispiel: Simulation einer Alarmanlage

Ich gebe zu, das gewählte Beispiel – Simulation einer Alarmanlage – ist nicht besonders intelligent. Mir ist leider kein besserer Anwendungsfall eingefallen. Mein Ansatz im Blog war, die Technischen Grundlagen dafür auszuprobieren.

Das Beispiel hat folgende 3 Use-Cases:

  1. Alarmanlage aktivieren
  2. Alarm auslösen
  3. Alarm ausschalten und Alarmanlage deaktivieren

 

Alarmanlage aktivieren

Name UC Alarmanlage aktivieren
Akteure Mieter
Beschreibung Der Mieter einer Wohnung kann die Alarmanlage aktivieren. Ab da sind die Sensoren aktiv.
Auslöser / Vorbedingungen Der Mieter drückt den Taster S1 auf dem Bedienpult und aktiviert damit die Alarmanlage. / Die Alarmanlage ist deaktiviert
Ergebnisse Die Alarmanlage wird aktiviert, die LED 1 leuchtet
Ablauf/Hinweise
  • Nutzer drückt den Taster S1
  • Event wird vom HomeGateway per MQTT an den MessageBroker gesendet (Nachricht: [6,1])
  • Der HomeControler erhält die Nachricht und ändert den Status auf “aktiviert”
  • Der HomeController sendet per MQTT eine Nachricht ([1,1]) an den Broker
  • Das HomeGateway erhält die Nachricht und schaltet DeviceID = 1 (LED1) auf HIGH
Varianten/alternativer Ablauf kein

Alarm auslösen

Name UC Alarm auslösen
Akteure  Einbrecher
Beschreibung Der Einbrecher wird durch den Sensor (Taster S2) bemerkt und meldet den Alarm
Auslöser / Vorbedingungen Sensor (Taster S2) liest HIGH-Signal / Alarmanlage wurde aktiviert
Ergebnisse Alarm wurde ausgelöst, Sirene und Signalleuchte gehen an (im Simulator LED 2)
Ablauf/Hinweise
  • Einbrecher wird vom Sensor bemerkt (Taster S2)
  • Event wird vom HomeGateway per MQTT an den MessageBroker gesendet (Nachricht: [7,1])
  • Der HomeControler erhält die Nachricht, der Status der Alarmanlage ist auf “aktiviert”, die Alarmmeldung wird akzeptiert
  • Der HomeController sendet per MQTT eine Nachricht ([2,1]) an den Broker
  • Das HomeGateway erhält die Nachricht und schaltet DeviceID = 2 (LED2) auf HIGH
Varianten/alternativer Ablauf
  • Alarmmeldung wird übermittelt und der Status der Alarmanlage ist “deaktiviert”
  • nachricht wird verworfen

Alarm ausschalten und Alarmanlage deaktivieren

Name UC Alarm ausschalten und Alarmanlage deaktivieren
Akteure Mieter
Beschreibung Der Mieter einer Wohnung kann die Alarmanlage deaktivieren. Ab da sind die Sensoren inaktiv. Bestehende Alarmmeldungen werden gelöscht und Sirene und Signalleuchte (im Simulator LED 2) ausgeschalten.
Auslöser / Vorbedingungen Der Mieter drückt den Taster S1 auf dem Bedienpult und deaktiviert damit die Alarmanlage. / Die Alarmanlage ist aktiviert
Ergebnisse Die Alarmanlage wird deaktiviert, die LED 1 ist ausgeschalten
Ablauf/Hinweise
  • Nutzer drückt den Taster S1
  • Event wird vom HomeGateway per MQTT an den MessageBroker gesendet (Nachricht: [6,1])
  • Der HomeControler erhält die Nachricht und ändert den Status auf “deaktiviert”
  • Der HomeController sendet per MQTT eine Nachricht ([1,0]) an den Broker
  • Das HomeGateway erhält die Nachricht und schaltet DeviceID = 1 (LED1) auf LOW
Varianten/alternativer Ablauf kein

Apache Camel

Apache Camel ist ein Framework für die Intergration von verschiedensten System über die unterschiedlichsten Schnittstellen. Es implementiert die Enterprise Integration Patterns nach dem gleichnamigen Buch. In der folgenden Grafik sind die elementaren Bestandteil dargestellt.

Über eine relativ einfache API werden die Bestandteile zum Messagesystem zusammengesetzt:

RouteBuilder#configure(){
 from(EP1).to(EP2);
 from(EP1).bean(myBean, "doSomething");  from(EP1).process(myProcessor);  from(EP1).transform(myBean, "doSomething");  from(EP1).recipientList(simple("direct:${header.operationName}")); from(EP1).multicast().to(EP2, EP3,EP4);  ... } 

Neben der Java-API gibt es auch die Möglichkeit die Bestandteile per Spring-XML zu verbinden:

<camelContext xmlns="http://camel.apache.org/schema/spring"> 
 <route>
 <from uri="EP-URI1"/>
 <to uri="EP-URI2"/>
 </route>
</camelContext>

HomeControl

Das folgende Bild in EIP-Notation zeigt den schematischen Aufbau des Messagingsystems. Apache Camel wird auch per MQTT über einen entsprechenden Endpoint an dem Nachrichtenkanal des Brokers angebunden.

Mit folgendem Code wird das Routing und die Bearbeitung realisiert:

from("mqtt:in?subscribeTopicName=sensor-topic-in").process( alarmProcessor).to("file://out");
from("file://out").to("mqtt:out?publishTopicName=actor-topic-out");

Die Nachrichten werden aus dem Topic sensor-topic-in gelesen. Über process(alarmProcessor) wird die Nachricht an dem AlarmProcessore übergeben. Dort werden die Nachrichten fachlich verarbeitet und die Steuernachricht für die Aktoren erstellt. Am Ende des Nachrichtenkanals werden die Nachrichten im Dateisystem (file://out) zwischengespeichert. Im zweiten Nachrichtenkanal werden die Nachrichten dort ausgelesen und an dem Broker übergeben. Aus dem Topic actor-topic-out kann dann das Homgateway (Arduino-Board) die Nachrichten empfangen.

Das zugehörige Projekt kann aus dem GITHUB-Repository geladen werden.

Ergebnis

Bitte die schlechte Videoqualität entschuldigen.
Ich habe kein besseres Gerät für die Aufnahme

Ausblick

Durch den Message-orientierten Aufbau, hat man eine saubere Trennung der Verantwortungen in der Architektur. Das System skaliert, es bietet Möglichkeiten für Authentifizierung und Autorisierung und es können beliebig weitere Systeme wie Sensoren, Aktoren, oder Mobile Geräte als User Interface für die Steuerung hinzugefügt werden. Mit dem Einsatz von Apache Camel für das Bearbeiten und Routing der Nachrichten hat man ein starkes Werkzeug zur Verfügung, die fachliche Logik relativ einfach anzupassen oder erweitern zu können. Mit folgender Zeile Code könnte man zusätzlich ein E-Mail verschicken.

from("file://alarm").to("smtp://MAIL_HOST?to=MAIL_TO&subject=Einbruch!!!&from=MAIL_FROM");

Links

Share on FacebookShare on Google+Tweet about this on TwitterPin on Pinterest

2 Kommentare

  1. Pingback: Teil 2: Das Internet der Dinge – Vernetzung | TechBlog

  2. Pingback: Teil 1: Das Internet der Dinge – Infrastruktur und Geräte | TechBlog

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *