

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 download de coreHTTP básica do S3
<a name="core-http-s3-download-demo"></a>

**Importante**  <a name="deprecation-message-demo"></a>
Essa demonstração está hospedada no repositório Amazon-FreeRTOS, que está preterido. 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 Amazon-FreeRTOS que está preterido, consulte o [Guia de migração do repositório Github do Amazon FreeRTOS](github-repo-migration.md).

## Introdução
<a name="core-http-s3-download-demo-intro"></a>

Esta demonstração mostra como usar [solicitações de intervalo](https://tools.ietf.org/html/rfc7233) para fazer download de arquivos do servidor HTTP do Amazon S3. As solicitações de intervalo têm suporte nativo na API do coreHTTP quando você usa `HTTPClient_AddRangeHeader` para criar a solicitação HTTP. As solicitações de intervalo são altamente recomendadas para um ambiente de microcontrolador. Ao baixar um arquivo grande em intervalos separados e não em uma única solicitação, cada seção do arquivo pode ser processada sem bloquear o soquete da rede. As solicitações de intervalo diminuem o risco de perda de pacotes, que exigem retransmissões na conexão TCP e, portanto, melhoram o consumo de energia do dispositivo.

Este exemplo usa uma [interface de transporte de rede](https://freertos.org/network-interface.html) que usa mbedTLS para estabelecer uma conexão mutuamente autenticada entre um cliente de dispositivo de IoT executando coreHTTP e o servidor HTTP do Amazon S3.

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

### Thread único versus thread múltiplo
<a name="core-http-s3-download-demo-threads"></a>

Existem dois modelos de uso da coreHTTP, com *thread único* e com *threads múltiplos* (multitarefas). Embora a demonstração nesta seção execute a biblioteca HTTP em um thread, ela realmente demonstra como usar a coreHTTP em um ambiente com thread único (somente uma tarefa usa a API HTTP na demonstração). Embora as aplicações com thread único devam chamar repetidamente a biblioteca HTTP, as aplicações com threads múltiplos podem enviar solicitações HTTP em segundo plano em uma tarefa de agente (ou daemon).

## Organização de código-fonte
<a name="core-http-s3-download-demo-source-code"></a>

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

## Configuração de conexão do servidor HTTP do Amazon S3
<a name="core-http-s3-download-demo-configure-server"></a>

Esta demonstração usa uma URL pré-assinada para se conectar ao servidor HTTP do Amazon S3 e autorizar o acesso ao objeto para download. A conexão TLS do servidor HTTP do Amazon S3 usa somente a autenticação do servidor. No nível da aplicação, o acesso ao objeto é autenticado com os parâmetros na consulta de URL pré-assinada. Siga as etapas abaixo para configurar sua conexão com a AWS.

1. Configure uma AWS conta:

   1. Se ainda não o fez, [crie e ative uma AWS conta](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).

   1. As contas e permissões são definidas usando AWS Identity and Access Management (IAM). O IAM permite gerenciar as permissões para cada usuário em sua conta. Por padrão, um usuário não tem permissões até que sejam concedidas pelo proprietário raiz.

      1. Para adicionar um usuário à sua AWS conta, consulte o [Guia do usuário do IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/).

      1. Conceda permissão à sua AWS conta para acessar os FreeRTOS adicionando estas AWS IoT políticas:
         + Amazon S3 FullAccess

1. Criar um bucket no S3 seguindo as etapas em [Como criar um bucket do S3?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html) no *console Guia do usuário do Amazon Simple Storage Service*.

1. Faça upload de um arquivo no S3 seguindo as etapas em [Como fazer upload de arquivos e pastas em um bucket do S3?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html).

1. Gere um URL pré-assinado usando o script localizado em `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py`. Para obter instruções de uso, consulte `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md`. 

## Funcionalidade
<a name="core-http-s3-download-demo-functionality"></a>

A demonstração recupera primeiro o tamanho do arquivo. Depois, solicita cada intervalo de bytes sequencialmente, em um loop, com tamanhos de intervalo de `democonfigRANGE_REQUEST_LENGTH`.

O código-fonte da demonstração pode ser encontrado no [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c)site.

### Conexão ao servidor HTTP do Amazon S3
<a name="core-http-s3-download-demo-connecting"></a>

A função [ connectToServerWithBackoffRetries()](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) tenta fazer uma conexão TCP com o servidor HTTP. Se a conexão falhar, ela tentará novamente após um tempo limite. O valor do tempo limite aumentará exponencialmente até que o número máximo de tentativas ou o valor do tempo limite seja atingido. `connectToServerWithBackoffRetries()` retornará um status de falha se a conexão TCP com o servidor não puder ser estabelecida após o número configurado de tentativas. 

A função `prvConnectToServer()` demonstra como estabelecer uma conexão com o servidor HTTP do Amazon S3 usando somente a autenticação do servidor. [Ele usa a interface de transporte baseada em mbedTLS que é implementada no arquivo FreeRTOS- \$1mbedtls.c. Plus/Source/Application-Protocols/network\$1transport/freertos\$1plus\$1tcp/using\$1mbedtls/using](https://github.com/FreeRTOS/FreeRTOS/blob/202012.00/FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c) 

O código-fonte de `prvConnectToServer()` pode ser encontrado em [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L273-L333).

### Criação de solicitação de intervalo
<a name="core-http-s3-download-demo-creating-range-request"></a>

A função `HTTPClient_AddRangeHeader()` da API oferece suporte a serialização de um intervalo de bytes nos cabeçalhos da solicitação HTTP para formar uma solicitação de intervalo. As solicitações de intervalo são usadas nesta demonstração para recuperar o tamanho do arquivo e solicitar cada seção do arquivo.

A função `prvGetS3ObjectFileSize()` recupera o tamanho do arquivo no bucket do S3. O cabeçalho `Connection: keep-alive` é adicionado nessa primeira solicitação ao Amazon S3 para manter a conexão aberta após o envio da resposta. Atualmente, o servidor HTTP do S3 não oferece suporte às solicitações HEAD usando uma URL pré-assinada, portanto, o 0 (zero) byte é solicitado. O campo de cabeçalho da resposta `Content-Range` contém o tamanho do arquivo. Uma resposta `206 Partial Content` do servidor é esperada; qualquer outro código de status de resposta recebido é um erro.

O código-fonte de `prvGetS3ObjectFileSize()` pode ser encontrado em [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L337-L502).

Depois de recuperar o tamanho do arquivo, essa demonstração cria uma nova solicitação de intervalo para cada intervalo de bytes do arquivo a ser baixado. Ela usa `HTTPClient_AddRangeHeader()` para cada seção do arquivo. 

### Envio de solicitações e recebimento de respostas
<a name="core-http-s3-download-demo-send-request"></a>

A função `prvDownloadS3ObjectFile()` envia as solicitações de intervalo em um loop até que o arquivo inteiro seja baixado. A função `HTTPClient_Send()` da API envia uma solicitação e recebe a resposta de forma síncrona. Quando a função retorna, a resposta é recebida em um `xResponse`. Em seguida, o código de status é verificado como `206 Partial Content` e o número de bytes baixados até o momento é incrementado pelo valor do cabeçalho `Content-Length`. 

O código-fonte de `prvDownloadS3ObjectFile()` pode ser encontrado em [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L506-L651).