

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Simulando comunicações de serviço Sombra do Dispositivo
<a name="using-device-shadows"></a>

Este tópico demonstra como o serviço Sombra do Dispositivo atua como intermediário e permite que dispositivos e aplicativos usem uma sombra para atualizar, armazenar e recuperar o estado de um dispositivo.

Para demonstrar a interação descrita neste tópico e explorá-la mais detalhadamente, você precisará de um Conta da AWS e um sistema no qual possa executar AWS CLI o. Se não os tiver, você ainda poderá ver a interação nos exemplos de código.

Neste exemplo, o AWS IoT console representa o dispositivo. O AWS CLI representa o aplicativo ou serviço que acessa o dispositivo por meio da sombra. A AWS CLI interface é muito semelhante à API que um aplicativo pode usar para se comunicar AWS IoT. O dispositivo neste exemplo é uma lâmpada inteligente, e o aplicativo exibe o estado da lâmpada e pode alterá-lo.

## Configurar a simulação
<a name="using-device-shadows-setup"></a>

Estes procedimentos inicializam a simulação abrindo o [Console do AWS IoT](https://console.aws.amazon.com/iot/home), que simula o dispositivo, e a janela da linha de comando que simula o aplicativo.

**Como configurar o ambiente de simulação**

1. Você precisará Conta da AWS executar os exemplos deste tópico sozinho. Se você não tiver um Conta da AWS, crie um, conforme descrito em[Configurar Conta da AWS](setting-up.md).

1. Abra o [Console do AWS IoT](https://console.aws.amazon.com/iot/home), e, no menu esquerdo, escolha **Testar** para abrir o **Cliente MQTT**.

1. Em outra janela, abra uma janela de terminal em um sistema que tenha a AWS CLI instalada.

Você deve ter duas janelas abertas: uma com o AWS IoT console na página de **teste** e outra com um prompt de linha de comando.

## Inicializar o dispositivo
<a name="using-device-shadows-init-device"></a>

Nesta simulação, trabalharemos com um objeto chamado, *mySimulatedThing*, e sua sombra chamada *SimShadow1*. 

**Criar objeto e sua política de IoT**  
Para criar um objeto, no **AWS IoT Console**:

1. Escolha **Gerenciar** e em seguida, **Objetos**. 

1. Clique no botão **Criar** se as coisas estiverem listadas, caso contrário, clique em **Registrar uma única coisa** para criar uma única AWS IoT coisa. 

1. Insira o nome `mySimulatedThing`, deixe outras configurações como padrão e clique em **Próximo**.

1. Use a criação de certificado com um clique para gerar os certificados que autenticarão a conexão do dispositivo com o AWS IoT. Clique em **Ativar** para ativar o certificado.

1. Você pode anexar a política `My_IoT_Policy` que daria permissão ao dispositivo para publicar e assinar os tópicos reservados do MQTT. Para obter etapas mais detalhadas sobre como criar AWS IoT algo e como criar essa política, consulte[Criar um objeto](create-iot-resources.md#create-aws-thing).

**Crie uma sombra nomeada para o objeto-objeto**  
Você pode criar uma sombra nomeada para algo publicando uma solicitação de atualização no tópico `$aws/things/mySimulatedThing/shadow/name/simShadow1/update` conforme descrito abaixo.

Ou crie uma sombra nomeada:

1. No **AWS IoT Console**, escolha seu objeto na lista de itens exibidos e, em seguida, escolha **Sombras**.

1. Escolha **Adicionar uma sombra**, insira o nome `simShadow1` e escolha **Criar** para adicionar a sombra nomeada.

**Inscreva-se e publique em tópicos reservados do MQTT**  
No console, assine os shadow topics reservados do MQTT. Esses tópicos são as respostas às ações `get`, `update` e `delete` para que seu dispositivo esteja pronto para receber as respostas depois de publicar uma ação. 

**Como assinar um tópico MQTT no **Cliente MQTT****

1. No **cliente MQTT**, escolha **Assinar um tópico**.

1. Insira os tópicos `get`, `update` e `delete` para se inscrever. Copie um tópico por vez da lista a seguir, cole-o no campo **Filtro de tópico** e clique em **Inscrever**. Você deverá ver os tópicos aparecerem em **Inscrições**.
   + `$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`

   Neste ponto, seu dispositivo simulado está pronto para receber os tópicos conforme são publicados pelo AWS IoT.

**Como publicar um tópico MQTT no **Cliente MQTT****  
Depois que um dispositivo se inicializar e assinar tópicos de resposta, ele deve consultar as sombras compatíveis. Essa simulação suporta apenas uma sombra, a sombra que suporta um objeto chamado, *mySimulatedThing*, chamado *SimShadow1*.

**Como obter o estado da sombra atual no **Cliente MQTT****

1. No **Cliente MQTT**, escolha **Publicar em um tópico**.

1. Em **Publicar**, insira o seguinte tópico e exclua qualquer conteúdo da janela do corpo da mensagem abaixo de onde você inseriu o tópico para obter. Em seguida, você pode escolher **Publicar no tópico** para publicar a solicitação. `$aws/things/mySimulatedThing/shadow/name/simShadow1/get`.

   Se você não criou a sombra nomeada, `simShadow1`, você receberá uma mensagem no tópico `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected` e o `code` é `404`, como neste exemplo, a sombra não terá sido criada, portanto, vamos criá-la a seguir.

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

**Como criar uma sombra com o status atual do dispositivo**

1. No **Cliente MQTT**, escolha **Publicar em um tópico** e insira este tópico:

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

1. Na janela de corpo da mensagem abaixo do local em que você inseriu o tópico, insira este documento de sombra para mostrar que o dispositivo está relatando seu ID e sua cor atual em valores RGB. Escolha **Publicar** para publicar a solicitação.

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

Se você receber uma mensagem no tópico: 
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted`: a sombra foi criada e o corpo da mensagem contém o documento de sombra atual.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected`: revise o erro no corpo da mensagem.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted`: a sombra já existirá e o corpo da mensagem terá o estado da sombra atual, como neste exemplo. Com isso, você pode definir seu dispositivo ou confirmar que ele corresponde ao estado da sombra.

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

## Enviar uma atualização do aplicativo
<a name="using-device-shadows-app-update"></a>

Esta seção usa o AWS CLI para demonstrar como um aplicativo pode interagir com uma sombra.

**Para obter o estado atual da sombra usando o AWS CLI**  
Na linha de comando, insira este comando.

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

Nas plataformas Windows, você pode usar `con` ao invés de `/dev/stdout`.

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

Como a sombra existe e foi inicializada pelo dispositivo para refletir seu estado atual, ela deve retornar o seguinte documento de sombra.

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

O aplicativo pode usar essa resposta para inicializar sua representação do estado do dispositivo.

Se o aplicativo atualizar o estado, como quando um usuário final altera a cor da nossa lâmpada inteligente para amarelo, o aplicativo enviará um comando **update-thing-shadow**. Esse comando corresponde à API REST `UpdateThingShadow`.

**Como atualizar uma sombra de um aplicativo**  
Na linha de comando, insira este 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
```

------

Se for bem-sucedido, esse comando deverá retornar o seguinte documento de sombra.

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

## Responder à atualização no dispositivo
<a name="using-device-shadows-device-update"></a>

Retornando ao **cliente MQTT** no AWS console, você deve ver as mensagens AWS IoT publicadas para refletir o comando de atualização emitido na seção anterior.

**Como exibir as mensagens de atualização no **Cliente MQTT****  
No **cliente MQTT**, escolha **\$1 aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta** na coluna **Assinaturas**. Se o nome do tópico estiver truncado, você poderá pausar nele para ver o tópico completo. No log do tópico deste tópico, você deverá ver uma mensagem `/delta` semelhante a esta.

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

Seu dispositivo processará o conteúdo desta mensagem para definir o estado do dispositivo para que corresponda ao estado `desired` na mensagem.

Depois que o dispositivo atualizar o estado para corresponder ao `desired` estado na mensagem, ele deverá enviar o novo estado relatado de volta AWS IoT publicando uma mensagem de atualização. Este procedimento simula isso no **Cliente MQTT**.

**Como atualizar a sombra no dispositivo**

1. No **Cliente MQTT**, escolha **Publicar em um tópico**.

1. Na janela do corpo da mensagem, no campo de tópico acima da janela do corpo da mensagem, insira o tópico do shadow seguido da ação `/update`: `$aws/things/mySimulatedThing/shadow/name/simShadow1/update` e no corpo da mensagem, insira este documento shadow atualizado, que descreve o estado atual do dispositivo. Clique em **Publicar** para publicar o estado atualizado do dispositivo.

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

   Se a mensagem foi recebida com sucesso por AWS IoT, você deverá ver uma nova resposta no registro de aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted mensagens **\$1** no **cliente MQTT** com o estado atual da sombra, como neste exemplo.

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

Uma atualização bem-sucedida do estado relatado do dispositivo também faz AWS IoT com que uma descrição abrangente do estado de sombra em uma mensagem seja enviada ao `update/documents` tópico, como o corpo da mensagem resultante da atualização paralela realizada pelo dispositivo no procedimento anterior.

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

## Observar a atualização no aplicativo
<a name="using-device-shadows-view-result"></a>

O aplicativo agora pode consultar o estado atual da sombra conforme relatado pelo dispositivo.

**Para obter o estado atual da sombra usando o AWS CLI**

1. Na linha de comando, insira este comando.

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

   Nas plataformas Windows, você pode usar `con` ao invés de `/dev/stdout`.

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

1. Como a sombra acaba de ser atualizada pelo dispositivo para refletir seu estado atual, ele deve retornar o seguinte documento de sombra.

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

## Além da simulação
<a name="using-device-shadows-next-steps"></a>

Experimente a interação entre a AWS CLI (representando o aplicativo) e o console (representando o dispositivo) para modelar sua solução de IoT.