

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á.

# Demonstre a assinatura de mensagens com o AWS IoT Device Client
<a name="iot-dc-testconn-subscribe"></a>

Nesta seção, você demonstrará dois tipos de assinaturas de mensagens:
+ Assinatura de tópico único
+ Assinatura de tópicos curinga

As seguintes declarações de política na política criada para esses exercícios concedem ao Raspberry Pi permissão para realizar estas ações:
+ 

**`iot:Receive`**  
Permite que o AWS IoT Device Client receba tópicos do MQTT que correspondam aos nomeados no `Resource` objeto.

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Receive"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/subtopic"
        ]
      }
  ```
+ 

**`iot:Subscribe`**  
Permite que o AWS IoT Device Client assine filtros de tópicos do MQTT que correspondam aos nomeados no `Resource` objeto.

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Subscribe"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic"
        ]
      }
  ```

## Assinatura de um único tópico de mensagem MQTT
<a name="iot-dc-testconn-subscribe-simple-topic"></a>

Este procedimento demonstra como o AWS IoT Device Client pode assinar e registrar mensagens MQTT.

Na janela do terminal do computador host local que está conectado ao Raspberry Pi, liste o conteúdo de **\$1/dc-configs/dc-pubsub-custom-config.json** ou abra o arquivo em um editor de texto para examinar seu conteúdo. Localize o objeto `samples`, que deve ser semelhante ao seguinte.

```
  "samples": {
    "pub-sub": {
      "enabled": true,
      "publish-topic": "test/dc/pubtopic",
      "publish-file": "~/messages/sample-ws-message.json",
      "subscribe-topic": "test/dc/subtopic",
      "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
```

Observe que o valor de `subscribe-topic` é o tópico MQTT que o AWS IoT Device Client assinará quando for executado. O AWS IoT Device Client grava as cargas de mensagens que recebe dessa assinatura no arquivo nomeado no `subscribe-file` valor.

**Para assinar um tópico de mensagem MQTT a partir do AWS IoT Device Client**

1. Certifique-se de que a janela do terminal e a janela com o cliente de teste MQTT estejam visíveis enquanto você realiza esse procedimento. Além disso, certifique-se de que o **cliente de teste MQTT** ainda seja assinante no filtro de tópicos **\$1**. Se não o for, assine novamente o filtro de tópicos **\$1**.

1. Na janela do terminal, insira esses comandos para executar o AWS IoT Device Client usando o arquivo de configuração criado em[Crie o arquivo de configuração](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1).

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   Na janela do terminal, o AWS IoT Device Client exibe mensagens informativas e quaisquer erros que ocorram durante a execução.

   Caso nenhum erro seja exibido na janela do terminal, continue no console do AWS IoT .

1. No AWS IoT console, no **cliente de teste do MQTT**, escolha a guia **Publicar em um tópico**.

1. Em **Nome do tópico**, digite **test/dc/subtopic**

1. Em **Carga da mensagem**, examine o conteúdo da mensagem.

1. Selecione **Publicar** para publicar a mensagem MQTT.

1. Na janela do terminal, observe a entrada da *mensagem recebida* do AWS IoT Device Client que se parece com esta.

   ```
   2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
   ```

1. Depois de ver a entrada da *mensagem recebida* que mostra que a mensagem foi recebida, digite **^C** (Ctrl-C) para interromper o AWS IoT Device Client.

1. Insira o seguinte comando para visualizar o final do arquivo de log de mensagens e ver a mensagem que foi publicada no **cliente de teste MQTT**.

   ```
   tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```

Ao visualizar a mensagem no arquivo de log, demonstrou-se que o AWS IoT Device Client recebeu a mensagem publicada a partir do cliente de teste MQTT.

## Assinar diversos tópicos de mensagens MQTT usando caracteres curinga
<a name="iot-dc-testconn-subscribe-wild-topic"></a>

Esses procedimentos demonstram como o AWS IoT Device Client pode assinar e registrar mensagens MQTT usando caracteres curinga. Para fazer isso, você deve:

1. Atualize o filtro de tópicos que o AWS IoT Device Client usa para assinar tópicos do MQTT.

1. Atualizar a política usada pelo dispositivo para permitir novas assinaturas.

1. Execute o AWS IoT Device Client e publique mensagens do console de teste do MQTT.

**Para criar um arquivo de configuração para assinar diversos tópicos de mensagens MQTT com um filtro de tópicos MQTT curinga**

1. Na janela do terminal do computador host local que está conectado ao Raspberry Pi, abra **\$1/dc-configs/dc-pubsub-custom-config.json** para edição e localize o objeto `samples`.

1. No editor de texto, localize o objeto `samples` e atualize o valor de `subscribe-topic` para que se assemelhe a isto. 

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/#",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

   O novo valor de `subscribe-topic` é um [filtro de tópicos MQTT](topics.md#topicfilters) com um caractere curinga MQTT no final. Isso descreve uma assinatura de todos os tópicos MQTT que começam com `test/dc/`. O AWS IoT Device Client grava as cargas de mensagens que recebe dessa assinatura no arquivo nomeado em`subscribe-file`.

1. Salve o arquivo de configuração modificado como **\$1/dc-configs/dc-pubsub-wild-config.json** e saia do editor de texto.

**Para modificar a política usada pelo Raspberry Pi para permitir a assinatura e recebimento de diversos tópicos de mensagens MQTT**

1. Na janela do terminal do seu computador host local conectado ao Raspberry Pi, em seu editor de texto favorito, abra **\$1/policies/pubsub\$1test\$1thing\$1policy.json** para edição e, depois, localize as declarações de política `iot::Subscribe` e `iot::Receive` no arquivo.

1. Na declaração de política `iot::Subscribe`, atualize a string no objeto Resource para substituir `subtopic` por `*`, de modo que fique semelhante ao seguinte.

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Subscribe"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*"
         ]
       }
   ```
**nota**  
Os [caracteres curinga do filtro de tópicos MQTT](topics.md#topicfilters) são `+` (sinal de adição) e `#` (sinal de jogo da velha). Uma solicitação de assinatura com `#` no final assina todos os tópicos que começam com a string que precede o caractere `#` (como, nesse caso, `test/dc/`).   
Entretanto, o valor do recurso na declaração de política autorizando essa assinatura deve usar `*` (asterisco) no lugar de `#` (sinal de jogo da velha) no ARN do filtro de tópicos. Isso ocorre porque o processador de políticas usa um caractere curinga diferente daquele usado pelo MQTT.  
Para acessar mais informações sobre como usar caracteres curinga para tópicos e filtros de tópicos em políticas, consulte [Usando caracteres curinga no MQTT e nas políticas AWS IoT Core](pub-sub-policy.md#pub-sub-policy-cert).

1. Na declaração de política `iot::Receive`, atualize a string no objeto Resource para substituir `subtopic` por `*`, de modo que fique semelhante ao seguinte.

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Receive"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*"
         ]
       }
   ```

1. Salve o documento de política atualizado como **\$1/policies/pubsub\$1wild\$1test\$1thing\$1policy.json** e saia do editor.

1. Insira o seguinte comando para atualizar a política deste tutorial para usar as novas definições de recursos.

   ```
   aws iot create-policy-version \
   --set-as-default \
   --policy-name "PubSubTestThingPolicy" \
   --policy-document "file://~/policies/pubsub_wild_test_thing_policy.json"
   ```

   Em caso de êxito, ele retornará uma resposta como a seguinte. Observe que `policyVersionId` agora é `2`, o que indica que esta é a segunda versão desta política. 

   Se você obteve êxito em atualizar a política, avance para o próximo procedimento.

   ```
   {
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
       "policyDocument": "{\n  \"Version\": \"2012-10-17\",		 	 	 \n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Connect\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Publish\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Subscribe\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Receive\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n      ]\n    }\n  ]\n}\n",
       "policyVersionId": "2",
       "isDefaultVersion": true
   }
   ```

   Caso receba um erro informando que há versões da política demais para que uma nova seja salva, insira o seguinte comando para listar as versões atuais da política. Examine a lista retornada pelo comando a seguir para encontrar uma versão da política que possa ser excluída.

   ```
   aws iot list-policy-versions --policy-name "PubSubTestThingPolicy"
   ```

   Digite o comando a seguir para excluir uma versão que não é mais necessária. Não é possível excluir a versão padrão da política. A versão padrão da política é aquela com um valor de `isDefaultVersion` de `true`.

   ```
   aws iot delete-policy-version \
   --policy-name "PubSubTestThingPolicy" \
   --policy-version-id policyId
   ```

   Depois de excluir uma versão da política, tente a etapa novamente.

Com o arquivo de configuração e a política atualizados, você está pronto para demonstrar assinaturas curinga com o AWS IoT Device Client.

**Para demonstrar como o AWS IoT Device Client assina e recebe vários tópicos de mensagens do MQTT**

1. No **cliente de teste MQTT**, verifique as assinaturas. Se o **cliente de teste MQTT** for assinante do filtro de tópicos **\$1**, avance para a próxima etapa. Caso contrário, no **cliente de teste do MQTT**, na guia **Assinar um tópico**, em **Filtro de tópicos**, insira **\$1** (caractere de cerquilha) e escolha **Assinar** para assinar.

1. Na janela do terminal do computador host local conectado ao Raspberry Pi, execute os comandos a seguir para iniciar o AWS IoT Device Client.

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-wild-config.json
   ```

1. Enquanto observa a saída do AWS IoT Device Client na janela do terminal no computador host local, retorne ao **cliente de teste MQTT**. Na guia **Publicar em um tópico**, em **Nome do tópico**, insira **test/dc/subtopic** e selecione **Publicar**. 

1. Na janela do terminal, confirme se a mensagem foi recebida procurando uma mensagem como:

   ```
   2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
   ```

1. Enquanto observa a saída do AWS IoT Device Client na janela do terminal do computador host local, retorne ao **cliente de teste MQTT**. Na guia **Publicar em um tópico**, em **Nome do tópico**, insira **test/dc/subtopic2** e selecione **Publicar**. 

1. Na janela do terminal, confirme se a mensagem foi recebida procurando uma mensagem como:

   ```
   2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
   ```

1. Depois de ver as mensagens que confirmam que ambas foram recebidas, digite **^C** (Ctrl-C) para interromper o AWS IoT Device Client.

1. Insira o seguinte comando para visualizar o final do arquivo de log de mensagens e ver a mensagem que foi publicada no **cliente de teste MQTT**.

   ```
   tail -n 20 ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```
**nota**  
O arquivo de log contém somente cargas de mensagens. Os tópicos de mensagens não são registrados no arquivo de log de mensagens recebidas.  
Você também pode ver a mensagem publicada pelo AWS IoT Device Client no registro recebido. Isso ocorre porque o filtro de tópicos curinga inclui esse tópico de mensagem e, por vezes, a solicitação de assinatura pode ser processada pelo agente de mensagens antes que a mensagem publicada seja enviada aos assinantes.

As entradas no arquivo de log apontam que as mensagens foram recebidas. É possível repetir esse procedimento usando outros nomes de tópicos. Todas as mensagens com um nome de tópico que comece com `test/dc/` devem ser recebidas e registradas em log. Mensagens com nomes de tópicos começando com outro texto são ignoradas.

Depois de demonstrar como o AWS IoT Device Client pode publicar e assinar mensagens MQTT, continue. [Tutorial: Demonstre ações remotas (trabalhos) com o AWS IoT Device Client](iot-dc-runjobs.md)