

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Simulation des communications du service Device Shadow
<a name="using-device-shadows"></a>

Cette rubrique indique comment le service Device Shadow agit en tant qu'intermédiaire et permet aux appareils et aux applications d'utiliser un shadow pour mettre à jour, stocker et récupérer l'état d'un appareil.

Pour démontrer l'interaction décrite dans cette rubrique et pour l'explorer plus en détail, vous aurez besoin d'un Compte AWS et d'un système sur lesquels vous pourrez exécuter le AWS CLI. Si vous ne les avez pas, vous pouvez toujours voir l'interaction dans les exemples de code.

Dans cet exemple, la AWS IoT console représente le périphérique. Le AWS CLI représente l'application ou le service qui accède à l'appareil par le biais de l'ombre. L' AWS CLI interface est très similaire à l'API avec laquelle une application peut communiquer AWS IoT. L'appareil dans cet exemple est une ampoule intelligente et l'application affiche l'état de cette ampoule et peut le modifier.

## Configuration de la simulation
<a name="using-device-shadows-setup"></a>

Ces procédures initialisent la simulation en ouvrant la [console AWS IoT](https://console.aws.amazon.com/iot/home), qui simule votre appareil, et la fenêtre de ligne de commande qui simule votre application.

**Pour configurer votre environnement de simulation**

1. Vous aurez besoin d'un Compte AWS pour exécuter vous-même les exemples de cette rubrique. Si vous n'en avez pas Compte AWS, créez-en un, comme décrit dans[Configurez Compte AWS](setting-up.md).

1. Ouvrez la [console AWS IoT](https://console.aws.amazon.com/iot/home) et, dans le menu de gauche, choisissez **Test** pour ouvrir le **client MQTT**.

1. Dans une autre fenêtre, ouvrez une fenêtre de terminal sur un système où l'interface AWS CLI est installée.

Deux fenêtres doivent être ouvertes : l'une avec la AWS IoT console sur la page **Test** et l'autre avec une invite de ligne de commande.

## Initialisation de l'appareil
<a name="using-device-shadows-init-device"></a>

Dans cette simulation, nous allons travailler avec un objet nommé *mySimulatedThing*, et son ombre nommée *SimShadow1*. 

**Create thing Object et sa politique en matière d'IoT**  
Pour créer un objet, dans la **AWS IoT console** :

1. Sélectionnez **Gérer**, puis choisissez votre **objet **. 

1. Cliquez sur le bouton **Créer** si des éléments sont répertoriés, sinon cliquez sur **Enregistrer un seul objet** pour créer un seul AWS IoT élément. 

1. Entrez le nom`mySimulatedThing`, laissez les autres paramètres par défaut, puis cliquez sur **Suivant**.

1. Utilisez la création de certificats en un clic pour générer les certificats qui authentifieront la connexion de l'appareil à AWS IoT. Cliquez sur **Activer** pour activer le certificat.

1. Vous pouvez joindre la politique `My_IoT_Policy` qui autoriserait l'appareil à publier et à s'abonner aux sujets réservés au MQTT. Pour des étapes plus détaillées sur la création d'un AWS IoT objet et sur la création de cette politique, consultez[Créez un objet](create-iot-resources.md#create-aws-thing).

**Crée une ombre nommée pour l'objet**  
Vous pouvez créer une ombre nommée pour un objet en publiant une demande de mise à jour dans la rubrique `$aws/things/mySimulatedThing/shadow/name/simShadow1/update`, comme décrit ci-dessous.

Ou, pour créer une ombre nommée :

1. Dans la **AWS IoT console**, choisissez votre objet dans la liste des objets affichés, puis choisissez **Shadows**.

1. Choisissez **Ajouter une ombre**, entrez le nom`simShadow1`, puis choisissez **Créer** pour ajouter l'ombre nommée.

**S'abonner et publier sur des sujets MQTT réservés**  
Dans la console, souscrivez aux sujets MQTT réservés. Ces rubriques sont les réponses aux actions `get`, `update` et `delete`, afin que votre appareil soit prêt à recevoir les réponses après avoir publié une action. 

**Pour vous abonner à une rubrique MQTT dans le **client MQTT****

1. Dans le **client MQTT**, choisissez **Publier dans une rubrique**.

1. Entrez le `get`, `update`, et les `delete` sujets auxquels vous souhaitez vous abonner. Copiez un sujet à la fois dans la liste suivante, collez-le dans le champ **Filtre de sujet**, puis cliquez sur **S'abonner**. Vous devriez voir les sujets apparaître sous **Abonnements**.
   + `$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`

   À ce stade, votre appareil simulé est prêt à recevoir les rubriques telles qu'elles sont publiées par AWS IoT.

**Pour vous abonner à une rubrique MQTT dans le **client MQTT****  
Une fois qu'un appareil s'est initialisé et s'est abonné aux rubriques de réponse, il doit exécuter une requête portant sur les shadows qu'il prend en charge. Cette simulation ne prend en charge qu'une seule ombre, l'ombre qui supporte un objet nommé *SimShadow1*. *mySimulatedThing*

**Pour obtenir l'état actuel du shadow à partir du **client MQTT****

1. Dans le **client MQTT**, choisissez **Publier dans une rubrique**.

1. Sous **Publish**, entrez l’objet suivant et supprimez tout contenu de la fenêtre de corps de message ci-dessous où vous avez entré la rubrique à obtenir. Vous pouvez ensuite choisir **Publier dans le sujet** pour publier la demande. `$aws/things/mySimulatedThing/shadow/name/simShadow1/get`.

   Si vous n'avez pas créé l'ombre nommée, `simShadow1`, vous recevez un message dans `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected` l’objet et le `code` est `404`, comme dans cet exemple où l'ombre n'a pas été créée, nous allons donc la créer ensuite.

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

**Pour créer un shadow avec l'état actuel de l'appareil**

1. Dans le **client MQTT**, choisissez **Publier dans une rubrique** et entrez l’objet.

   ```
   $aws/things/mySimulatedThing/shadow/name/simShadow1/update
   ```

1. Dans la fenêtre de corps de message ci-dessous où vous avez entré la rubrique, entrez ce document shadow pour montrer que l'appareil rapporte son ID et sa couleur actuelle en valeurs RVB. Choisissez **Publier** pour publier la demande.

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

Si vous recevez un message dans le sujet : 
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted` : Cela signifie que l'ombre a été créée et que le corps du message contient le document fantôme actuel.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected` : Vérifiez l'erreur dans le corps du message.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted` : L'ombre existe déjà et le corps du message contient l'état actuel de l'ombre, comme dans cet exemple. Avec cela, vous pouvez définir votre appareil ou confirmer qu'il correspond à l'état du shadow.

  ```
  {
    "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"
  }
  ```

## Envoi d'une mise à jour à partir de l'application
<a name="using-device-shadows-app-update"></a>

Cette section utilise le AWS CLI pour montrer comment une application peut interagir avec une ombre.

**Pour obtenir l'état actuel de l'ombre à l'aide du AWS CLI**  
Sur la ligne de commande, entrez la commande ci-dessous.

```
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
```

Sur les plateformes Windows, vous pouvez utiliser `con` à la place de`/dev/stdout`.

```
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
```

Comme le shadow existe et a été initialisé par l'appareil pour refléter son état actuel, il doit renvoyer le document shadow suivant.

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

L'application peut utiliser cette réponse pour initialiser sa représentation de l'état de l'appareil.

Si l'application met à jour l'état, par exemple lorsqu'un utilisateur final change la couleur de notre ampoule intelligente en jaune, l'application enverra une commande **update-thing-shadow**. Cette commande correspond à l'API REST `UpdateThingShadow`.

**Pour mettre à jour un shadow à partir d'une application**  
Sur la ligne de commande, entrez la commande ci-dessous.

------
#### [ AWS CLI v2.x ]

```
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \
    --cli-binary-format raw-in-base64-out \
    --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
```

------
#### [ AWS CLI v1.x ]

```
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
```

------

Si elle réussit, cette commande doit renvoyer le document shadow suivant.

```
{
  "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"
}
```

## Réponse à une mise à jour sur l'appareil
<a name="using-device-shadows-device-update"></a>

Pour en revenir au **client MQTT** dans la AWS console, vous devriez voir les messages AWS IoT publiés pour refléter la commande de mise à jour émise dans la section précédente.

**Pour afficher les messages de mise à jour dans le **client MQTT****  
Dans le **client MQTT**, choisissez **\$1 aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta** dans la colonne **Abonnements**. Si le nom de la rubrique est tronqué, vous pouvez faire une pause dessus pour voir le nom complet. Dans le journal des rubriques de cette rubrique, vous devriez voir un `/delta` message similaire à celui-ci.

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

Votre appareil traite le contenu de ce message pour définir l'état de l'appareil, afin qu'il corresponde à l'état `desired` dans le message.

Une fois que l'appareil a mis à jour l'état pour qu'il corresponde à l'`desired`état indiqué dans le message, il doit renvoyer le nouvel état signalé AWS IoT en publiant un message de mise à jour. Cette procédure simule cela dans le **client MQTT**.

**Pour mettre à jour le shadow à partir de l'appareil**

1. Dans le **client MQTT**, choisissez **Publier dans une rubrique**.

1. Dans la fenêtre du corps du message, dans le champ de sujet situé au-dessus de la fenêtre du corps du message, entrez le sujet de l'ombre suivi de l'`/update`action : `$aws/things/mySimulatedThing/shadow/name/simShadow1/update` et dans le corps du message, entrez ce document fantôme mis à jour, qui décrit l'état actuel de l'appareil. Choisissez **Publier** pour publier l'état de l'appareil mis à jour.

   ```
   {
     "state": {
       "reported": {
         "ColorRGB": [255,255,0]
         }
     },
     "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
   }
   ```

   Si le message a bien été reçu par AWS IoT, vous devriez voir une nouvelle réponse dans le journal des aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted messages **\$1** du **client MQTT** avec l'état actuel de l'ombre, comme dans cet exemple.

   ```
   {
     "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"
   }
   ```

Une mise à jour réussie de l'état signalé du périphérique AWS IoT entraîne également l'envoi d'une description complète de l'état fantôme dans un message adressé au `update/documents` sujet, tel que le corps du message résultant de la mise à jour instantanée effectuée par le périphérique dans la procédure précédente.

```
{
  "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"
}
```

## Observation de la mise à jour dans l'application
<a name="using-device-shadows-view-result"></a>

L'application peut désormais interroger le shadow pour obtenir l'état actuel, tel qu'il a été rapporté par l'appareil.

**Pour obtenir l'état actuel de l'ombre à l'aide du AWS CLI**

1. Sur la ligne de commande, entrez la commande ci-dessous.

   ```
   aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
   ```

   Sur les plateformes Windows, vous pouvez utiliser à la `con` place de`/dev/stdout`.

   ```
   aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
   ```

1. Comme le shadow vient d'être mis à jour par l'appareil pour refléter son état actuel, il doit renvoyer le document shadow suivant.

   ```
   {
     "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
   }
   ```

## Au-delà de la simulation
<a name="using-device-shadows-next-steps"></a>

Expérimentez avec l'interaction entre l'interface AWS CLI (représentant l'application) et la console (représentant l'appareil) pour modéliser votre solution IoT.