

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

# Demonstração de autenticação mútua da coreMQTT
<a name="mqtt-demo-ma"></a>

**Importante**  <a name="deprecation-message-demo"></a>
Essa demonstração está hospedada no Amazon-FreeRTOS repositório que está obsoleto. Recomendamos [começar aqui](freertos-getting-started-modular.md) ao criar um novo projeto. Se você já tem um projeto FreeRTOS existente baseado no repositório agora Amazon-FreeRTOS obsoleto, consulte o. [Amazon-FreeRTOS Guia de migração do repositório Github](github-repo-migration.md)

## Introdução
<a name="mqtt-demo-ma-introduction"></a>

O projeto de demonstração da coreMQTT mostra como estabelecer uma conexão com um agente MQTT usando TLS com autenticação mútua entre o cliente e o servidor. [Esta demonstração usa uma implementação de interface de TLS-based transporte mbed para estabelecer uma conexão TLS autenticada pelo servidor e pelo cliente e demonstra o fluxo de trabalho de assinatura e publicação do MQTT no nível QoS 1.](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Toc442180914) Ela assina um filtro de tópicos, em seguida, publica em tópicos que correspondem ao filtro e aguarda o recebimento dessas mensagens do servidor no nível de QoS 1. Esse ciclo de publicar para o agente e receber de volta a mesma mensagem do agente se repete indefinidamente. As mensagens nesta demonstração são enviadas QoS 1, o que garante pelo menos uma entrega de acordo com a especificação MQTT.

**nota**  
Para configurar e executar as demonstrações do FreeRTOS, siga as etapas em [Conceitos básicos do FreeRTOS](freertos-getting-started.md).

## Código-fonte
<a name="mqtt-demo-ma-source-code"></a>

O arquivo fonte de demonstração tem um nome `mqtt_demo_mutual_auth.c` e pode ser encontrado no `{{freertos}}/demos/coreMQTT/` diretório e no [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c)site.

## Funcionalidade
<a name="mqtt-demo-ma-functionality"></a>

A demonstração cria uma única tarefa de aplicação que percorre um conjunto de exemplos demonstrando como se conectar ao agente, assinar um tópico no agente, publicar em um tópico no agente e, enfim, se desconectar do agente. A aplicação de demonstração assina e publica o mesmo tópico. Cada vez que a demonstração publica uma mensagem para o agente MQTT, o agente envia a mesma mensagem de volta para a aplicação de demonstração.

A conclusão com êxito da demonstração gerará um resultado semelhante ao da imagem a seguir.

![Saída do terminal de demonstração MQTT em caso de conclusão com êxito](http://docs.aws.amazon.com/pt_br/freertos/latest/userguide/images/coremqtt-mad-output.png)


O AWS IoT console gerará uma saída semelhante à imagem a seguir.

![Saída do console de demonstração MQTT em caso de conclusão com êxito](http://docs.aws.amazon.com/pt_br/freertos/latest/userguide/images/coremqtt-mad-console.png)


## Lógica de repetição com recuo exponencial e jitter
<a name="mqtt-demo-ma-retry-logic"></a>

A BackoffForRetry função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L671-L717) mostra como operações de rede com falhas com o servidor, por exemplo, conexões TLS ou solicitações de assinatura MQTT, podem ser repetidas com recuo e instabilidade exponenciais. A função calcula o período de recuo para a próxima tentativa de repetição e executa o recuo se as tentativas de repetição não forem esgotadas. Como o cálculo do período de recuo exige a geração de um número aleatório, a função usa o módulo PKCS11 para gerar o número aleatório. O uso do módulo PKCS11 permite o acesso a um TRNG (Gerador de Números Aleatórios Verdadeiros) se a plataforma do fornecedor oferecer suporte a isso. Recomendamos que você alimente o gerador de números aleatórios com uma fonte de entropia específica do dispositivo para reduzir a probabilidade de colisões de dispositivos durante as novas tentativas de conexão.

## Conexão ao agente MQTT
<a name="mqtt-demo-ma-connecting"></a>

A ConnectToServerWithBackoffRetries função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L721-L782) tenta fazer uma conexão TLS mutuamente autenticada com o agente MQTT. Se a conexão falhar, ela tentará novamente após um período de recuo. O período de recuo aumentará exponencialmente até que o número máximo de tentativas ou o valor do período de recuo seja atingido. A função `BackoffAlgorithm_GetNextBackoff` fornecerá um valor de recuo aumentando exponencialmente e retornará `RetryUtilsRetriesExhausted` quando o número máximo de tentativas for atingido. A função `prvConnectToServerWithBackoffRetries` retornará um status de falha se a conexão TLS com o agente não puder ser estabelecida após o número configurado de tentativas.

A CreateMQTTConnectionWithBroker função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L785-L848) demonstra como estabelecer uma conexão MQTT com um broker MQTT com uma sessão limpa. Ela usa a interface de transporte TLS, que é implementada no arquivo `FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c`. Lembre-se de que estamos configurando os segundos de keep-alive para o agente em `xConnectInfo`.

A próxima função mostra como a interface de transporte TLS e a função de tempo são definidas em um contexto MQTT usando a função `MQTT_Init`. E mostra também como um ponteiro da função de retorno de chamada de evento (`prvEventCallback`) é definido. Esse retorno de chamada é usado para relatar mensagens recebidas.

## Assinatura em um tópico MQTT
<a name="mqtt-demo-ma-subscribing"></a>

A MQTTSubscribeWithBackoffRetries função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L871-L969) demonstra como assinar um filtro de tópicos no broker MQTT. O exemplo demonstra como assinar um filtro de tópico, mas é possível passar uma lista de filtros de tópicos na mesma chamada de API de assinatura para assinar mais de um filtro de tópico. Além disso, caso o agente MQTT rejeite a solicitação de assinatura, a assinatura tentará novamente, com recuo exponencial, por `RETRY_MAX_ATTEMPTS`.

## Publicar em um tópico
<a name="mqtt-demo-ma-publishing"></a>

A MQTTPublishToTopic função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L972-L1004) demonstra como publicar em um tópico no broker MQTT. 

## Recebimento de mensagens
<a name="mqtt-demo-ma-receiving"></a>

A aplicação registra uma função de retorno de chamada de evento antes de se conectar ao agente, conforme descrito anteriormente. A função `prvMQTTDemoTask` chama a função `MQTT_ProcessLoop` para receber mensagens. Quando uma mensagem MQTT é recebida, ela chama a função de retorno de chamada do evento registrada pela aplicação. A EventCallback função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1139-L1154) é um exemplo dessa função de retorno de chamada de evento. `prvEventCallback`examina o tipo de pacote de entrada e chama o manipulador apropriado. No exemplo abaixo, a função chama `prvMQTTProcessIncomingPublish()` para manipular mensagens de publicação recebidas ou `prvMQTTProcessResponse()` para manipular confirmações (ACK).

## Processamento de pacotes de publicação MQTT recebidos
<a name="mqtt-demo-ma-processing"></a>

A MQTTProcessIncomingPublish função [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1108-L1135) demonstra como processar um pacote de publicação do agente MQTT. 

## Cancelar a inscrição em um tópico
<a name="mqtt-demo-ma-unsubscribing"></a>

A última etapa do fluxo de trabalho é cancelar a assinatura do tópico para que o agente não envie mensagens publicadas do `mqttexampleTOPIC`. Aqui está a definição da função [prv MQTTUnsubscribeFromTopic](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1007-L1043).

## Alteração da CA raiz usada na demonstração
<a name="mqtt-demo-ma-root-ca"></a>

Por padrão, as demonstrações do FreeRTOS usam o certificado Amazon Root CA 1 (chave RSA de 2048 bits) para se autenticar no servidor. AWS IoT Core É possível usar outros [ certificados CA para autenticação do servidor](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html#server-authentication-certs), incluindo o certificado Amazon Root CA 3 (chave ECC de 256 bits). Como alterar a CA raiz da demonstração de autenticação mútua da coreMQTT: 

1. Em um editor de texto, abra o arquivo `{{freertos}}/vendors/{{vendor}}/boards/{{board}}/aws_demos/config_files/mqtt_demo_mutual_auth_config.h`.

1. No arquivo, localize a linha a seguir.

   ```
    * #define democonfigROOT_CA_PEM    "...insert here..." 
   ```

   Remover o comentário dessa linha e, se necessário, movê-lo para depois do final ` */` do bloco de comentários.

1. Copie o certificado CA que você deseja usar e cole-o no texto `"...insert here..."`. O resultado será algo semelhante a este exemplo:

   ```
   #define democonfigROOT_CA_PEM   "-----BEGIN CERTIFICATE-----\n"\
   "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\
   "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\
   "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\
   "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\
   "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\
   "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\
   "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\
   "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\
   "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\
   "YyRIHN8wfdVoOw==\n"\
   "-----END CERTIFICATE-----\n"
   ```

1. (Opcional) Você pode alterar a CA raiz de outras demonstrações. Repita as etapas de 1 a 3 para cada arquivo `{{freertos}}/vendors/{{vendor}}/boards/{{board}}/aws_demos/config_files/{{demo-name}}_config.h`.