Πώς να δημιουργήσετε ένα σύστημα IIoT χρησιμοποιώντας Apache NiFi, MiNiFi, C2 Server, MQTT και Raspberry Pi

Πόσο καιρό πιστεύετε ότι χρειάζεται για να δημιουργήσετε ένα προηγμένο βιομηχανικό πρωτότυπο IoT που μπορεί:

  • Συλλέξτε δεδομένα από αισθητήρες σε πύλη σε κάθε εργοστάσιο
  • Μετακίνηση δεδομένων αισθητήρων από ένα ή περισσότερα εργοστάσια στο Cloud ή στο Data Center
  • Αυτόματη ζεστή ανάπτυξη νέων διαμορφώσεων σε όλες τις άκρες συσκευές
  • Υποστήριξη όγκου δεδομένων μεγάλης κλίμακας και ασφάλειας από άκρο σε άκρο

Με το σωστό εργαλείο, μπορείτε να δημιουργήσετε ένα τέτοιο σύστημα σε λιγότερο από μία ώρα! Σε αυτήν την ανάρτηση ιστολογίου, θα σας δείξω πώς να εφαρμόσετε ένα προηγμένο πρωτότυπο IIoT χρησιμοποιώντας υλικό Raspberry Pi και λογισμικά ανοιχτού κώδικα (μεσίτης MQTT, Apache NiFi, MiNiFi και MiNiFi C2 Server). Θα επικεντρωθώ στην αρχιτεκτονική, τη συνδεσιμότητα, τη συλλογή δεδομένων και την αυτόματη επαναδιαμόρφωση.

Αυτό το άρθρο προορίζεται να είναι η αρχή μιας σειράς άρθρων για το IoT. Η επεξεργασία Edge και η ανάλυση δεδομένων θα αποτελέσουν το αντικείμενο των ακόλουθων άρθρων, οπότε μείνετε συντονισμένοι :)

Βιομηχανική αρχιτεκτονική IoT

Υπάρχουν πολλές αρχιτεκτονικές αναφοράς IoT. Συχνά, σε βιομηχανικές ρυθμίσεις, δεν έχετε άμεση πρόσβαση σε αισθητήρες και συστήματα ελέγχου. Μια πύλη χρησιμοποιείται για να γεφυρώσει το OT και τον κόσμο της πληροφορικής. Για το λόγο αυτό, η αρχιτεκτονική IIoT περιλαμβάνει συχνά συσκευές αιχμής, πύλες, περιφερειακούς κόμβους και, τέλος, συστήματα αποθήκευσης / επεξεργασίας.

Η παρακάτω εικόνα δείχνει την παγκόσμια αρχιτεκτονική του συστήματός μας και τα εργαλεία λογισμικού που θα χρησιμοποιήσουμε σε κάθε επίπεδο.

Στο επίπεδο της άκρης , οι αισθητήρες συλλέγουν πληροφορίες για τον ψηφιακό κόσμο και τις στέλνουν σε μια πύλη μέσω μιας ποικιλίας ενσύρματων και ασύρματων πρωτοκόλλων (Serial, RS-485, MODBUS, CAN bus, OPC UA, BLE, WiFi και ούτω καθεξής). Στο παράδειγμά μας, θα χρησιμοποιήσουμε διάφορους αισθητήρες (φως, θερμοκρασία, κάμερες, επιταχυνσιόμετρα και ούτω καθεξής) που στέλνουν δεδομένα στην πύλη μέσω WiFi.

Η πύλη είναι ένα Raspberry Pi που εκτελεί έναν Mosquitto Broker και έναν πράκτορα MiNiFi. Το Mosquitto είναι ένας ανοιχτός μεσίτης, ελαφρύς μεσίτης ανταλλαγής μηνυμάτων που χρησιμοποιούμε για την έκθεση δεδομένων αισθητήρων μέσω του πρωτοκόλλου MQTT. Το MQTT έχει ελάχιστο αποτύπωμα που το καθιστά κατάλληλο για εφαρμογές IoT και περιορισμένο πόρο υλικού, όπως τηλέφωνα ή μικροελεγκτές.

Το Apache MiNiFi - ένα υποέργο του Apache NiFi - είναι ένας ελαφρύς παράγοντας που εφαρμόζει τα βασικά χαρακτηριστικά του Apache NiFi, εστιάζοντας στη συλλογή δεδομένων στην άκρη.

Οι στόχοι σχεδιασμού MiNiFi είναι: μικρό μέγεθος και χαμηλή κατανάλωση πόρων, κεντρική διαχείριση των πρακτόρων και ευφυΐα. Το MiNiFi μπορεί εύκολα να ενσωματωθεί με το NiFi μέσω του πρωτοκόλλου Site-to-Site (S2S) για τη δημιουργία μιας λύσης διαχείρισης ροής από άκρο σε άκρο που είναι επεκτάσιμη, ασφαλής και παρέχει πλήρη αλυσίδα φύλαξης πληροφοριών (προέλευση).

Στο σύστημά μας, το MiNiFi θα εγγραφεί σε όλα τα θέματα του μεσίτη Mosquitto και θα προωθήσει κάθε νέο μήνυμα στο NiFi σε περιφερειακό επίπεδο. Μπορούμε επίσης να το χρησιμοποιήσουμε για σύνδεση στο σύστημα SCADA ή σε οποιονδήποτε άλλο πάροχο δεδομένων OT

Σε περιφερειακό επίπεδο, έχουμε δύο στοιχεία:

Το Apache NiFi είναι μια ισχυρή πλατφόρμα ροής δεδομένων με περισσότερους από 200 εξωσυγχρονισμένους συνδέσμους. Χάρη στη διεπαφή χρήστη, ο σχεδιασμός ροών δεδομένων γίνεται γρήγορος και εύκολος.

Το NiFi δεν ανταλλάσσει δύναμη για απλότητα. Πράγματι, είναι ένα εξαιρετικά επεκτάσιμο κατανεμημένο σύστημα με εγγυημένη παράδοση, αντίθλιψη και διανομή φορτίου. Αυτές οι δυνατότητες καθιστούν το NiFi ένα εξαιρετικό εργαλείο για εφαρμογές IoT όπου η ποιότητα του δικτύου μπορεί να είναι δύσκολη.

Στο σύστημά μας, το NiFi διαδραματίζει τον κεντρικό ρόλο της συλλογής δεδομένων από κάθε εργοστάσιο και της δρομολόγησης σε διάφορα συστήματα και εφαρμογές (HDFS, HBase, Kafka, S3 και ούτω καθεξής).

Ο διακομιστής MiNiFi C2 (MiNiFi Commande & Control) είναι ένα άλλο υποέργο του Apache NiFi που βρίσκεται υπό ανάπτυξη. Ο ρόλος του είναι να παρέχει ένα κεντρικό σημείο διαμόρφωσης σε εκατοντάδες ή χιλιάδες πράκτορες MiNiFi στην άγρια ​​φύση. Ο διακομιστής C2 διαχειρίζεται κατηγορίες εφαρμογών με έκδοση (διαμορφώσεις ροής MiNiFi) και τις εκθέτει μέσω ενός API ανάπαυσης. Οι πράκτορες MiNiFi μπορούν να συνδεθούν σε αυτό το API σε καθορισμένη συχνότητα για να ενημερώσουν τη διαμόρφωσή τους.

Μόλις τα δεδομένα μεταφερθούν στους διακομιστές της εταιρείας, στο Cloud ή στο Data Center , υπάρχει ένα μεγάλο σύνολο εφαρμογών που μπορούν να εφαρμοστούν. Παρακολούθηση σε πραγματικό χρόνο, ανάλυση και βελτιστοποίηση διεργασιών ή πρόβλεψη συντήρησης είναι μερικά παραδείγματα. Η επεξεργασία δεδομένων και η εφαρμογή περίπτωσης χρήσης θα συζητηθούν σε μελλοντικό άρθρο.

Εφαρμογή συστήματος

Ας αρχίσουμε να χτίζουμε το πρωτότυπό μας.

Προετοιμασία του Raspberry Pi: MQTT και MiNiFi

Για να εγκαταστήσετε τον μεσίτη Mosquitto MQTT και τον πράκτορα MiNiFi, εκτελέστε τις ακόλουθες εντολές στο Raspberry Pi.

Για να έχει μικρό μέγεθος, το MiNiFi είναι συσκευασμένο με ένα ελάχιστο σύνολο προεπιλεγμένων επεξεργαστών. Είναι δυνατόν να προσθέσετε οποιονδήποτε επεξεργαστή NiFi αναπτύσσοντας το NAR (Αρχείο NiFi) στον κατάλογο lib. Στην τελευταία εντολή του παρακάτω μπλοκ, προσθέτω το NAR του επεξεργαστή MQTT.

sudo apt-get update#install and run Mosquitto broker on default port 1883sudo apt-get install mosquittomosquitto#install and prepare MiNiFi agentwget //apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-0.4.0-bin.tar.gztar -xvf minifi-0.4.0-bin.tar.gzcd minifi-0.4.0#add mqtt processorwget //github.com/ahadjidj-hw/NiFi/raw/master/nifi-mqtt-nar-1.5.0.nar -P ./lib/

Από προεπιλογή, η διαμόρφωση ενός πράκτορα MiNiFi απαιτεί την επεξεργασία του αρχείου ./conf/config.yml για να συμπεριλάβει τη λίστα των χρησιμοποιημένων επεξεργαστών και τις διαμορφώσεις τους. Η διαμόρφωση μπορεί να γραφτεί χειροκίνητα ή να σχεδιαστεί χρησιμοποιώντας το NiFi UI και να εξάγει τη ροή ως πρότυπο. Το πρότυπο είναι ένα αρχείο XML που πρέπει να μετατρέψουμε σε ένα αρχείο YML με το κιτ εργαλείων MiNiFi. Ακολουθεί ένα παράδειγμα αρχείου διαμόρφωσης που παρακολουθεί ένα αρχείο και στέλνει κάθε γραμμή σε ένα απομακρυσμένο NiFi μέσω S2S.

Για το έργο μας, δεν θα χρησιμοποιήσουμε αυτά τα χειροκίνητα βήματα. Με πολλούς πράκτορες MiNiFi που λειτουργούν σε γεωγραφικά κατανεμημένα εργοστάσια, δεν είναι δυνατόν να σταματήσετε χειροκίνητα, να επεξεργαστείτε το config.yml και, στη συνέχεια, να κάνετε επανεκκίνηση κάθε πράκτορα κάθε φορά που χρειάζεται να αλλάξει η διαμόρφωσή τους.

Το MiNiFi χρησιμοποιεί ένα "Change Ingestor" μέσω του οποίου ο πράκτορας ενημερώνεται για μια πιθανή νέα διαμόρφωση. Οι απορροφητές αλλαγής είναι ενσωματωμένες μονάδες, και επί του παρόντος υποστηρίζονται τρεις απορροφητές OOTB:

  • FileChangeIngestor
  • RestChangeIngestor
  • PullHttpChangeIngestor

Θα χρησιμοποιήσουμε ένα PullHttpChangeIngestor για να ρωτήσουμε έναν διακομιστή C2 κάθε χρονική περίοδο και να κατεβάσουμε οποιαδήποτε νέα διαμόρφωση είναι διαθέσιμη. Για να ρυθμίσετε αυτήν την απορρόφηση, επεξεργαστείτε το αρχείο ./conf/bootstrap.conf, αποσυνδέστε τις αντίστοιχες γραμμές και ορίστε τις ιδιότητες απορρόφησης ως εξής:

nifi.minifi.notifier.ingestors=org.apache.nifi.minifi.bootstrap.configuration.ingestors.PullHttpChangeIngestor
# Hostname on which to pull configurations from
nifi.minifi.notifier.ingestors.pull.http.hostname=c2-server
# Port on which to pull configurations from
nifi.minifi.notifier.ingestors.pull.http.port=10080
# Path to pull configurations from
nifi.minifi.notifier.ingestors.pull.http.path=/c2/config
# Query string to pull configurations with
nifi.minifi.notifier.ingestors.pull.http.query=class=iot-minifi-raspberry-agent
# Period on which to pull configurations from, defaults to 5 minutes if commented out
nifi.minifi.notifier.ingestors.pull.http.period.ms=60000

Με αυτήν τη διαμόρφωση, κάθε πράκτορας MiNiFi θα υποβάλλει ερώτηση για το C2 Server REST API στο // c2-server: 10080 / c2 / config κάθε 1 λεπτό και θα ζητά την τελευταία διαμόρφωση για την κατηγορία "iot-minifi-raspberry-agent".

Σημείωση: η συχνότητα 1 λεπτού είναι μόνο για σκοπούς επίδειξης. Δεν θα ενημερώνετε τους αντιπροσώπους σας τόσο συχνά.

Μην ξεκινήσετε τον πράκτορά σας τώρα και ας προχωρήσουμε στο περιφερειακό επίπεδο και διαμορφώστε το διακομιστή MiNiFi C2 και το NiFi.

Εγκατάσταση και διαμόρφωση του διακομιστή MiNiFi C2

Εγκαταστήστε το διακομιστή MiNiFi C2 σε δημόσιο διακομιστή που είναι προσβάσιμος από τους πράκτορες MiNiFi. Μπορείτε να χρησιμοποιήσετε την ιεραρχική ανάπτυξη C2 για εφαρμογές περιορισμένου δικτύου, όπως περιγράφεται μερικές γραμμές παρακάτω. Εκτελέστε την ακόλουθη εντολή για να εγκαταστήσετε τον διακομιστή C2:

wget //apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-c2-0.4.0-bin.tar.gztar -xvf minifi-c2-0.4.0-bin.tar.gzcd minifi-c2-0.4.0

Ο διακομιστής C2 εκθέτει τις εφαρμογές MiNiFi μέσω ενός REST API που οργανώνεται από τάξεις. Το C2 υποστηρίζει συνδέσμους "Providers διαμόρφωσης" και υποστηρίζει προς το παρόν:

  • The CacheConfigurationProvider, whichlooks at the directory on the filesystem or on S3
  • The DelegatingConfigurationProvider, which delegates to another C2 server to allow for hierarchical C2 structures
  • The NiFiRestConfigurationProvider, which pulls templates from a NiFi instance over its REST API

Configure the C2 Server to use NiFi as a configuration provider. Edit the file ./conf/minifi-c2-context.xml and provide the NiFi server address //nifi-dev:8080

Installing and configuring the NiFi Server

Install NiFi on a server reachable from the C2 server and run it.

wget //apache.crihan.fr/dist/nifi/1.6.0/nifi-1.6.0-bin.tar.gztar -xvf nifi-1.6.0-bin.tar.gzcd nifi-1.6.0./bin/nifi.sh start

Let’s connect to the NiFi UI at //nifi-dev:8080/nifi/ and create the flow that will run in the MiNiFi agents. But before this, add an input port to the root canvas and name it “from Raspberry MiNiFi”. This is where NiFi will receive flow files from MiNiFi.

Add a consumeMQTT processor to subscribe to the Mosquitto broker and subscribe to all topics under iot/sensors. Note that the tcp://raspberrypi:1883 here is equivalent to tcp://localhost:1883, since this flow will be running on the Raspberry Pi.

Use an UpdateAttribute processor to add a “version” attribute that we will use to show the re-configuration feature. You can add any attribute you want: timestamp, agent name, location, and so on.

And finally, add a Remote Process Group (RPG) to send the consumed events to NiFi. Connect these three processors.

Your flow now looks like the below screenshot. The left flow will be running in NiFi to receive data from MiNiFi. The right flow here is only for design and will effectively run on each Raspberry Pi.

Save the right flow as a template under the name “iot-minifi-raspberry-agent.v1”. The naming convention here is very important. We must use the same name as the class name used in the MiNiFi bootstrap configuration.

Deploy and start the application

Before starting the MiNiFi agents on the Raspberry Pi, let’s see if the C2 server is well configured. Open the following URL in your web browser : //c2-server:10080/c2/config?class=iot-minifi-raspberry-agent&version=1 . The C2 Server replies with a file containing the configuration of the template we built, in YML format . That’s great.

If you look to the C2 logs, you can see that the server received a query with the parameters {class=[iot-minifi-raspberry-agent], version=[1]}

Now that communication between the different components of the architecture (MQTT, MiNiFi, NiFi and C2) is working, start the MiNiFi agent on the Raspberry Pi with the command:

./bin/minifi.sh start

After a few seconds, you see the following C2 server logs. The host 192.168.1.50 (this is the Raspberry Pi’s IP address) asked the C2 server to give it the latest version of the class “iot-minifi-raspberry-agent”. Compared to our previous call with the web browser, you’ll notice that the MiNiFi agent didn’t specify a version. If you open now the MiNiFi agent configuration at ./conf/config.yml you will find the same conf file that we retrieved from the C2 Rest API.

Also, the MQTT shows that the MiNiFi agent connected to the broker and subscribed to the topics iot/sensors/#

Perfect! The IIoT system is running like a charm. Now let’s start our sensors to generate data and publish it in MQTT. MiNiFi will then start consuming data and sending it to NiFi as shown in the following screenshot where we have received 196 messages.

Now let’s inspect one of these messages with the provenance feature of NiFi. This data comes from the light sensor “iot/sensors/LightIntensity/z” and the application version is 1.

Automagic Warm Redeploy

Now that our IIoT is running and data is flowing from every factory to our data center, let’s deploy a new application. For our test, we will make a minor modification to our MiNiFi agent configuration. Go to the NiFi web UI and edit the updateAttribute processor. Set the “version” attribute to 2 instead of 1 and save the flow in a new template “iot-minifi-raspberry-agent.v2”. That’s all! The new application will be automagically deployed.

You can see the C2 server logs below showing that a new version V2 was detected. The C2 server does not have this version in its cache and start a download and conversion process.

Then, the MiNiFi agents detect the new configuration, backup the previous configuration, deploy the new one, and restart.

Now let’s look to the data coming from the agents. As you can see in the provenance UI below, this data comes from a Gyroscope and has an application version 2.

Conclusions

Apache NiFi and its eco-system (MiNiFi and C2 server) are powerful tools for end-to-end IoT data management. It can be used to easily and quickly build advanced IoT applications with flexible architectures and advanced features (automatic warm deploy, data provenance, backpressure, and so on).

Σε μελλοντικά άρθρα, θα σας δείξω πώς να χρησιμοποιήσετε αυτά τα δεδομένα, να ασφαλίσετε την πλατφόρμα και να εφαρμόσετε προηγμένα σενάρια επεξεργασίας αιχμής. Στο μεταξύ, μπορείτε να διαβάσετε αυτό το άρθρο σχετικά με το πώς η Renault, μια πολυεθνική εταιρεία κατασκευής αυτοκινήτων, χρησιμοποιεί το Apache NiFi σε έργα IIoT και ποιες είναι οι βέλτιστες πρακτικές που υιοθέτησαν.

Ευχαριστώ για την ανάγνωση. Όπως πάντα, τα σχόλια και οι προτάσεις είναι ευπρόσδεκτα.

Εάν βρήκατε αυτό το άρθρο χρήσιμο, δώστε του μερικά χτυπήματα και ακολουθήστε με για περισσότερα άρθρα Big Data και IoT!