Etapa 3: demonstrar a assinatura de mensagens com o AWS IoT Device Client - AWS IoT Core

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

Etapa 3: demonstrar a assinatura de mensagens com o AWS IoT Device Client

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

    Concede permissão para que o AWS IoT Device Client receba tópicos MQTT que correspondam aos nomeados no objeto Resource.

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

    Concede permissão para que o AWS IoT Device Client assine filtros de tópicos MQTT que correspondam aos nomeados no objeto Resource.

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

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

Na janela do terminal do computador host local que está conectado ao Raspberry Pi, liste o conteúdo de ~/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 recebidas dessa assinatura no arquivo nomeado no valor de subscribe-file.

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 #. Se não o for, assine novamente o filtro de tópicos #.

  2. Na janela do terminal, digite os seguintes comandos para executar o AWS IoT Device Client usando o arquivo de configuração criado em Crie o arquivo de configuração.

    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 com informações e quaisquer erros ocorridos durante a execução.

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

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

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

  5. Em Carga da mensagem, examine o conteúdo da mensagem.

  6. Selecione Publicar para publicar a mensagem MQTT.

  7. Na janela do terminal, procure pela entrada de mensagem recebida do AWS IoT Device Client, semelhante à seguinte.

    2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
  8. Depois de encontrar a entrada de mensagem recebida, comprovando que a mensagem foi recebida, digite ^C (Ctrl-C) para interromper o AWS IoT Device Client.

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

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

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

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

  3. Executar o AWS IoT Device Client e publicar mensagens a partir do console de teste 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 ~/dc-configs/dc-pubsub-custom-config.json para edição e localize o objeto samples.

  2. 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 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 recebidas dessa assinatura no arquivo nomeado em subscribe-file.

  3. Salve o arquivo de configuração modificado como ~/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 ~/policies/pubsub_test_thing_policy.json para edição e, depois, localize as declarações de política iot::Subscribe e iot::Receive no arquivo.

  2. 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 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 em MQTT e AWS IoT Core políticas.

  3. 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/*" ] }
  4. Salve o documento de política atualizado como ~/policies/pubsub_wild_test_thing_policy.json e saia do editor.

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

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

Para demonstrar como o AWS IoT Device Client assina e recebe diversos tópicos de mensagens MQTT
  1. No cliente de teste MQTT, verifique as assinaturas. Se o cliente de teste MQTT for assinante do filtro de tópicos #, avance para a próxima etapa. Caso contrário, no cliente de teste MQTT, na guia Assinar um tópico, em Filtro de tópicos, insira # (caractere de jogo da velha) e escolha Assinar para assinar.

  2. 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
  3. 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.

  4. 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
  5. 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.

  6. 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
  7. Depois de ver as mensagens que confirmam que ambas as mensagens foram recebidas, digite ^C (Ctrl-C) para interromper o AWS IoT Device Client.

  8. 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 poderá ver a mensagem publicada pelo AWS IoT Device Client no log 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, avance para Tutorial: Demonstre ações remotas (trabalhos) com o AWS IoT Cliente do dispositivo.