BLOG

Überwachung von IoT-Geräten mit Heartbeats und MQTT-Gateways

Christian Fröhlingsdorf
September 2, 2020
Table of Contents:

Bei der Arbeit mit IoT (Internet of Things) Geräten ist eines der Hauptprobleme, den Zustand aller Installationen im Auge zu behalten. In den meisten Fällen, insbesondere bei kleineren Geräten, werden die Anwendungen (Firmwares) einmalig während der Einrichtung geflasht und bleiben dann für eine lange Zeit an ihrem Einsatzort unberührt. Auch wenn Ihre Flotte OTA-Updates (Over-the-Air-Updates) unterstützt, ist es dennoch wichtig, eine flexible Lösung sowohl für die Überwachung als auch für die Konnektivität Ihrer Geräte zu haben - insbesondere beim Einführen neuer Updates.

Eine gute Kombination aus beidem kann erreicht werden, indem man die Herzschläge der Geräte (Liveness-Pings) mit dem MQTT-Protokoll kombiniert. Bei ilert haben wir kürzlich unseren neuen Alarmquellentyp "Herzschläge" angekündigt.

Im Folgenden finden Sie eine Schritt-für-Schritt-Anleitung zur Einrichtung flexibler Herzschlagüberwachung für IoT-Geräte (in diesem Beispiel ESP8266) unter Verwendung von MQTT, dem ilagent-Toolbox und ilert-arduino sowie der iLert-API.

Wenn Sie ein grundlegendes Verständnis für die Programmierung haben, führt Sie diese Anleitung von Null auf Held in Bezug auf esp8266, mqtt und die ilert-arduino-Bibliothek.

Anforderungen

Was in dieser Anleitung verwendet wird:

Wemos D1 Mini (ESP8266)

  • Micro-USB-Kabel (stellen Sie sicher, dass Sie ein gutes Kabel wählen, billige Kabel z.B. von Ladegeräten funktionieren möglicherweise nicht)
  • Macbook mit ESP8266-USB-Treiber (seriell) für MacOS
  • ilert-Konto (kostenloser Plan verfügbar)
  • Visual Studio Code
  • PlatformIO
  • RasperryPI (optional, empfohlen als mqtt-Broker-Host)
wemos d1 mini heartbeats iot mqtt

Anweisungen zur Einrichtung

  • Sie können das Wemos D1 Mini (für den privaten Gebrauch und zum Testen) einfach bei Online-Händlern wie Amazon oder Alibaba erwerben.
  • Holen Sie sich den Treiber für Ihr Betriebssystem und installieren Sie ihn, danach müssen Sie Ihr System neu starten.
  • Laden Sie Visual Studio Code herunter und installieren Sie es.
  • Laden Sie PlatformIO für Visual Studio Code herunter und installieren Sie es.

Öffnen Sie Visual Studio Code und klicken Sie auf das PlatformIO-Symbol in der linken Seitenleiste.

wemos d1 mini heartbeats iot mqtt

Navigieren Sie zu öffnen und wählen Sie das Menü Plattformen. Navigieren Sie in der oberen Leiste zu Embedded und suchen Sie nach espressif82.

wemos d1 mini heartbeats iot mqtt

Klicken Sie auf das Suchergebnis für Espressif8266 und installieren Sie die Plattform auf Ihrem Gerät.

wemos d1 mini heartbeats iot mqtt

Ihr System ist nun bereit für die Entwicklung von esp8266-Anwendungen.

Erstellen und Bereitstellen von Software auf dem esp

Erstellen und Bereitstellen von Software auf dem esp

Erstellen Sie ein neues PlatformIO-Projekt.

Projekt erstellen

wemos d1 mini heartbeats iot mqtt

Wählen Sie Ihr Board, in unserem Fall Wemos D1 Mini Lite als Teil der Espressif8266 Familie.

wemos d1 mini heartbeats iot mqtt

Es wird einige Augenblicke dauern, bis das Projekt eingerichtet ist.

Upload-Einrichtung (Bereitstellung)

Führen Sie einen kurzen Test durch, um zu prüfen, ob alles korrekt funktioniert. Stellen Sie sicher, dass Sie Ihren ESP8266 über das Micro-USB-Kabel mit Ihrem Gerät verbinden. Klicken Sie dann auf das kleine Symbol für die serielle Schnittstelle in der Fußzeile von Visual Studio Code - das serielle Terminal wird angezeigt.

wemos d1 mini heartbeats iot mqtt

Sie sollten die Ports Ihres esp-Geräts sehen können, in unserem Fall /dev/cu.wchusbserial1440 an Port 9.

wemos d1 mini heartbeats iot mqtt

Um die Builds und Uploads auf das esp8266-Gerät etwas zu vereinfachen, werden wir die Datei platformio.ini in Ihrem Projektstamm erweitern.

Derzeit sollte sie wie folgt aussehen:

wemos d1 mini heartbeats iot mqtt

Fügen wir ein paar Parameter hinzu, insbesondere den upload_port unseres Geräts, damit wir die Bereitstellung mit einem einfachen Klick starten können. Aktualisieren Sie Ihre platformio.ini-Datei, so dass sie wie folgt aussieht:


[env:d1_mini_lite]
platform = espressif8266
board = d1_mini_lite
framework = arduino
upload_port = /dev/cu.wchusbserial1440
upload_speed = 115200
monitor_speed = 115200
upload_resetmethod = nodemcu


In Ihrem Fall kann upload_port einen anderen Wert erfordern, abhängig von der Ausgabe des seriellen Terminals vor

Erste Erstellung und Bereitstellung

Klicken Sie auf das Upload-Symbol (Pfeil) in der Fußzeile, um Ihr Projekt zu erstellen und auf dem Gerät bereitzustellen.

wemos d1 mini heartbeats iot mqtt

Sie sollten den Build- und Upload-Vorgang in einem neuen Terminal-Fenster sehen, der mit einer Erfolgsmeldung endet.

wemos d1 mini heartbeats iot mqtt

Nun, da wir wissen, wie wir unsere eigene Software auf dem esp8266 zum Laufen bringen, können wir mit der Einrichtung der Herzschlagüberwachung fortfahren.


Erstellen einer neuen Heartbeat-Alarmquelle


Loggen Sie sich in Ihr ilert-Konto ein oder erstellen Sie ein neues (es ist kostenlos), wenn Sie noch keines haben.


Navigieren Sie zur Registerkarte "Alarmquellen" und erstellen Sie eine neue Alarmquelle.

wemos d1 mini heartbeats iot mqtt

Wählen Sie Heartbeat als Integrationstyp und wählen Sie alle anderen Optionen entsprechend Ihrem Anwendungsfall. Ein 1-Minuten-Intervall erwartet z. B. mindestens alle 59 Sekunden einen Herzschlag, um Ihre Alarmquelle als gesund zu bewerten.

wemos d1 mini heartbeats iot mqtt

Klicken Sie auf "Speichern" und Sie sollten sehen, dass Ihre neue Heartbeat-Warnquelle nun erstellt wurde und sich im Status "Unbekannt" befindet. Das bedeutet, dass sie seit ihrer Erstellung noch nie einen Heartbeat empfangen hat.

wemos d1 mini heartbeats iot mqtt

Sie sollten auch in der Lage sein, die Heartbeat-Warnquelle zu nutzen, indem Sie einfach die gesamte Heartbeat-URL kopieren.

wemos d1 mini heartbeats iot mqtt

Führen Sie einen einfachen curl-Befehl in Ihrem Terminal aus.


curl https://api.ilert.com/api/v1/heartbeats/il1hbt062021ae4d259c79476f1d309a05san213

Sie sollten das richtige Ergebnis für Ihren Heartbeat-Ping sehen.

wemos d1 mini heartbeats iot mqtt

Wenn Sie die Detailseite der Alarmquelle für Ihren Heartbeat neu laden, sollten Sie sehen, dass der Status jetzt auf Gesund geändert wurde.

wemos d1 mini heartbeats iot mqtt

Denken Sie jedoch daran, dass Sie wahrscheinlich den nächsten Heartbeat in ein paar Sekunden verpassen werden, was zu einem Vorfall in Ihrem iLert-Konto führt und Ihren Heartbeat in den Status "Abgelaufen" versetzt. Aber keine Sorge, sobald Ihr IoT-Gerät anfängt, Herzschläge zu senden, wird der Vorfall automatisch behoben und Ihr Heartbeat wird wieder Gesund sein.

Einrichten der Heartbeat-Überwachung mit ilert-arduino

Fügen wir zunächst die ilert-arduino-Bibliothek zu Ihren PlatformIO-Bibliotheken hinzu.

Navigieren Sie zur PlatformIO-Startseite (wie in den Einrichtungsanweisungen gezeigt) und wechseln Sie diesmal zur Registerkarte Bibliotheken.

Suchen Sie nach ilert.

wemos d1 mini heartbeats iot mqtt

Klicken Sie auf das Suchergebnis der ilert-Bibliothek und installieren Sie sie.

wemos d1 mini heartbeats iot mqtt

Wir können nun zu unserem Projekt zurückkehren und die iLert Arduino-Bibliothek verwenden, um Heartbeats zu erzeugen. Öffnen Sie die Datei src/main.cpp im Stammverzeichnis Ihres Projekts.

Erstellen einer einfachen WIFI-Verbindung

Lassen Sie uns zunächst eine grundlegende Einrichtung erstellen, die unseren esp8266 mit einem lokalen WLAN verbindet, sobald er hochfährt.


#include 
#include 

const char SSID[] = "WIFI-SSID";
const char WIFI_HOST[] = "IOT-DEVICE-NAME";
const char WIFI_PASS[] = "WIFI-PASSWORD";
WiFiClient net;

void connect();

/* invoked once during start-up */
void setup() {
    Serial.begin(115200);
    WiFi.hostname(WIFI_HOST);
    WiFi.mode(WIFI_STA);
    connect();
}

/* invoked constantly */
void loop() {

    connect();
    delay(100); // WiFi stability

    /* do things here */
}

/* ensure our wifi connection stays up and running */
void connect() {  

    if(WiFi.status() == WL_CONNECTED) {
        return;
    }

    WiFi.begin(SSID, WIFI_PASS);
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
    }

    Serial.println("\nconnected.");
}



Senden von ilert-Heartbeats über HTTP


Nun, da die Wifi-Verbindung eingerichtet ist, können wir damit beginnen, Heartbeats direkt von unserem Gerät über HTTP(S) und die öffentliche ilert API zu senden.


#include 

// create a new heartbeat instance (you can create multiple if you like)
ILERTHeartbeat heartbeat;

void setup() {

    // configure your heartbeat(s)
    unsigned int heartbeatIntervalSec = 60;
    heartbeat.begin("your-heartbeat-integration-key", heartbeatIntervalSec);
}

void loop() {

    // update heartbeat automatically in loop
    heartbeat.loop();
}


Dazu ist nicht nur eine WLAN-Verbindung, sondern auch ein Internetzugang erforderlich.


Vollständiges Codebeispiel hier.

MQTT

MQTT (oder Message Queuing Telemetry Transport) ist ein leichtgewichtiges Publish-Subscribe-Netzwerkprotokoll, das Nachrichten zwischen Geräten auf der Basis von TCP/IP transportiert. Es ist für Verbindungen mit entfernten Standorten konzipiert, bei denen ein "kleiner Code-Fußabdruck" erforderlich ist oder die Netzwerkbandbreite begrenzt ist.

MQTT Broker

Der Broker fungiert als Postamt. MQTT verwendet nicht die Adresse des Empfängers, sondern die Betreffzeile mit der Bezeichnung "Topic", und jeder, der eine Kopie dieser Nachricht wünscht, abonniert dieses Topic. Mehrere Clients können die Nachricht von einem einzigen Broker empfangen (one to many capability). Gleichermaßen können mehrere Herausgeber Themen an einen einzigen Abonnenten veröffentlichen (many to one).


Jeder Client kann sowohl Daten produzieren als auch empfangen, indem er sie veröffentlicht und abonniert, d. h. die Geräte können Sensordaten veröffentlichen und gleichzeitig Konfigurationsinformationen oder Steuerbefehle empfangen (MQTT ist ein bidirektionales Kommunikationsprotokoll). Dies hilft sowohl bei der gemeinsamen Nutzung von Daten als auch bei der Verwaltung und Steuerung von Geräten.


Einrichten eines Brokers

Für den Fall, dass Sie mit MQTT nicht vertraut sind und noch keinen Broker einsetzen, gibt es eine Vielzahl von Open-Source-Brokern. Um diesen Leitfaden nicht weiter ausufern zu lassen, zeige ich kurz, wie man einen einfachen (ungesicherten) Broker zum Herumspielen startet:

Wechseln Sie in ein beliebiges leeres Verzeichnis Ihrer Wahl und erstellen Sie eine neue Datei touch mqtt-broker.js, in die Sie den folgenden Code einfügen:


const aedes = require("aedes")();
const server = require("net").createServer(aedes.handle);
const port = 1883;

server.listen(port, () => {
  console.log("server started and listening on port ", port);
});


Installieren Sie aedes, einen Node.js-basierten mqtt-Broker, und starten Sie Ihren lokalen mqtt-Broker mit:

aedes benötigt Node.js, um zu laufen


npm install aedes
node ./mqtt-broker.js


Sie haben nun einen einfachen MQTT-Broker laufen, der auf Port 1883 lauscht und der für die nächsten Schritte in dieser Anleitung verwendet werden kann.

Den ilagent als MQTT-Gateway betreiben

Der ilagent ist das Schweizer Taschenmesser im iLert-Universum. Sein Hauptzweck ist es, iLert-Kunden dabei zu helfen, jede Art von existierenden oder nicht existierenden Monitoring-Anwendungsfällen schnell in Betrieb zu nehmen.

wemos d1 mini heartbeats iot mqtt

Installing ilagent

Installation von ilagent

In unserem Fall können wir die Funktionalität von ilagent als Alert-Gateway nutzen, um Nachrichten von lokalen IoT-Geräten in die Cloud weiterzuleiten. ilagent unterstützt derzeit zwei Weiterleitungsmodi für Alert-Ereignisse oder Heartbeats: HTTP und MQTT.

Wir werden den letzteren verwenden, um unser MQTT-Gateway zu erstellen.

ilagent ist für alle gängigen Betriebssysteme verfügbar: Linux, MacOS, Windows und Unix Arm. Auf allen Geräten (außer Windows) können Sie den Agenten einfach mit unserem Einzeilenskript installieren:


curl -sL https://raw.githubusercontent.com/iLert/ilagent/master/install.sh | bash -

Natürlich können Sie die Binärdatei auch hier herunterladen und nach Belieben installieren.

Sie können eine korrekte Installation immer überprüfen, indem Sie ilagent -V in Ihrer Shell ausführen.

Starten des MQTT Gateways

Im Kern weisen wir ilagent an, folgendes zu tun:

daemon run as daemon process (constantly running application)

-m 192. 168.1.14 connect to MQTT broker on host 192.168.1.14

-v -v set log output level to INFO

  • daemon run as daemon process (ständig laufende Anwendung)
  • -m 192.168.1.14 Verbindung zum MQTT-Broker auf dem Host 192.168.1.14
  • -b il1hbtabc123 sendet einen regelmäßigen Heartbeat (etwa jede Minute), um die Betriebszeit des laufenden ilagent-Gateways zu überwachen
  • -v -v Protokollausgabestufe auf INFO setzen

ilagent daemon -m 192.168.1.14 -b il1hbtabc123 -v -v

Sie sollten eine Ausgabe wie diese sehen, die Ihnen mitteilt, dass die Verbindung zu Ihrem MQTT-Broker erfolgreich hergestellt wurde.

wemos d1 mini heartbeats iot mqtt

Wenn Sie den Parameter -b verwenden möchten, sollten Sie eine weitere Heartbeat-Alarmquelle erstellen.

Verwenden Sie nicht dieselbe Alarmquelle für mehrere Alarmherkünfte Sie können auch zusätzliche Optionen angeben, wenn dies für Ihre Umgebung erforderlich ist

  • -q 1883 Port des MQTT-Brokers, mit dem eine Verbindung hergestellt werden soll
  • -n ilert Name des MQTT-Clients
  • -e ilert/events Name des MQTT-Topics, das auf Pipe-Alert-Ereignisse überwacht werden soll
  • -r ilert/heartbeats Name des MQTT-Topics, das auf Pipe-Heartbeats überwacht werden soll

Wenn Sie einen schnellen Weg brauchen, um ilagent als Daemon im Hintergrund laufen zu lassen, können Sie den folgenden Einzeiler wiederverwenden. Beachten Sie jedoch, dass ilagent dadurch nicht automatisch gestartet wird, wenn Ihr Hostsystem neu gestartet wird.


nohup sh -c 'ilagent daemon -m 192.168.1.14 -b il1hbt... -v -v'  > ./ilagent.log 2>&1 &

Sie können den ilagent natürlich auch direkt neben Ihrem Broker auf demselben Rechner laufen lassen (das wird sogar empfohlen).

Einrichten der vermittelten Heartbeat-Überwachung mit MQTT

Nun, da unser MQTT-Gateway läuft, können wir unseren esp8266-Code umschreiben, um Heartbeats und Ereignisse direkt durch den ilagent zu leiten, indem wir ihn als Gateway verwenden, ohne selbst direkt auf das Internet zuzugreifen.

Einrichten einer MQTT-Verbindung

Wir werden unsere grundlegende Wifi-Einrichtung um einen MQTT-Client erweitern, der eine Verbindung zu unserem MQTT-Broker herstellen kann. Wir werden diesen Client verwenden, um Nachrichten, die Heartbeats und Events enthalten, an MQTT-Themen zu senden, die ilagent abonniert hat. ilagent wird sich dann darum kümmern, diese weitergeleiteten Heartbeats und Events zuverlässig an die öffentliche API von ilert zu liefern.


#include 
#include 
#include 

const char MQTT_SERVER[] = "192.168.1.14"; // your MQTT broker host
const int MQTT_SERVER_PORT = 1883;
const char MQTT_CLIENT_NAME[] = "IOT-DEVICE-NAME";
MQTTClient mqttClient(1024);

const char SSID[] = "WIFI-SSID";
const char WIFI_HOST[] = "IOT-DEVICE-NAME";
const char WIFI_PASS[] = "WIFI-PASSWORD";
WiFiClient net;

void connect();

void setup() {
    Serial.begin(115200);
    WiFi.hostname(WIFI_HOST);
    WiFi.mode(WIFI_STA);
    WiFi.begin(SSID, WIFI_PASS);
    mqttClient.begin(MQTT_SERVER, MQTT_SERVER_PORT, net);
    connect();
}

void loop() {

    mqttClient.loop();
    delay(100); // WiFi stability

    if (!mqttClient.connected()) {
        connect();
    }
}

void connect() {  
    delay(10);

    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
    }

    while (!mqttClient.connect(MQTT_CLIENT_NAME)){
        Serial.print(".");
        delay(1000);
    }

    Serial.println("\nconnected.");
}


Senden von Heartbeats über MQTT

Nun, da unsere MQTT-Client-Verbindung steht, können wir beginnen, Heartbeats über mqtt-Nachrichten zu senden. Die ilert-arduino-Bibliothek bietet Methoden, um die erforderlichen MQTT-Nachrichten-Payloads für ilagent zu erstellen.


#include 

ILERTMqtt ilertMqtt;

void sendMQTTHeartbeat() {

    String heartbeatMessage = ilertMqtt.getHeartbeatMessage("heartbeat-alertsource-api-key");

    // proxy heartbeat through mqtt to iLert
    mqttClient.publish(ilertMqtt.getDefaultHeartbeatTopic(), heartbeatMessage);
}

Vollständiges Codebeispiel hier.

Senden von Alarmereignissen über MQTT

Mit dem ilagent mqtt gateway können auch Alarmereignisse über mqtt-Clients gesendet werden. Die Nutzlast bietet die gleichen flexiblen Optionen wie der API-Endpunkt für Ereignisse. Das folgende Beispiel erstellt einen Vorfall mit hoher Priorität in ilert. Ersetzen Sie den ersten Parameter durch den API-Schlüssel der entsprechenden Alarmquelle.


#include 

ILERTMqtt ilertMqtt;

void sendMQTTEvent() {

    String eventMessage = ilertMqtt.getEventMessage(
        "api-alertsource-api-key",
        "ALERT", // ACCEPT, RESOLVE
        "a summary",
        "key123", // incidentKey, optional
        "some more details", // optional
        "{ \"custom\": \"json details\" }", // optional
        "HIGH", // priority, defaults to HIGH
        "https://www.ilert.com/blog/2020-04-30-christian-froehlingsdorf-joins-as-cto", // linkUrl, optional
        "https://www.ilert.com/blog/2020-04-30-christian-froehlingsdorf-joins-as-cto/cto-profile-teaser-2.png" // imageUrl, optional
    );

    // proxy event through mqtt to iLert
    mqttClient.publish(ilertMqtt.getDefaultEventTopic(), eventMessage);
}

Vollständiges Codebeispiel hier.

Fortgeschritten

Beim Verwalten Ihrer Flotte ist es nicht erforderlich, Änderungen in der Benutzeroberfläche vorzunehmen. Sie können ganz einfach alle Ihre Anforderungen mithilfe der REST-API von iLert automatisieren.

Im Folgenden finden Sie ein Beispiel für die einfache Erstellung einer Herzschlagalarmquelle über unsere API. Sie können den API-Schlüssel der Alarmquelle in der Antwort des HTTP-Requests abrufen.

Es ist definitiv möglich, dass Geräte sich selbst bereitstellen und anfangen, Herzschläge zu senden.


curl --location --request POST 'https://api.ilert.com/api/v1/alert-sources' \
--header 'content-type: application/json' \
--header 'Authorization: $Your BASIC or APIKEY credentials here$' \
--data-raw '{
    "name": "A heartbeat alert source",
    "escalationPolicy": {
        "id": "2194773"
    },
    "integrationType": "HEARTBEAT",
    "heartbeat": {
        "summary": "Heartbeat is missing",
        "intervalSec": "60"
    }
}'

Um einen Schritt weiter zu gehen

Wenn Ihnen dieser Einblick in die Welt des IoT und MQTT für Überwachung und Benachrichtigungen gefallen hat und Sie darüber hinausgehen oder es für Ihren Anwendungsfall implementieren möchten, zögern Sie nicht, uns für Unterstützung oder Fragen zu kontaktieren.

Blog-Beiträge, die dir gefallen könnten:

Sind Sie bereit, Ihr Incident-Management zu verbessern?
Start for free
Unsere Cookie-Richtlinie
Wir verwenden Cookies, um Ihre Erfahrung zu verbessern, den Seitenverkehr zu verbessern und für Marketingzwecke. Erfahren Sie mehr in unserem Datenschutzrichtlinie.
Open Preferences
Danke! Deine Einreichung ist eingegangen!
Hoppla! Beim Absenden des Formulars ist etwas schief gelaufen.
Danke! Deine Einreichung ist eingegangen!
Hoppla! Beim Absenden des Formulars ist etwas schief gelaufen.
Danke! Deine Einreichung ist eingegangen!
Hoppla! Beim Absenden des Formulars ist etwas schief gelaufen.