AWS IoT
Entwicklerhandbuch

Datenfluss des Device Shadow-Service

Der Device Shadow-Service fungiert als Vermittler und ermöglicht Geräten und Anwendungen, den Schatten eines Geräts abzurufen und zu aktualisieren.

Um zu veranschaulichen, wie Geräte und Anwendungen mit dem Device Shadow-Service kommunizieren, werden in diesem Abschnitt die Verwendung des AWS IoT-MQTT-Clients und die AWS CLI zur Simulation einer Kommunikation zwischen einer mit dem Internet verbundenen Glühlampe, einer Anwendung und dem Device Shadow-Service beschrieben.

Der Device Shadow-Service verwendet MQTT-Themen, um die Kommunikation zwischen Anwendungen und Geräten zu ermöglichen. Um zu sehen, wie dies funktioniert, verwenden Sie den AWS IoT-MQTT-Client, um die folgenden MQTT-Themen mit QoS 1 zu abonnieren:

$aws/things/myLightBulb/shadow/update/accepted

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn ein Geräteschatten erfolgreich aktualisiert wurde.

$aws/things/myLightBulb/shadow/update/rejected

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn ein Geräteschatten abgelehnt wurde.

$aws/things/myLightBulb/shadow/update/delta

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn zwischen den gemeldeten und gewünschten Abschnitten eines Geräteschattens Abweichungen auftreten. Weitere Informationen finden Sie unter /update/delta.

$aws/things/myLightBulb/shadow/get/accepted

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn ein Anfrage für einen Geräteschatten erfolgreich war.

$aws/things/myLightBulb/shadow/get/rejected

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn ein Anfrage für einen Geräteschatten abgelehnt wurde.

$aws/things/myLightBulb/shadow/delete/accepted

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn ein Geräteschatten gelöscht wird.

$aws/things/myLightBulb/shadow/delete/rejected

Der Device Shadow-Service sendet Nachrichten an dieses Thema, wenn ein Anfrage für einen Geräteschatten gelöscht wurde.

$aws/things/myLightBulb/shadow/update/documents

Der Device Shadow-Service veröffentlicht zu diesem Thema ein Statusdokument, wenn der Geräteschatten erfolgreich aktualisiert wurde.

Weitere Informationen über alle vom Device Shadow-Service verwendeten MQTT-Themas finden Sie unter MQTT-Themen für Schatten.

Anmerkung

Um eine Übersicht über alle vom Device Shadow-Service gemeldeten Fehler zu erhalten, empfehlen wir Ihnen, die .../rejected-Themen zu abonnieren.

Sobald die Glühlampe online geht, übermittelt sie ihren aktuellen Status an den Device Shadow-Service, indem sie eine MQTT-Nachricht an das Thema $aws/things/myLightBulb/shadow/update sendet.

Anmerkung

Schattengeräte werden zum ersten Mal erstellt, wenn ein Aktualisierungsversuch unternommen wird. Erkennt der Schattengeräteservice, dass ein Schatten nicht vorhanden ist, erstellt er einen. Wenn der Schatten vorhanden ist, wird er aktualisiert.

Um dies zu simulieren, verwenden Sie den AWS IoT-MQTT-Client, um folgende Nachricht im Thema $aws/things/myLightBulb/shadow/update zu veröffentlichen:

{ "state": { "reported": { "color": "red" } } }

Mit dieser Nachricht wird die Farbe der Glühlampe auf Rot gesetzt.

Der Device Shadow-Service reagiert, indem er die folgende Nachricht an das Thema $aws/things/myLightBulb/shadow/update/accepted sendet:

{ "messageNumber": 4, "payload": { "state": { "reported": { "color": "red" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } } }, "version": 1, "timestamp": 1469564492 }, "qos": 0, "timestamp": 1469564492848, "topic": "$aws/things/myLightBulb/shadow/update/accepted" }

Diese Nachricht gibt an, dass der Device Shadow-Service die UPDATE-Anforderung erhalten hat und der Geräteschatten aktualisiert wurde. Ist der Schatten nicht vorhanden, wird er angelegt. Andernfalls wird der Schatten mit den Daten in der Nachricht aktualisiert. Wenn Sie im Topic $aws/things/myLightBulb/shadow/update/accepted keine veröffentlichte Nachricht sehen, prüfen Sie für eine Ansicht aller Fehlermeldungen das Abonnement für $aws/things/myLightBulb/shadow/update/rejected.

Darüber hinaus veröffentlicht der Device Shadow-Service im Thema $aws/things/myLightBulb/shadow/update/documents die folgende Nachricht:

{ "previous":null, "current":{ "state":{ "reported":{ "color":"red" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483467764 } } }, "version":1 }, "timestamp":1483467764 }

Nachrichten werden im Thema /update/documents immer dann veröffentlicht, wenn der Geräteschatten erfolgreich aktualisiert wurde. Weitere Informationen zu den Inhalten von in diesem Topic veröffentlichten Nachrichten finden Sie unter MQTT-Themen für Schatten.

Eine Anwendung, die mit der Glühlampe interagiert, geht online und ruft den aktuellen Status der Glühlampe ab. Die Anwendung sendet eine leere Nachricht an das Topic $aws/things/myLightBulb/shadow/get. Um dies zu simulieren, verwenden Sie den AWS IoT-MQTT-Client, um eine leere Nachricht ("") im Thema $aws/things/myLightBulb/shadow/get zu veröffentlichen.

Der Device Shadow-Service reagiert, indem er den abgerufenen Schatten im Thema $aws/things/myLightBulb/shadow/get/accepted veröffentlicht:

{ "messageNumber": 1, "payload": { "state": { "reported": { "color": "red" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } } }, "version": 1, "timestamp": 1469564571 }, "qos": 0, "timestamp": 1469564571533, "topic": "$aws/things/myLightBulb/shadow/get/accepted" }

Wenn Sie im Topic $aws/things/myLightBulb/shadow/get/accepted keine Nachricht sehen, prüfen Sie das Topic $aws/things/myLightBulb/shadow/get/rejected auf Fehlermeldungen.

Die Anwendung zeigt dem Benutzer diese Information an, und der Benutzer fordert eine Änderung der Glühlampenfarbe (von Rot in Grün) an. Dazu veröffentlicht die Anwendung eine Nachricht im Topic $aws/things/myLightBulb/shadow/update:

{ "state": { "desired": { "color": "green" } } }

Um dies zu simulieren, verwenden Sie den AWS IoT-MQTT-Client, um die vorangehende Nachricht im Thema $aws/things/myLightBulb/shadow/update zu veröffentlichen.

Der Device Shadow-Service reagiert, indem er eine Nachricht an das Thema $aws/things/myLightBulb/shadow/update/accepted sendet:

{ "messageNumber": 5, "payload": { "state": { "desired": { "color": "green" } }, "metadata": { "desired": { "color": { "timestamp": 1469564658 } } }, "version": 2, "timestamp": 1469564658 }, "qos": 0, "timestamp": 1469564658286, "topic": "$aws/things/myLightBulb/shadow/update/accepted" }

und an das Topic $aws/things/myLightBulb/shadow/update/delta:

{ "messageNumber": 1, "payload": { "version": 2, "timestamp": 1469564658, "state": { "color": "green" }, "metadata": { "color": { "timestamp": 1469564658 } } }, "qos": 0, "timestamp": 1469564658309, "topic": "$aws/things/myLightBulb/shadow/update/delta" }

Der Device Shadow-Service veröffentlicht in diesem Thema eine Nachricht, sobald er die Aktualisierung eines Schattens akzeptiert und der resultierende Schatten unterschiedliche Werte für die Status "Soll” und "Gemeldet” enthält.

Der Device Shadow-Service veröffentlicht zudem eine Nachricht im Thema $aws/things/myLightBulb/shadow/update/documents:

{ "previous":{ "state":{ "reported":{ "color":"red" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483467764 } } }, "version":1 }, "current":{ "state":{ "desired":{ "color":"green" }, "reported":{ "color":"red" } }, "metadata":{ "desired":{ "color":{ "timestamp":1483468612 } }, "reported":{ "color":{ "timestamp":1483467764 } } }, "version":2 }, "timestamp":1483468612 }

Für die Glühlampe wird das Topic $aws/things/myLightBulb/shadow/update/delta abonniert, sodass sie Nachrichten erhält, ihre Farbe ändert und ihren neuen Status veröffentlicht. Um dies zu simulieren, verwenden Sie den AWS IoT-MQTT-Client, um folgende Nachricht im Thema $aws/things/myLightBulb/shadow/update zu veröffentlichen und den Status des Schattens zu aktualisieren:

{ "state":{ "reported":{ "color":"green" }, "desired":null} } }

Als Antwort sendet der Device Shadow-Service eine Nachricht an das Thema $aws/things/myLightBulb/shadow/update/accepted:

{ "messageNumber": 6, "payload": { "state": { "reported": { "color": "green" }, "desired": null }, "metadata": { "reported": { "color": { "timestamp": 1469564801 } }, "desired": { "timestamp": 1469564801 } }, "version": 3, "timestamp": 1469564801 }, "qos": 0, "timestamp": 1469564801673, "topic": "$aws/things/myLightBulb/shadow/update/accepted" }

und an das Topic $aws/things/myLightBulb/shadow/update/documents:

{ "previous":{ "state":{ "reported":{ "color":"red" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483470355 } } }, "version":3 }, "current":{ "state":{ "reported":{ "color":"green" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483470364 } } }, "version":4 }, "timestamp":1483470364 }

Die Anwendung ruft vom Device Shadow-Service den aktuellen Status ab und zeigt die neuesten Statusdaten an. Um dies zu simulieren, führen Sie den folgenden Befehl aus:

aws iot-data get-thing-shadow --thing-name "myLightBulb" "output.txt" && cat "output.txt"

Anmerkung

Unter Windows lassen Sie && cat "output.txt" weg, womit der Inhalt der output.txt in der Konsole angezeigt wird. Sie können die Datei in Notepad oder einem beliebigen Texteditor öffnen, um den Inhalt des Schattens anzusehen.

Der Device Shadow-Service gibt das folgende Schattendokument zurück:

{ "state":{ "reported":{ "color":"green" } }, "metadata":{ "reported":{ "color":{ "timestamp":1469564801 } } }, "version":3, "timestamp":1469564864}

Um den Geräteschatten zu löschen, veröffentlichen Sie im Thema $aws/things/myLightBulb/shadow/delete eine leere Nachricht. AWS IoT antwortet mit der Veröffentlichung einer Nachricht im Thema $aws/things/myLightBulb/shadow/delete/accepted:

{ "version" : 1, "timestamp" : 1488565234 }

Ein angeschlossenes Gerät erkennen

Um festzustellen, ob ein Gerät derzeit verbunden ist, nehmen Sie in den Schatten eine Anschluss-Einstellung auf und verwenden eine MQTT LWT-Nachricht (Last Will and Testament), mit der die Anschluss-Einstellung auf false eingestellt wird, wenn ein Gerät aufgrund eines Fehlers getrennt wurde.

Anmerkung

Derzeit werden LWT-Nachrichten, die an von AWS IoT reservierte Themen (Themen, die mit $ beginnen) gesendet werden, vom AWS IoT Device Shadow-Service zwar ignoriert, aber dennoch von abonnierten Clients und von der AWS IoT-Regel-Engine verarbeitet. Wenn Sie möchten, dass der Device Shadow-Service LWT-Nachrichten erhält, registrieren Sie eine LWT-Nachricht in einem nicht-reservierten Thema und erstellen Sie eine Regel, mit der die Nachricht im reservierten Thema noch einmal veröffentlicht wird. Die folgenden Beispiele zeigen, wie eine Regel zur nochmaligen Veröffentlichung erstellt wird, die Nachrichten des Topics my/things/myLightBulb/update überwacht und diese im Topic $aws/things/myLightBulb/shadow/update nochmalig veröffentlicht.

{ "rule": { "ruleDisabled": false, "sql": "SELECT * FROM 'my/things/myLightBulb/update'", "description": "Turn my/things/ into $aws/things/", "actions": [{ "republish": { "topic": "$$aws/things/myLightBulb/shadow/update", "roleArn": "arn:aws:iam::123456789012:role/aws_iot_republish" } }] } }

Wird ein Gerät angeschlossen, wird dafür ein LWT registriert, das die Anschluss-Einstellung auf false festlegt:

{ "state": { "reported": { "connected":"false" } } }

Darüber hinaus wird eine Nachricht in seinem Aktualisierungs-Topic $aws/things/myLightBulb/shadow/update) veröffentlicht, mit dem die Einstellung des Anschlussstatus auf true festgelegt wird:

{ "state": { "reported": { "connected":"true" } } }

Wird das Gerät normal getrennt, veröffentlicht es eine Nachricht in seinem Aktualisierungs-Topic und stellt seinen Anschlussstatus auf false ein:

{ "state": { "reported": { "connected":"false" } } }

Wird das Gerät aufgrund eines Fehlers getrennt, wird seine LWT-Nachricht automatisch an das Aktualisierungs-Topic gesendet.