Ein Experiment mit Arduino, MQTT, Apache ActiveMQ und Apache Camel
- Das Internet der Dinge: Use-Cases Simulation einer Alarmanlage
- Das Internet der Dinge: EIP Pattern
- Das Internet der Dinge: schematischer Aufbau mit EIP-Pattern
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:
- Alarmanlage aktivieren
- Alarm auslösen
- 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 |
|
| 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 |
|
| Varianten/alternativer Ablauf |
|
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 |
|
| 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
- Building Smarter Planet Solutions with MQTT and IBM WebSphere MQ Telemetry
- HomeControl Source Code
- Apache Camel Wikipedia
- Apache Camel
- Apache Camel MQTT
- Workshop Apache Camel
- Enterprise Integration Patterns
- Teil 1: Das Internet der Dinge – Infrastruktur und Geräte
- Teil 2: Das Internet der Dinge – Vernetzung






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