Simulieren der Device Shadow-Servicekommunikation - AWS IoT

Simulieren der Device Shadow-Servicekommunikation

In diesem Thema wird veranschaulicht, wie der Device Shadow-Service als Vermittler fungiert und es Geräten und Apps ermöglicht, einen Schatten zum Aktualisieren, Speichern und Abrufen des Status eines Geräts zu verwenden.

Um die in diesem Thema beschriebene Interaktion zu demonstrieren und diese weiter zu untersuchen, benötigen Sie ein AWS-Konto und ein System, auf dem Sie die AWS CLI ausführen können. Wenn Sie diese nicht haben, können Sie die Interaktion immer anhand der Codebeispiele untersuchen.

In diesem Beispiel stellt die AWS IoT-Konsole das Gerät dar. Die AWS CLI stellt die App oder den Service dar, die/der über den Schatten auf das Gerät zugreift. Die AWS CLI-Schnittstelle ist der API sehr ähnlich, über die eine App mit AWS IoT kommunizieren kann. Das Gerät in diesem Beispiel ist eine intelligente Glühlampe, und die App zeigt den Status der Glühlampe an und kann ihren Status ändern.

Einrichten der Simulation

Diese Verfahren initialisieren die Simulation, indem Sie die AWS IoT-Konsole öffnen, die Ihr Gerät simuliert, und das Befehlszeilenfenster, das Ihre App simuliert.

So richten Sie Ihre Simulationsumgebung ein:

  1. Erstellen Sie ein AWS-Konto; falls Sie bereits ein Konto für diese Simulation haben, können Sie diesen Schritt überspringen.

    Sie benötigen ein AWS-Konto, um die Beispiele aus diesem Thema selbst auszuführen. Wenn Sie kein AWS-Konto haben, erstellen Sie eines, wie unter Einrichten beschrieben.

  2. Öffnen Sie die AWS IoT-Konsole und wählen Sie im linken Menü Test, um den MQTT-Client zu öffnen.

  3. Öffnen Sie in einem anderen Fenster ein Terminalfenster auf einem System, auf dem das AWS CLI installiert ist.

Sie sollten zwei Fenster geöffnet haben: eines mit der AWS IoT-Konsole auf der Test-Seite und eines mit einer Befehlszeilenaufforderung.

Initialisieren des Geräts

In dieser Simulation arbeiten wir mit einem Objekt namens mySimulatedThing und seinem Schatten namens simShadow1.

Abonnieren Sie in der Konsole diese MQTT-Themen. Diese Themen sind die Antworten auf die Aktionen get, update und delete, damit Ihr Gerät bereit ist, die Antworten zu empfangen, nachdem es eine Aktion veröffentlicht hat.

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/delete/accepted

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/delete/rejected

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/documents

Führen Sie dieses Verfahren für jedes der MQTT-Themen in der vorangegangenen Liste aus.

So abonnieren Sie ein MQTT-Thema im MQTT-Client:

  1. Wählen Sie im MQTT-Client unter Subscriptions (Abonnements) Subscribe to topic (Thema abonnieren) .

  2. Geben Sie unter Subscription topic (Abonnement-Thema) das Thema ein, das Sie abonnieren möchten.

    Kopieren Sie für diese Simulation ein Thema aus der vorherigen Liste, und fügen Sie es in Subscription topic (Abonnement-Thema) ein. Geben Sie jeweils nur ein Thema ein.

  3. Wählen Sie Subscribe to topic.

  4. Bestätigen Sie, dass die Themen in der linken Spalte des MQTT-Clients angezeigt werden.

    An diesem Punkt ist Ihr simuliertes Gerät bereit, die Themen zu erhalten, wie sie von AWS IoT veröffentlicht werden.

  5. Nachdem ein Gerät sich selbst initialisiert und die Antwortthemen abonniert hat, sollte Abfragen nach den unterstützten Schatten durchführen. Diese Simulation unterstützt nur einen Schatten, den Schatten, der ein Objekt namens MySimulatedThing unterstützt und den Namen SimShadow1 hat.

    So rufen Sie den aktuellen Schattenstatus vom MQTT-Client ab:

    1. Wählen Sie im MQTT-Client unter Subscriptions (Abonnements) die Option Publish to a topic (In einem Thema veröffentlichen).

    2. Geben Sie unter Publish (Veröffentlichen) dieses Thema ein:

      $aws/things/mySimulatedThing/shadow/name/simShadow1/get
    3. Löschen Sie alle Inhalte aus dem Nachrichtentextfenster, in dem Sie das abzurufende Thema eingegeben haben.

    4. Wählen Sie Publish to topic, um die Anforderung zu veröffentlichen.

  6. Wenn Sie eine Nachricht im $aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected erhalten, dass das Thema und code 404 ist, wie in diesem Beispiel, wurde der Schatten nicht erstellt, daher erstellen wir ihn als Nächstes.

    { "code": 404, "message": "No shadow exists with name: 'simShadow1'" }

    So erstellen Sie einen Schatten mit dem aktuellen Status des Geräts:

    1. Wählen Sie im MQTT-Client unter Subscriptions (Abonnements) die Option Publish to a topic (In einem Thema veröffentlichen).

    2. Geben Sie unter Publish (Veröffentlichen) dieses Thema ein:

      $aws/things/mySimulatedThing/shadow/name/simShadow1/update
    3. Geben Sie im Nachrichtentextfenster, in dem Sie das Thema eingegeben haben, dieses Schattendokument ein, um anzuzeigen, dass das Gerät seine ID und seine aktuelle Farbe in RGB-Werten meldet.

      { "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }
    4. Wählen Sie Publish to topic, um die Anforderung zu veröffentlichen.

    5. Beobachten Sie, welches der Themen die Antwortnachricht erhält.

    6. Wenn Sie eine Nachricht im $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted-Thema erhalten, wurde der Schatten erstellt, und der Nachrichtentext enthält das aktuelle Schattendokument, z. B. das Beispiel in Schritt 7.

    7. Wenn Sie eine Nachricht im $aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected-Thema erhalten, überprüfen Sie den Fehler im Nachrichtentext.

  7. Wenn Sie eine Nachricht im $aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted-Thema erhalten haben, ist der Schatten bereits vorhanden und der Nachrichtentext hat den aktuellen Schattenstatus, wie in diesem Beispiel. Damit können Sie Ihr Gerät einstellen oder bestätigen, dass es mit dem Schattenstatus übereinstimmt.

    { "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 3, "timestamp": 1591140517, "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }

Senden einer Aktualisierung von der App

In diesem Abschnitt wird mit AWS CLI gezeigt, wie eine App mit einem Schatten interagieren kann.

So erhalten Sie den aktuellen Status des Schattens mithilfe der AWS CLI:

  1. Geben Sie in der Befehlszeile den folgenden Befehl ein.

    aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
  2. Da der Schatten vorhanden ist und vom Gerät initialisiert wurde, um seinen aktuellen Zustand wiederzugeben, sollte das folgende Schattendokument zurückgegeben werden.

    { "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 3, "timestamp": 1591141111 }

Die App kann diese Antwort verwenden, um die Darstellung des Gerätestatus zu initialisieren.

Wenn die App den Status aktualisiert, z. B. wenn ein Endbenutzer die Farbe unserer intelligenten Glühlampe zu Gelb ändert, sendet die App einen update-thing-shadow-Befehl. Dieser Befehl entspricht der UpdateThingShadow-REST-API.

So aktualisieren Sie einen Schatten aus einer App:

  1. Geben Sie in der Befehlszeile den folgenden Befehl ein.

    aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \ --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
  2. Wenn dieser Befehl erfolgreich ist, sollte das folgende Schattendokument zurückgegeben werden.

    { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] } }, "version": 4, "timestamp": 1591141596, "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab" }

Reaktion auf eine Aktualisierung im Gerät

Wenn Sie in der AWS-Konsole zum MQTT-Client zurückkehren, sollten Sie die von AWS IoT veröffentlichten Nachrichten sehen, die den im vorherigen Abschnitt ausgegebenen Aktualisierungsbefehl widerspiegeln.

So zeigen Sie die Aktualisierungsmeldungen im MQTT-Client an:

  1. Wählen Sie im MQTT-Client, $aws/things/mySimulatedThing/Shadow/Name/SimShadow1/update/delta in der Spalte Subscriptions (Abonnements) . Wenn der Themenname abgeschnitten wird, können Sie ihn anhalten, um das vollständige Thema anzuzeigen.

  2. Im Themenprotokoll $aws/things/mySimulatedThing/Shadow/Name/SimShadow1/update/delta sollten Sie eine ähnliche /delta-Nachricht wie diese sehen.

    { "version": 4, "timestamp": 1591141596, "state": { "ColorRGB": [ 255, 255, 0 ] }, "metadata": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab" }

Ihr Gerät verarbeitet den Inhalt dieser Nachricht, um den Gerätestatus so festzulegen, dass er mit dem desired-Status in der Nachricht übereinstimmt.

Nachdem das Gerät den Status so aktualisiert hat, dass er mit dem desired-Status in der Nachricht übereinstimmt, muss es den neuen gemeldeten Status an AWS IoT zurücksenden, indem eine Aktualisierungsmeldung veröffentlicht wird. Dieses Verfahren simuliert dies im MQTT-Client.

So aktualisieren Sie den Schatten vom Gerät aus:

  1. Wählen Sie im MQTT-Client die Option Publish to a topic (In einem Thema veröffentlichen) aus.

  2. Geben Sie im Nachrichtentext des Abschnitts Publish (Veröffentlichen) dieses aktualisierte Schattendokument ein, das den aktuellen Status des Geräts beschreibt.

    { "state": { "reported": { "ColorRGB": [255,255,0] } }, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }
  3. Geben Sie im Abschnitt Publish (Veröffentlichen) im Themenfeld oberhalb des Nachrichtentextfensters das Thema des Schattens ein, gefolgt von der /update-Aktion.

    $aws/things/mySimulatedThing/shadow/name/simShadow1/update
  4. Wählen Sie Publish to topic (In Thema veröffentlichen), um den aktualisierten Gerätestatus zu veröffentlichen.

  5. Wenn die Nachricht erfolgreich von AWS IoT empfangen wurde, sollte Ihnen im Nachrichtenprotokoll $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted im MQTT-Client eine neue Antwort mit dem aktuellen Status des Schattens ähnlich diesem Beispiel angezeigt werden.

    { "state": { "reported": { "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "reported": { "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5, "timestamp": 1591142747, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }

Eine erfolgreiche Aktualisierung des gemeldeten Status des Geräts bewirkt auch, dass AWS IoT eine umfassende Beschreibung des Schattenstatus in einer Nachricht an das -Thema sendet, z. B. diesen Nachrichtentext, der aus der Schattenaktualisierung resultiert, die vom Gerät im vorherigen Verfahren durchgeführt wurde.

{ "previous": { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 4 }, "current": { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5 }, "timestamp": 1591142747, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }

Beobachten Sie das Update in der App

Die App kann jetzt den Schatten nach dem aktuellen Status abfragen, wie vom Gerät gemeldet.

So erhalten Sie den aktuellen Status des Schattens mithilfe der AWS CLI:

  1. Geben Sie in der Befehlszeile den folgenden Befehl ein.

    aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
  2. Da der Schatten gerade vom Gerät aktualisiert wurde, um seinen aktuellen Zustand wiederzugeben, sollte er das folgende Schattendokument zurückgeben.

    { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5, "timestamp": 1591143269 }

Über die Simulation hinaus

Experimentieren Sie mit der Interaktion zwischen der AWS CLI (für die App) und der Konsole (für das Gerät), um Ihre IoT-Lösung zu modellieren.