Im vergangenen Jahr haben wir mehrere IIoT-Projekte entworfen (und unterstützen sie auch weiterhin). Sie haben vielleicht schon von IIoT gehört, aber für alle Fälle werden wir versuchen, so einfach wie möglich zu erklären, was es ist und warum es für Entwickler, Architekten und Administratoren hoch geladener Lösungen interessant ist.

IoT - das Internet der Dinge - umfasst die Steuerung von Geräten, die für einfache Haushaltsaufgaben ausgelegt sind (Öffnen des Garagentors beim Anfahren des Autos, Einschalten des Lichts mithilfe eines Bewegungssensors oder eines Befehls, Überwachung der Raumtemperatur) und dann unter IIoT - dem industriellen Internet der Dinge - normalerweise im Hinblick auf die „Digitalisierung“ von Daten aus der Industrie, auf deren Grundlage Expertenanalysen durchgeführt werden können, häufig unter Verwendung von maschinellem Lernen.
Sie können beispielsweise Daten von Rotationsmotoren sammeln und analysieren, um rechtzeitig über Fehler zu erfahren und Reparaturen zu sparen. Das Ersetzen einer komplett defekten Turbine ist viel teurer als eine rechtzeitige Reparatur. Ein weiteres Beispiel ist der Kohlebergbau. Durch die Analyse von Daten zur Luftzusammensetzung in Bergwerken können Sie rechtzeitig auf Überschreitungen zulässiger Werte reagieren. Dies hilft, lebensbedrohliche Situationen für Bergleute zu verhindern.
Der Datenstrom - von Feldsensoren, von Industriemaschinen, von Gassensoren - gelangt zu Aggregationsknotenpunkten und weiter zur Datenverarbeitungs- und Analyseplattform.
Wir möchten darüber sprechen, wie eine solche Architektur aussieht, wie Daten ganz einfach erfasst und analysiert werden können und wie auf die Besonderheiten einzelner Anwendungen eingegangen wird. Wir werden uns auf Übersetzungen englischsprachiger Artikel und unsere eigene Designerfahrung verlassen. Dieser Artikel wurde mit unseren Erklärungen und Ergänzungen übersetzt.
Im ersten Artikel werden wir versuchen, eine IIoT-Architektur zu erstellen, in die wir Daten von Sensoren weiter übertragen und sie dann an ein System übertragen, das die Verarbeitung, Analyse, maschinelles Lernen und Überwachung eingehender Daten ermöglicht.
Erstellte Architektur
Im industriellen IoT gibt es häufig keinen direkten Zugriff auf Sensoren und Steuerungssysteme. Daher wird ein Gateway verwendet, um die Ebenen OT (Betriebstechnologie) und IT (Informationstechnologie) zu verbinden.
Daher umfasst die IIoT-Architektur normalerweise: Endgeräte, Gateways, regionale Hubs und schließlich Informationsverarbeitungs- und Speichersysteme.
Die erstellte Architektur sollte eine Gelegenheit bieten:
- Sammeln Sie Daten von Sensoren zum Gateway
- Übertragen Sie Daten in die Cloud oder ins Rechenzentrum
- Aktualisieren Sie die Gateway-Konfigurationen automatisch
- Sorgen Sie für eine sichere Datenübertragung und -verarbeitung
Auf dem Bild: Architektur des erstellten Systems und der Software, mit der wir es auf jeder Ebene erstellen werden.

Sensoren erfassen Daten und senden sie mithilfe verschiedener drahtgebundener und drahtloser Protokolle (seriell, RS-485, MODBUS, CAN-Bus, OPC UA, BLE, WiFi usw.) an das Gateway. In unserem Beispiel werden wir berücksichtigen, dass die Daten über WLAN zum Gateway gelangen.
Als Gateway werden wir den Raspberry Pi verwenden, auf dem der Mosquitto-Broker und der MiNiFi-Agent gestartet werden. Mosquitto ist ein Open-Source-Broker für leichte Nachrichten, mit dem wir Daten von Sensoren mithilfe des MQTT-Protokolls weiter übertragen. MQTT fügt einen minimalen Overhead hinzu und ist daher für die Verwendung im IoT praktisch, wenn die Hardwareressourcen der Endgeräte begrenzt sind (z. B. Telefone und Mikrocontroller).
Apache MiNiFi - ein Teilprojekt Apache NiFi - ein leichtgewichtiger Agent, der die Kernfunktionalität von Apache NiFi implementiert und speziell für die Erfassung von Daten auf Endgeräten entwickelt wurde.
MiNiFi ist kompakt, verbraucht nur minimale Ressourcen und ermöglicht die zentrale Verwaltung aller Agenten. Mithilfe von Site-to-Site (S2S) kann problemlos eine Verbindung zu NiFi hergestellt werden. Auf diese Weise können Sie eine umfassende Datenflusskontrolle erstellen - skalierbar, sicher und mit einer klaren Vorstellung von allen Phasen der Informationsübertragung.
In unserem System abonniert MiNiFi alle Mosquitto-Broker-Themen und leitet jede Nachricht an NiFi weiter, das auf regionaler Ebene festgelegt wurde. Sie können es auch verwenden, um eine Verbindung zu einem SCADA-System oder einer anderen OT-Datenquelle herzustellen.
Auf regionaler Ebene gibt es zwei Komponenten:
Apache NiFi ist ein leistungsstarkes Datenstrom-Verwaltungssystem, das mehr als 200 Konnektoren unterstützt. Über eine grafische Oberfläche können Sie Datenströme schnell und einfach entwerfen.
NiFi opfert der Einfachheit halber keine Leistung. Es ist ein gut skalierbares verteiltes System mit garantierter Zustellung, Gegendruck (die Fähigkeit, Daten zu speichern, bevor sie auf andere, langsamere Systeme hochgeladen werden) und Lastausgleich. Diese Funktionalität macht NiFi zu einem hervorragenden Werkzeug für IoT-Anwendungen, die häufig in instabilen Netzwerkumgebungen funktionieren.
In unserem System ist NiFi ein Datenerfassungszentrum, das sie an verschiedene Systeme und Anwendungen (HDFS, HBase, Kafka, S3 usw.) weiterleitet.
MiNiFi C2 Server (MiNiFi Command & Control) ist ein weiteres Apache NiFi-Teilprojekt, das sich noch in der Entwicklung befindet. Seine Aufgabe ist es, der zentrale Punkt bei der Konfiguration von Hunderten und Tausenden von MiNiFi-Agenten zu sein, die vor Ort produziert werden (verschiedene Hallen, Fabriken, Gebiete). Der C2-Server verwaltet MiNiFi-Stream-Konfigurationen (in der C2-Terminologie - versionierte Anwendungsklasse) und veröffentlicht sie über die Rest-API. MiNiFi-Agenten können mit einer bestimmten Häufigkeit eine Verbindung zu dieser API herstellen, um ihre eigene Konfiguration zu aktualisieren.
Beginnen wir also mit der Erstellung unseres Prototyps.
Domain Name Agreement
Für die weitere Konfiguration der verschiedenen Systeme, die sich gegenseitig kontaktieren sollen, vereinbaren wir die Domänennamen, die wir in den Konfigurationen verwenden werden.
Himbeer-Pi-Vorbereitung: MQTT und MiNiFi
Führen Sie die folgenden Befehle auf Ihrem Raspberry Pi aus, um den MQTT Mosquitto-Broker und den MiNiFi-Agenten zu installieren.
Standardmäßig enthält MiNiFi einen minimalen Satz von Datenhandlern. Sie können zusätzliche Handler aus dem NiFI-Kit hinzufügen, indem Sie dem Bibliotheksverzeichnis ein NAR-Archiv (NiFi-Archiv) hinzufügen.
Mit dem letzten Befehl fügen wir den NAR MQTT-Handler hinzu.
sudo apt-get update
Installieren wir nun den MiNiFi C2-Konfigurationsverwaltungsserver auf dem Server, der mit dem Raspberry Pi verfügbar sein wird
Installation und Konfiguration des MiNiFi C2-Servers.
Installieren Sie den MiNiFi C2-Server auf einem öffentlichen Server, der für MiNiFi-Agenten verfügbar ist. Sie können die hierarchische Verteilung von C2-Servern für komplexe Netzwerkinfrastrukturen verwenden, wie unten beschrieben. Führen Sie den folgenden Befehl aus, um den C2-Server zu installieren:
wget http://apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-c2-0.4.0-bin.tar.gz tar -xvf minifi-c2-0.4.0-bin.tar.gz cd minifi-c2-0.4.0
- Der C2-Server veröffentlicht die klassenorganisierte Konfiguration. C2 unterstützt steckbare „Konfigurationsanbieter“:
- Der CacheConfigurationProvider, der die Konfiguration basierend auf der im Dateisystem oder in S3 angegebenen Konfiguration aktualisiert
- Der DelegatingConfigurationProvider, der die Delegierung an einen anderen C2-Server übergibt, um hierarchische Strukturen von C2-Servern zu erstellen.
- Der NiFiRestConfigurationProvider, der Vorlagen von Apache NiFi-Servern über ihre REST-API entfernt.
Wir konfigurieren den C2-Server so, dass NiFi als Konfigurationsanbieter verwendet wird. Bearbeiten Sie die Datei ./conf/minifi-c2-context.xml und kommentieren Sie den XML-Block aus
<bean class="org.apache.nifi.minifi.c2.provider.nifi.rest.NiFiRestConfigurationProvider">
und notieren Sie sich die Adresse des NiFi-Servers ( http: //nifi.iot.local: 8080 ).
<constructor-arg> <value>http://nifi.iot.local:8080/nifi-api</value> </constructor-arg>
Weitere Konfiguration von MiNiFi auf dem Raspberry Pi
Um Handler und ihre Konfigurationen hinzuzufügen, müssen Sie standardmäßig die Konfiguration ./conf/config.yml bearbeiten. Die Konfiguration kann auch manuell geschrieben oder über die Apache NiFi-Benutzeroberfläche erstellt und anschließend als Vorlage exportiert werden. Eine Vorlage ist eine XML-Datei, die mit dem MiNiFi-Toolkit in eine MiMLiFi-YML-Konfigurationsdatei konvertiert werden muss. Hier ist eine Beispielkonfigurationsdatei, die die Datei auf dem Gerät überwacht und jede neue Leitung mithilfe des S2S-Protokolls an NiFi weiterleitet.
Für unser Projekt verwenden wir keine manuelle Abstimmung. Wenn es viele MiNiFi-Agenten gibt, ist es nicht einfach, die Datei config.yml manuell zu stoppen, zu bearbeiten und den Agenten jedes Mal neu zu starten, wenn sich die Konfiguration ändert.
MiNiFi verwendet Change Ingestor, mit dem der Agent neue mögliche Konfigurationen erfährt. Change Ingestor ist ein Plug-In, und es gibt drei ChangeIngestor, die von MiNiFi nativ unterstützt werden.
- FileChangeIngestor
- RestChangeIngestor
- PullHttpChangeIngestor
Wir werden PullHttpChangeIngestor verwenden, um regelmäßig auf den C2-Server zuzugreifen und die neue Konfiguration herunterzuladen. Um diesen Ingestor zu konfigurieren, müssen Sie die Datei ./conf/bootstrap.conf bearbeiten, die entsprechenden Zeilen auskommentieren und die folgenden Einstellungen vornehmen:
nifi.minifi.notifier.ingestors=org.apache.nifi.minifi.bootstrap.configuration.ingestors.PullHttpChangeIngestor
Mit dieser Konfiguration greift jeder MiNiFi-Agent jede Minute über das REST-API-Protokoll unter http: //minifi-c2.iot.local: 10080 / c2 / config auf den C2-Server zu und fordert eine neue Konfiguration für die Klasse iot-minifi-raspberry-agent an
Ein wichtiger Punkt: Die Frequenz von 1 Minute ist nur zur Demonstration eingestellt. In einer Produktionsumgebung müssen Sie Agenten höchstwahrscheinlich nicht mit einer solchen Häufigkeit aktualisieren.
Bevor Sie den Agenten starten, wechseln Sie zur Steuerungsebene und konfigurieren den MiNiFi C2-Server und Apache NiFi selbst.
Installieren und Konfigurieren eines NiFi-Servers
Installieren Sie den NiFi-Server, auf den vom C2-Server aus zugegriffen werden kann, und starten Sie ihn.
wget http://apache.crihan.fr/dist/nifi/1.6.0/nifi-1.6.0-bin.tar.gz tar -xvf nifi-1.6.0-bin.tar.gz cd nifi-1.6.0 ./bin/nifi.sh start
Stellen Sie unter http: // nifi-dev: 8080 / nifi / eine Verbindung zur NiFi-Schnittstelle her und erstellen Sie einen Flow, der auf MiNiFi-Agenten ausgeführt wird. Fügen Sie jedoch zuvor den Eingangsport (hinzugefügt durch Drücken der Schaltfläche Eingangsport im Menü) in der Stammschicht hinzu und benennen Sie ihn von Raspberry MiNiFi. Hier empfängt NiFi Stream-Dateien von MiNiFi.
Fügen Sie Trichter hinzu und verbinden Sie den Eingangsanschluss mit Trichter. In zukünftigen Artikeln werden wir uns mit der Datenverarbeitung auf der Apache NiFi-Seite befassen.
Fügen Sie einen Processor consumerMQTT hinzu, um den Mosquitto-Broker zu abonnieren, und abonnieren Sie ihn für alle Themen

Verwenden Sie das Processor UpdateAttribute, um das Attribut "version" hinzuzufügen, mit dem wir das System über die Neukonfiguration benachrichtigen. Sie können zusätzliche Attribute hinzufügen: Zeitstempel, Standort, Agentenname usw.

Fügen Sie abschließend die Remote Process Group (RPG) hinzu, um empfangene Ereignisse an NiFi zu senden. Kombinieren Sie alle drei Prozesse.

Ihr Stream sollte jetzt wie im folgenden Screenshot aussehen. Der linke Stream wird auf Apache NiFi selbst gestartet und empfängt Daten von Apache MiNiFi. Der rechte Thread startet nicht in Apache Nifi, das für Prototyping- und Konfigurationszwecke erstellt wurde, und läuft auf dem Raspberry Pi.

Speichern Sie den richtigen Stream als Vorlage mit dem Namen "iot-minifi-raspberry-agent.v1". Das Namensprinzip ist hier äußerst wichtig. Wir müssen denselben Namen wie den in der MiNiFi-Konfiguration verwendeten Klassennamen verwenden.
Es ist sehr wichtig - Sie müssen nicht nur die gespeicherten Komponenten hervorheben, sondern auch die Beziehungen zwischen ihnen.

Platzierung und Start der Anwendung
Bevor Sie die MiNiFi-Agenten auf dem Raspberry Pi starten, überprüfen Sie, ob der C2-Server korrekt konfiguriert ist. Öffnen Sie die URL in Ihrem Browser: http: // c2-server: 10080 / c2 / config? Class = iot-minifi-raspberry-agent & version = 1 Der C2-Server sollte mit einer Datei antworten, die die Konfiguration der Vorlage enthält, die wir im YML-Format erstellt haben.

Wenn der Server anstelle der Konfiguration eine Java-Ausnahme auslöst, tritt auf dem hier genannten C2-Server ein Problem auf:
https://github.com/apache/nifi-minifi/pull/126#issuecomment-388856304
Sie müssen entweder Version 0.3.0 installieren oder die Datei javax.ws.rs-api-2.1.jar aus dem Ordner lib des C2-Serververzeichnisses entfernen.
Wenn Sie sich die C2-Serverprotokolle ansehen, können Sie sehen, dass der Server die Anforderung mit den Parametern {class = [iot-minifi-raspberry-agent], version = [1]} akzeptiert hat.

Nachdem die Verbindung zwischen den einzelnen Architekturkomponenten (MQTT, MiNiFi, NiFi und C2) hergestellt wurde, starten Sie den MiNiFi-Agenten auf dem Raspberry Pi mit dem folgenden Befehl:
./bin/minifi.sh start
Nach einigen Sekunden sollten die C2-Serverprotokolle angezeigt werden. Der Host 192.168.1.50 (in unserem Fall die IP-Adresse des Raspberry Pi-Geräts) forderte den C2-Server auf, die neueste Version der Klasse „iot-minifi-raspberry-agent“ bereitzustellen. Im Vergleich zu unserer vorherigen Anfrage, die wir im Browser gestellt haben, können Sie feststellen, dass MiNiFi die Version nicht angegeben hat. Wenn Sie die Konfiguration des MiNiFi-Agenten in ./conf/config.yml öffnen, wird dieselbe Konfiguration angezeigt, die wir im Browser erhalten haben, und die Anforderung wird manuell festgelegt.

MQTT zeigt, dass der MiNiFi-Agent mit dem Broker verbunden ist und die Themen iot / sensor / # abonniert hat

Getriebesteuerung
Großartig, jetzt lassen Sie unsere Sensoren Daten generieren und in MQTT veröffentlichen. MiNiFi beginnt mit dem Hochladen von Informationen und dem Senden an NiFi, wie im folgenden Screenshot gezeigt.
Wichtig: Damit die Apache NiFi-Komponente funktioniert, müssen Sie auf die Schaltfläche Wiedergabe klicken.

Schauen wir uns nun einen dieser Beiträge in NiFi an. Die Informationen stammen vom Sensor „iot / sensors / LightIntensity / z“, Anwendungsversion - 1

MiNiFi-Konfigurationsupdate
Nachdem unsere Infrastruktur funktioniert und die Daten in unser „Rechenzentrum“ gelangen, installieren wir eine neue MiNiFi-Konfiguration. Gehen Sie zur Apache NiFi-Oberfläche und bearbeiten Sie den updateAttribute-Handler. Ändern Sie das Attribut "version" in 2 anstelle von 1 und speichern Sie die neue Vorlage "iot-minifi-raspberry-agent.v2". Das ist alles. Die neue Konfiguration wird automatisch bereitgestellt.
Sie können in den C2-Serverprotokollen nachsehen, dass eine neue Version von V2 erkannt wurde. Der Server hat sie nicht in seinem Cache gefunden und geladen.

Dann erkennt MiNiFi die neue Konfiguration, reserviert die vorherige Konfiguration, entlädt die neue und startet neu:

Im nächsten Artikel werden wir darüber sprechen, wie wir die Sensoren zusammengebaut und in unsere Architektur integriert haben. Danach werden wir über die Datenanalyse sprechen.