

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Simulazione delle comunicazioni del servizio Device Shadow
<a name="using-device-shadows"></a>

In questo argomento viene illustrato come il servizio Device Shadow funge da intermediario e consente a dispositivi e app di utilizzare una copia shadow per aggiornare, archiviare e recuperare lo stato di un dispositivo.

Per dimostrare l'interazione descritta in questo argomento e per approfondirla ulteriormente, avrai bisogno di un sistema Account AWS e di un sistema su cui eseguire. AWS CLI Se non si dispone di questi, è ancora possibile vedere l'interazione negli esempi di codice.

In questo esempio, la AWS IoT console rappresenta il dispositivo. AWS CLI Rappresenta l'app o il servizio che accede al dispositivo tramite l'ombra. L' AWS CLI interfaccia è molto simile all'API con cui un'app potrebbe utilizzare per comunicare AWS IoT. Il dispositivo in questo esempio è una lampadina intelligente e l'app visualizza lo stato della lampadina e può cambiare lo stato della lampadina.

## Impostazione della simulazione
<a name="using-device-shadows-setup"></a>

Queste procedure inizializzano la simulazione aprendo la [console AWS IoT](https://console.aws.amazon.com/iot/home), che simula il dispositivo, e la finestra della riga di comando che simula l'app.

**Per configurare l'ambiente di simulazione**

1. Avrai bisogno Account AWS di un per eseguire autonomamente gli esempi di questo argomento. Se non ne hai uno Account AWS, creane uno, come descritto in[Configurare Account AWS](setting-up.md).

1. Aprire la [console AWS IoT](https://console.aws.amazon.com/iot/home) e, nel menu a sinistra, scegliere **Test** per aprire il **Client MQTT**.

1. In un'altra finestra, aprire una finestra di terminale su un sistema su cui sia installata l' AWS CLI .

Dovrebbero essere aperte due finestre: una con la AWS IoT console nella pagina **Test** e l'altra con il prompt della riga di comando.

## Inizializzare il dispositivo
<a name="using-device-shadows-init-device"></a>

*In questa simulazione, lavoreremo con un oggetto chiamato oggetto e la sua ombra denominata SimShadow1. *mySimulatedThing** 

**Creazione di un oggetto e della relativa policy IoT**  
Per creare un oggetto, nella **console AWS IoT **:

1. Scegli **Gestisci**, quindi seleziona **Oggetti**. 

1. Fai clic sul pulsante **Crea** se gli elementi sono elencati, altrimenti fai clic su **Registra una singola cosa per creare una singola cosa**. AWS IoT 

1. Inserisci il nome `mySimulatedThing`, lascia le altre impostazioni predefinite e quindi fai clic su **Successivo**.

1. Utilizza la creazione di certificati con un solo clic per generare i certificati che autenticheranno la connessione del dispositivo a AWS IoT. Fare clic su **Attiva** per attivare il certificato.

1. È possibile allegare la policy `My_IoT_Policy` che darebbe al dispositivo l'autorizzazione per pubblicare e sottoscrivere gli argomenti riservati MQTT. Per passaggi più dettagliati su come creare un AWS IoT oggetto e su come creare questa politica, consulta[Crea un oggetto](create-iot-resources.md#create-aws-thing).

**Creazione di una copia shadow con nome per un oggetto**  
Puoi creare una copia shadow con nome per un oggetto pubblicando una richiesta di aggiornamento sull'argomento `$aws/things/mySimulatedThing/shadow/name/simShadow1/update` come descritto di seguito.

Oppure, per creare un'ombra con nome:

1. Nella **console AWS IoT **, scegli l'oggetto dall'elenco degli oggetti visualizzato e quindi scegli **Shadows** (Copie shadow).

1. Scegli **Aggiungi una copia shadow**, inserisci il nome `simShadow1`, quindi scegli **Crea** per aggiungere la copia shadow.

**Effettua la sottoscrizione e pubblica gli argomenti riservati MQTT**  
Nella console, effettua la sottoscrizione a questi argomenti MQTT. Questi argomenti sono le risposte alle operazioni `get`, `update` e `delete`, in modo che il dispositivo sia pronto a ricevere le risposte dopo la pubblicazione di un'operazione. 

**Per sottoscrivere un argomento MQTT nel **client MQTT****

1. In **MQTT client** (Client MQTT), scegli **Subscribe to a topic** (Sottoscrivi un argomento).

1. Inserisci gli argomenti `get`, `update` e `delete` a cui vuoi effettuare la sottoscrizione. Copia un argomento alla volta dall'elenco seguente, incollalo nel campo **Filtro di argomenti**, quindi clicca su **Sottoscrivi**. Verranno visualizzati gli argomenti sotto **Sottoscrizioni**.
   + `$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`

   A questo punto, il dispositivo simulato è pronto a ricevere gli argomenti pubblicati da AWS IoT.

**Per pubblicare in un argomento MQTT nel **client MQTT****  
Dopo l'inizializzazione e la sottoscrizione agli argomenti di risposta, il dispositivo deve interrogare le copie shadow supportate. Questa simulazione supporta solo un'ombra, l'ombra che supporta un oggetto denominato *SimShadow1*. *mySimulatedThing*

**Per ottenere lo stato shadow corrente dal **client MQTT****

1. Nel **client MQTT**, scegliere **Pubblica in un argomento**.

1. Sotto **Pubblica**, inserisci l'argomento seguente ed elimina qualsiasi contenuto dalla finestra del corpo del messaggio sottostante in cui è stato inserito l'argomento da ottenere. È quindi possibile scegliere **Pubblicazione nell'argomento** per pubblicare la richiesta. `$aws/things/mySimulatedThing/shadow/name/simShadow1/get`.

   Se non hai creato un nome shadow `simShadow1`, riceverai un messaggio nell'argomento `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected`, e il `code` sarà `404`, come in questo esempio in cui la copia shadow non è stata creata, quindi verrà creata in seguito.

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

**Per creare una copia shadow con lo stato corrente del dispositivo**

1. Nel **Client MQTT**, scegli **Pubblica in un argomento** e inserisci questo argomento:

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

1. Nella finestra del corpo del messaggio qui sotto, dove è stato inserito l'argomento, inserire questo documento shadow per mostrare che il dispositivo sta segnalando il suo ID e il suo colore corrente in valori RGB. Scegli **Pubblica** per pubblicare la richiesta.

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

Se viene visualizzato un messaggio nell'argomento: 
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted`: significa che la copia shadow è stata creata e che il corpo del messaggio contiene il documento shadow corrente.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected`: esamina l'errore nel corpo del messaggio.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted`: la copia shadow esiste già e il corpo del messaggio ha lo stato shadow corrente, come in questo esempio. Con questo, è possibile impostare il dispositivo o confermare che corrisponda allo stato della copia 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"
  }
  ```

## Inviare un aggiornamento dall'app
<a name="using-device-shadows-app-update"></a>

Questa sezione utilizza il AWS CLI per dimostrare come un'app può interagire con un'ombra.

**Per ottenere lo stato attuale dell'ombra, utilizzare AWS CLI**  
Nella riga di comando, immettere questo comando:

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

Sulle piattaforme Windows è possibile usare `con` al posto di `/dev/stdout`.

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

Poiché la copia shadow esiste ed è stata inizializzata dal dispositivo per riflettere lo stato corrente, deve restituire il seguente documento shadow.

```
{
  "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'app può utilizzare questa risposta per inizializzare la sua rappresentazione dello stato del dispositivo.

Se l'app aggiorna lo stato, ad esempio quando un utente finale cambia il colore della lampadina intelligente in giallo, l'app invierà un comando **update-thing-shadow**. Questo comando corrisponde all'API REST `UpdateThingShadow`.

**Per aggiornare una copia shadow da un'app**  
Nella riga di comando, immettere questo comando:

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

------

In caso di esito positivo, questo comando deve restituire il seguente documento shadow.

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

## Rispondere all'aggiornamento nel dispositivo
<a name="using-device-shadows-device-update"></a>

Tornando al **client MQTT** nella AWS console, dovreste vedere i messaggi AWS IoT pubblicati in base al comando di aggiornamento emesso nella sezione precedente.

**Per visualizzare i messaggi di aggiornamento nel **client MQTT****  
Nel **client MQTT**, scegli **\$1 aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta nella colonna** **Abbonamenti**. Se il nome dell'argomento viene troncato, è possibile metterlo in pausa per visualizzare l'argomento completo. Nel registro degli argomenti di questo argomento, dovresti vedere un messaggio `/delta` simile a questo.

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

Il dispositivo elaborerà il contenuto di questo messaggio per impostare lo stato del dispositivo in modo che corrisponda allo stato `desired` del messaggio.

Dopo che il dispositivo ha aggiornato lo stato in modo che corrisponda allo `desired` stato del messaggio, deve inviare nuovamente il nuovo stato segnalato AWS IoT pubblicando un messaggio di aggiornamento. Questa procedura simula questo nel **client MQTT**.

**Per aggiornare la copia shadow dal dispositivo**

1. Nel **client MQTT**, scegliere **Pubblica in un argomento**.

1. Nella finestra del corpo del messaggio, nel campo dell'argomento sopra la finestra del corpo del messaggio, inserisci l'argomento della copia shadow seguito dall'operazione `/update`: `$aws/things/mySimulatedThing/shadow/name/simShadow1/update` e nel corpo del messaggio, inserisci questo documento shadow aggiornato, che descrive lo stato corrente del dispositivo. Scegli **Pubblica** per pubblicare lo stato aggiornato del dispositivo.

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

   Se il messaggio è stato ricevuto correttamente da AWS IoT, dovresti vedere una nuova risposta nel registro **\$1 aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted** message del **client MQTT** con lo stato attuale dello shadow, come in questo esempio.

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

Un aggiornamento riuscito allo stato segnalato del dispositivo comporta AWS IoT anche l'invio di una descrizione completa dello stato shadow in un messaggio all'`update/documents`argomento, ad esempio questo corpo del messaggio risultante dall'aggiornamento shadow eseguito dal dispositivo nella procedura precedente.

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

## Osservare l'aggiornamento nell'app
<a name="using-device-shadows-view-result"></a>

L'app può ora interrogare la copia shadow per lo stato corrente come riportato dal dispositivo.

**Per ottenere lo stato attuale dell'ombra, utilizzare il AWS CLI**

1. Nella riga di comando, immettere questo comando:

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

   Sulle piattaforme Windows è possibile usare `con` al posto di `/dev/stdout`.

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

1. Poiché la copia shadow è stata appena aggiornata dal dispositivo per riflettere lo stato corrente, dovrebbe restituire il seguente documento shadow.

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

## Andare oltre la simulazione
<a name="using-device-shadows-next-steps"></a>

Prova l'interazione tra AWS CLI (che rappresenta l'app) e la console (che rappresenta il dispositivo) per modellare la soluzione IoT.