IT

Amazon AWS IoT: Test mit MQTT

AWS IoT

Gelegentlich nutze ich Dienste vom Amazon AWS. Aus der stattlichen Liste von Diensten habe ich das Internet-of-Things kurz angeschaut. AWS IoT bietet (Zitat):

AWS IoT ist eine Plattform, über die Sie Geräte mit AWS Services und anderen Geräten verbinden, Daten und Interaktionen schützen, Gerätedaten verarbeiten und als Grundlage verwenden können. Außerdem ermöglicht sie die Interaktion von Anwendungen mit Geräten, auch wenn diese offline sind.

Dieser Blog ist als Serie vorgesehen. In einem ersten Schritt habe ich eine Demo gebaut, die Meldungen von einem MQTT Windows Client empfängt und diese in einer Datei auf Amazon S3 speichert. In einem nächsten Schritt möchte ich von einem Arduino Yun, Raspberry Pi oder ESP8266 aus Daten absenden (SDK mit Anleitung). Es muss nicht gerade eine coole Ballon-Mission sein (hier und hier).

Auf der Amazon Seite sind viele Informationen zu finden. Wir folgen dem Quickstart: https://docs.aws.amazon.com/iot/latest/developerguide/iot-quickstart.html mit den folgenden Schritten:

  1. AWS IoT registrieren und eine verschlüsselte CLI Verbindung erstellen
  2. ein Device erzeugen
  3. die Verbindung vom Device zu AWS IoT verschlüsseln
  4. einen MQTT Client installieren und Daten schicken
  5. Regel erstellen, die MQTT Telegramme als Datei in S3 ablegt

Voraussetzungen

  • AWS Account mit IoT und S3 eingerichtet
  • AWS Client (AWSCLI64.msi)
  • OpenSSL für Windows (Win32OpenSSL_Light-1_0_2e.exe)
  • mosquitto Client für Windows (mosquitto-1.4.5-install-win32.exe)

 

clip_image001.png

AWS IoT registrieren und eine verschlüsselte CLI Verbindung erstellen

http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
Sollte nicht schon eine CLI Verbindung vorhanden sein, ist die AWSCLI64.msi zu installieren und zu konfigurieren.

clip_image002.png

clip_image003.png

 Ein Device („Thing“) erzeugen

https://docs.aws.amazon.com/iot/latest/developerguide/create-thing.html
Mit der verschlüsselten CLI ins AWS arbeiten wir jetzt daran, eine logisches Objekt für den Endpunkt zu erstellen, ein sogenanntes „thing“. Der Name thingName ist nur ein Handle, die thingArn muss man sich bereithalten und notieren für später.

clip_image004.png
clip_image005.png

Die Verbindung vom Device zu AWS IoT verschlüsseln

https://docs.aws.amazon.com/iot/latest/developerguide/secure-communication.html
Man generiert jetzt ein neues Zertifikat und lädt alle Teile auf den PC herunter:

clip_image006.pngclip_image007.png

Das Zertifikat muss noch aktiviert und mit dem Device verbunden werden:
aws iot create-keys-and-certificate –set-as-active –certificate-pem-outfile cert.pem –public-key-outfile publicKey.pem –private-key-outfile privateKey.pem
clip_image008.png

Das weitere ist etwas kompliziert: zuerst wird eine Policy erzeugt (create-policy), dies dann mit dem Zertifikat verbunden (attach-principal-policy) und dann die Policy dem thing angehängt (attach-thing-principal).

clip_image009.png

Das Policy Dokumenet beschreibt die Berechtigungen:

{
 "Version": "2012-10-17",
 "Statement": [{
 "Effect": "Allow",
 "Action":["iot:*"],
 "Resource": ["*"]
 }]
 }

clip_image010.png

clip_image011.png

Auf der IoT Konsole sieht das so aus:

clip_image012.png

Ausserdem benötigt man das Zertifikat später für den MQTT Client, deshalb wird es lokal abgespeichert (aws-iot-blinkm-dev1-cert.pem). Man wird auch auch das AWS IoT Root Zertifikat benötigen, das man von der AWS Konsole herunterlädt (aws-iot-root-ca.pem).

clip_image013.png

 

MQTT Client installieren und Daten schicken

https://docs.aws.amazon.com/iot/latest/developerguide/verify-pub-sub.html
MSQTT Client beschaffen und installieren; dies setzt OpenSSL Light voraus (z.B..http://slproweb.com/products/Win32OpenSSL.html)

clip_image015.png

clip_image014.png

clip_image016.png

Anstelle eines Java Clients (http://mqttfx.jfx4ee.org//) verwenden wir mosquitto-1.4.5-install-win32.exe. Mit describe-endpoint erhält man die endpointAdress, die im MQTT Client zu verwenden ist. Mit den Zertifikaten hat man alles für die ersten Meldungen.

clip_image017.png

Wir simulieren mehrere Endpunkte, indem wir den MQTT Client wie oben beschrieben noch mindestens auf einem anderen PC installieren und dabei jeweils einen anderen Namen BlinkM-devx-test wählen. Die Meldung „Hello, World“ wird vom MQTT Client mit Namen BlinkM-dev3-test unter dem Topic topic/blinkm-test geschickt und erscheint auf dem 2. MQTT Client BlinkM-dev2-test.

clip_image018.png

clip_image019.png

clip_image020.png

clip_image021.png

Regel erstellen, die MQTT Telegramme als Datei in S3 ablegt

https://docs.aws.amazon.com/iot/latest/developerguide/config-and-test-rules.html
Die nächsten Schritte erfolgen in der AWS IoT Konsole. Bisher sieht man das Device, die Policy und das aktive Zertifikat. Man ertellt eine Rolle (create-role), die zuerst in der AWS IAM erstellt werden muss und die beiden AWS Rollenberechtigungen haben muss. Es ist dazu vorher wieder ein Policy Dokument für die Rolle zu erstellen:

{
 "Version": "2012-10-17",
 "Statement": [{
 "Sid": "",
 "Effect": "Allow",
 "Principal": {
 "Service": "iot.amazonaws.com"
 },
 "Action": "sts:AssumeRole"
 }]}

Die gleichen Schritte wären für Dynamo DB und Lambda nötig (nicht erstellt). Stattdessen wird mit einer Rule die MQTT Meldung als Datei in die S3 geschrieben.

clip_image022.png clip_image023.png clip_image024.png clip_image025.png

Die Rules können im GUI angelegt werden. Man schickt alles (SELECT * FROM ‚#‘) nach S3, wo entsprechender Bucket erscheint und Datei. Dass der Name der Datei dem AWS secrect Access Key des AWS Root Users entspricht und nicht (offensichtlich) geändert werden kann, ist ein grobfahrlässiger Bug.

clip_image026.png clip_image027.png clip_image028.png

Asynchrone Kommunikation mit Shadow Devices

https://docs.aws.amazon.com/iot/latest/developerguide/registry-and-shadows.html
AWS IoT kann auch mit offline Devices umgehen. Der Dreh- und Angelpunkt ist ein Shadow Device, das die Kommunikation speichert.

  • A thing, such as an internet-connected light bulb, is registered in the Thing Registry.
  • The light bulb publishes its current state (for example, „power = on“ and „color = green“) to AWS IoT. AWS IoT stores the state in the thing shadow document.
  • An application, such as a mobile app controlling the light bulb, uses a RESTful API to query AWS IoT for the last reported state of the light bulb.
  • An application uses a RESTful API to request a change in thing state. For example, a mobile app requests that the light bulb change its color to red. The application does not have to communicate directly with the thing or be resilient to issues like intermittent connectivity. AWS IoT will synchronize the desired state with the thing the next time the thing is connected.

clip_image029.png

clip_image030.png

 

So sieht die AWS IoT Seite schliesslich aus: 2 Devices, 1 Policy, 1 Zertifikat und eine Regel

clip_image031.png

 

 

 


Weiterführendes

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.