IotMqttSampleAwsIoT

Beispiel zur MQTT Kommunikation mit AWS IoT Core

In diesem Beispiel wird die Kommunikation zum AWS IoT Core Message Broker gezeigt, welcher Bestandteil der AWS IoT Plattform ist. Der Message Broker benötigt eine Authentifizierung via TLS Client-Zertifikat. Als Voraussetzung hierfür, muss das entsprechende Zertifikat erstellt und auf der AWS IoT Plattform bekannt und aktiviert worden sein. Sie können hierbei auf der AWS IoT Management Console selbst-signierte Zertifikate verwenden, oder auch Zertifikate von einer eigenen Certificate Authority (CA) signieren lassen. In letztem Fall muss der eigenen CA entsprechend von der AWS IoT Core Plattform vertraut werden.

IotMqttSampleAwsIoT 1:

Ersteinrichtung von AWS IoT Core

Informationen zur Erstellung und Registrierung von Client-Zertifikaten und der Ersteinrichtung von AWS IoT Core finden Sie in der offiziellen AWS IoT Core Dokumentation. Das dort erstellte und aktivierte Zertifikat wird von den MQTT Funktionsbausteinen verwendet, um eine Verbindung mit dem Message Broker herzustellen. Beachten Sie auch, dass Sie eine gültige AWS IoT Policy mit dem erstellten Zertifikat verknüpft haben. Wir empfehlen auch folgende weiterführende Artikel in der AWS IoT Core Dokumentation:

AWS IoT Core Security and Identity

X.509 Certificates Authentication

IotMqttSampleAwsIoT 2:

Topic-Struktur

Die Topic-Struktur ist beim AWS IoT Core Message Broker mit Einschränkungen frei wählbar. Es gibt bestimmte System-Topics, welche nicht verwendet werden dürfen. Nähere Informationen finden Sie in der AWS IoT Core Dokumentation. Wir empfehlen auch die AWS-Dokumentation zu AWS IoT Core MQTT topic design.

IotMqttSampleAwsIoT 3:

QoS und Retain

AWS IoT Core unterstützt aktuell kein QoS 2, sowie keine Retain-Nachrichten. Um persistente Nachrichten zu speichern, müssen weitere Dienste, wie z. B. AWS IoT Device Shadow oder auch ein Datenbankservice, verwendet werden.

IotMqttSampleAwsIoT 4:

AWS IoT Core Service Limits

Bitte beachten Sie bei der Verwendung von AWS IoT Core auch die Hinweise zu den AWS Service Limits.

In diesem Beispiel werden sowohl Nachrichten an den AWS IoT Core Message Broker versendet als auch von dort empfangen. Da dieses Beispiel im Wesentlichen auf dem Beispiel IotMqttSampleUsingQueue basiert, werden in diesem Abschnitt nur die relevanten Teile zur Verbindungsherstellung mit AWS IoT Core erklärt.

Parameter für Verbindungsaufbau

Das folgende Code Snippet zeigt die notwendigen Parameter für einen Verbindungsaufbau mit AWS IoT Core. Im Wesentlichen handelt es sich hierbei um statische Parameter. Diese können auch im Deklarationsteil bei der Instanziierung des MQTT Client angegeben werden.

Für den Verbindungsaufbau mit AWS IoT Core werden folgende Informationen benötigt.

Parameter

Beschreibung

fbMqttClient.stTLS.sCA

Amazon Root CA Zertifikat, welches von der AWS IoT Management Konsole heruntergeladen werden kann.

fbMqttClient.stTLS.sCert

Zertifikat des Geräts, welches zur Authentifizierung für die Verbindungsherstellung zu AWS IoT benötigt wird. Hierbei können sowohl selbst-signierte Zertifikate als auch CA-signierte Zertifikate verwendet werden. Im Falle von CA-signierten Zertifikaten muss die eigene CA auf der AWS IoT Core Management Konsole als vertrauenswürdig eingestuft werden. Weitere Informationen hierzu entnehmen Sie bitte der AWS IoT Core Dokumentation.

fbMqttClient.stTLS.sKeyFile

Private Key des Geräts.

fbMqttClient.sHostname

Hostname der AWS-IoT-Broker-Instanz

fbMqttClient.nHostPort

Da eine Verbindung mit dem AWS IoT Broker nur via TLS hergestellt werden kann, muss hier der Default MQTT TLS Port verwendet werden (8883).

fbMqttClient.sClientId

Die MQTT ClientID kann dem Thing-Namen entsprechen.

Exponential backoff

Die im Code Snippet gezeigte Verwendung eines Exponential Backoff Algorithmus ist optional, wird jedoch empfohlen, siehe unten.

IF bSetParameter THEN
  bSetParameter := FALSE;
  fbMqttClient.stTLS.sCA := 'c:\TwinCAT\3.1\Config\Certificates\AmazonRootCA1.pem';
  fbMqttClient.stTLS.sCert := 'c:\TwinCAT\3.1\Config\Certificates\7613eee18a-certificate.pem.crt';
  fbMqttClient.stTLS.sKeyFile := 'c:\TwinCAT\3.1\Config\Certificates\7613eee18a-private.pem.key';
  fbMqttClient.sHostName:= 'a35raby201xp77.iot.eu-west-1.amazonaws.com';
  fbMqttClient.nHostPort:= 8883;
  fbMqttClient.sClientId:= 'CX-12345';
  fbMqttClient.ipMessageQueue := fbMessageQueue;
  fbMqttClient.ActivateExponentialBackoff(T#1S, T#30S);
END_IF

Exponential backoff

Um im Falle eines Verbindungsfehlers mit dem Message Broker diesen nicht unnötig mit Verbindungsanforderungen zu belasten, kann auf eine Funktionalität namens "exponential backoff" zurückgegriffen werden. Hierbei wird nach einem TLS-Verbindungsfehler mit dem Message Broker die Reconnect-Rate multiplikativ angepasst. Diese Funktion ist über die Methode ActivateExponentialBackoff() aktivierbar. Die Parameter der Methode geben hierbei die Minimal- und Maximalzeit für den Algorithmus an. Die Minimalzeit beschreibt den Anfangsverzögerungswert für den erneuten Verbindungsversuch. Die Maximalzeit beschreibt den größten Verzögerungswert. Die Verzögerungswerte werden bis zum Erreichen des Maximalwerts verdoppelt. Sobald eine Verbindung hergestellt werden konnte, wird die Backoff-Rate wieder auf den Ursprungswert zurückgesetzt. Über die Methode DeactivateExponentialBackoff() kann diese Funktion auch programmatisch wieder außer Kraft gesetzt werden.

Device Shadow Service

Der AWS IoT Device Shadow Service ermöglicht die persistente Speicherung von Zustandsinformationen eines verbundenen Geräts. Für jedes Gerät wird hierbei ein eigener Shadow verwaltet. Der Shadow eines Geräts ist über MQTT auslese- und aktualisierbar. Hierfür müssen bestimmte System-Topics vom AWS IoT Core verwendet werden. Das folgende Topic ermöglicht zum Beispiel die Aktualisierung des Shadows.

sTopicShadowUpdate : STRING(255) := '$$aws/things/CX-12345/shadow/update';

Die Nachricht die an dieses Topic gesendet wird beschreibt den neuen Shadow des Geräts. Sie wird in JSON Notation angegeben und entspricht hierbei einem bestimmten Format, z. B.:

{
  "state": {
    "reported": {
      "Vendor": "Beckhoff Automation",
      "CpuTemperature": 42,
      "OperatingSystem": "Windows 10"
    }
  }
}

Mit Hilfe der SPS Bibliothek Tc3_JsonXml kann dieses Format erstellt und entsprechend der eigenen Applikation angepasst werden.

In dem hier bereitgestellten SPS-Code wird der Shadow des Geräts einmal beim Start des Beispiels und dann auf Anforderung (abhängig von der Variablen bUpdateShadow) aktualisiert.

Für weitere Informationen zum AWS IoT Device Shadow Service, der dort verwendeten Topics und Datenformate, konsultieren Sie die AWS IoT Device Shadow Service Dokumentation.

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken

TwinCAT v3.1.4022.0

IPC oder CX (x86, x64, ARM)

Tc3_IotBase,
Tc2_Utilities (>= v3.3.19.0)