Inhalt
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:
- AWS IoT registrieren und eine verschlüsselte CLI Verbindung erstellen
- ein Device erzeugen
- die Verbindung vom Device zu AWS IoT verschlüsseln
- einen MQTT Client installieren und Daten schicken
- 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)
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.
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.
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:
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
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).
Das Policy Dokumenet beschreibt die Berechtigungen:
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action":["iot:*"], "Resource": ["*"] }] }
Auf der IoT Konsole sieht das so aus:
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).
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)
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.
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.
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.
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.
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.
So sieht die AWS IoT Seite schliesslich aus: 2 Devices, 1 Policy, 1 Zertifikat und eine Regel
Weiterführendes
- Temperature Streaming with Arduino + Big Data Tools Beispiel mit vielen bekannte BigData-Plattformen