

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 threads múltiplas básica da coreHTTP
<a name="core-http-bmt-demo"></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="core-http-bmt-demo-intro"></a>

Esta demonstração usa as [filas thread-safe do FreeRTOS](https://freertos.org/a00018.html) para manter solicitações e respostas em espera para serem processadas. Nesta demonstração, tome nota de três tarefas.
+ A tarefa principal espera que as solicitações apareçam na fila de solicitações. Ela enviará essas solicitações pela rede e, em seguida, colocará a resposta na fila de respostas.
+ Uma tarefa de solicitação cria objetos de solicitação da biblioteca HTTP para enviar ao servidor e os coloca na fila de solicitações. Cada objeto de solicitação especifica um intervalo de bytes do arquivo S3 que a aplicação configurou para baixar.
+ Uma tarefa de resposta espera as respostas aparecerem na fila de respostas. Ela registra todas as respostas que recebe.

Essa demonstração de threads múltiplos básica está configurada para usar uma conexão TLS somente com autenticação de servidor; isso é exigido pelo servidor HTTP do Amazon S3. A autenticação da camada da aplicação é feita usando os parâmetros [Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) na [consulta de URL pré-assinada](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html).

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

O projeto de demonstração tem um nome `http_demo_s3_download_multithreaded.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_multithreaded.c)site.

## Compilação do projeto de demonstração
<a name="core-http-bmt-demo-building"></a>

O projeto de demonstração usa a [edição gratuita da comunidade do Visual Studio](https://visualstudio.microsoft.com/vs/community/). Como criar a demonstração:

1. Abra o arquivo da solução do Visual Studio `mqtt_multitask_demo.sln` a partir do IDE do Visual Studio.

1. Selecione **Criar solução** no menu **Compilar** do IDE.

**nota**  
Se você estiver usando o Microsoft Visual Studio 2017 ou anterior, deverá selecionar um **conjunto de ferramentas de plataforma** compatível com sua versão: **Projeto -> Propriedades do RTOSDemos -> Conjunto de ferramentas da plataforma**.

## Configuração do projeto de demonstração
<a name="core-http-bmt-demo-configuring"></a>

[A demonstração usa a [ TCP/IP pilha FreeRTOS\+TCP](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html), então siga as instruções fornecidas para o projeto inicial para: TCP/IP ](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html)

1. Instale os [ componentes pré-requisitos](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#prerequisites) (como o WinPcap).

1. Opcionalmente, [ defina um endereço IP estático ou dinâmico, endereço de gateway e máscara de rede](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#static-dynamic).

1. Opcionalmente, [ defina um endereço MAC](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#mac-addr).

1. [ Selecione uma interface de rede Ethernet](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#network-interface) em sua máquina host.

1. **É importante** [testar a conexão de rede](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#connectivity-test) antes de tentar executar a demonstração HTTP.

## Configuração de conexão do servidor HTTP do Amazon S3
<a name="core-http-bmt-demo-configuring-connection"></a>

Siga as instruções para [Configuração de conexão do servidor HTTP do Amazon S3](core-http-s3-download-demo.md#core-http-s3-download-demo-configure-server) na *demonstração básica de download da coreHTTP*.

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

A demonstração cria um total de três tarefas: 
+ Uma que envia solicitações e recebe respostas pela rede.
+ Uma que cria solicitações para enviar.
+ Uma que processa as respostas recebidas.

Nesta demonstração, a tarefa principal: 

1. Cria as filas de solicitação e resposta. 

1. Cria a conexão com o servidor.

1. Cria as tarefas de solicitação e resposta.

1. Espera que a fila de solicitações envie solicitações pela rede.

1. Coloca as respostas recebidas pela rede na fila de respostas.

A tarefa de solicitação:

1. Cria cada uma das solicitações de intervalo.

A tarefa de resposta:

1. Processa cada uma das respostas recebidas.

## Typedefs
<a name="core-http-bmt-demo-typedefs"></a>

A demonstração define as seguintes estruturas para oferecer suporte a threads múltiplos.

**Itens de solicitação**

As estruturas a seguir definem um item de solicitação a ser colocado na fila de solicitações. O item de solicitação é copiado para a fila depois que a tarefa de solicitação cria uma solicitação HTTP.

```
/**
 * @brief Data type for the request queue.
 *
 * Contains the request header struct and its corresponding buffer, to be
 * populated and enqueued by the request task, and read by the main task. The
 * buffer is included to avoid pointer inaccuracy during queue copy operations.
 */
typedef struct RequestItem
{
    HTTPRequestHeaders_t xRequestHeaders;
    uint8_t ucHeaderBuffer[ democonfigUSER_BUFFER_LENGTH ];
} RequestItem_t;
```

**Item de resposta**

As estruturas a seguir definem um item de resposta a ser colocado na fila de respostas. O item de resposta é copiado para a fila depois que a tarefa HTTP principal recebe uma resposta pela rede.

```
/**
 * @brief Data type for the response queue.
 *
 * Contains the response data type and its corresponding buffer, to be enqueued
 * by the main task, and interpreted by the response task. The buffer is
 * included to avoid pointer inaccuracy during queue copy operations.
 */
typedef struct ResponseItem
{
    HTTPResponse_t xResponse;
    uint8_t ucResponseBuffer[ democonfigUSER_BUFFER_LENGTH ];
} ResponseItem_t;
```

## Tarefa de envio HTTP principal
<a name="core-http-bmt-demo-main-task"></a>

A tarefa principal da aplicação:

1. Analisa a URL pré-assinada do endereço do host para estabelecer uma conexão com o servidor HTTP do Amazon S3.

1. Analisa o URL pré-assinado do caminho para os objetos no bucket do S3.

1. Se conecta ao servidor HTTP do Amazon S3 usando TLS com a autenticação do servidor.

1. Cria as filas de solicitação e resposta.

1. Cria as tarefas de solicitação e resposta.

A função `prvHTTPDemoTask()` faz essa configuração e fornece o status da demonstração. O código-fonte para essa função pode ser encontrado no [ Github](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L451-L650).

Na função `prvDownloadLoop()`, a tarefa principal bloqueia e aguarda as solicitações da fila de solicitações. Ao receber uma solicitação, ela a envia usando a função `HTTPClient_Send()` da API. Se a função da API obtiver êxito, ela colocará a resposta na fila de respostas. 

O código-fonte para `prvDownloadLoop()` pode ser encontrado no [ GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L1071-L1174).

## Tarefa de solicitação HTTP
<a name="core-http-bmt-demo-request-task"></a>

A tarefa de solicitação é especificada na função `prvRequestTask`. O código-fonte para essa função pode ser encontrado no [ Github](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L778-L876).

A tarefa de solicitação recupera o tamanho do arquivo no bucket do Amazon S3. Isso é feito na função `prvGetS3ObjectFileSize`. O cabeçalho "Connection: keep-alive" é adicionado nessa solicitação ao Amazon S3 para manter a conexão aberta após o envio da resposta. Atualmente, o servidor HTTP do Amazon 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 para `prvGetS3ObjectFileSize` pode ser encontrado no [ GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L757-L774).

Depois de recuperar o tamanho do arquivo, a tarefa de solicitação continua solicitando cada intervalo do arquivo. Toda solicitação de intervalo é colocada na fila de solicitações para da tarefa principal enviar. Os intervalos de arquivos são configurados pelo usuário da demonstração na macro `democonfigRANGE_REQUEST_LENGTH`. As solicitações de intervalo têm suporte nativo na API da biblioteca do cliente HTTP usando a função `HTTPClient_AddRangeHeader`. A função `prvRequestS3ObjectRange` demonstra como usar `HTTPClient_AddRangeHeader()`.

O código-fonte para a função `prvRequestS3ObjectRange` pode ser encontrado no [ Github](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L694-L753).

## Tarefa de resposta HTTP
<a name="core-http-bmt-demo-response-task"></a>

As tarefas de resposta aguardam na fila de respostas as respostas recebidas pela rede. A tarefa principal preenche a fila de respostas quando recebe uma resposta HTTP com êxito. Essa tarefa processa as respostas registrando o código de status, os cabeçalhos e o corpo. Uma aplicação em ambiente real, por exemplo, pode processar a resposta gravando o corpo da resposta na memória flash. Se o código de status da resposta não for `206 partial content`, a tarefa notificará a tarefa principal de que a demonstração deve obter falha. A tarefa da resposta é especificada na função `prvResponseTask`. O código-fonte para essa função pode ser encontrado no [ Github](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L961-L1047).