

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Demostración básica de varios subprocesos de coreHTTP
<a name="core-http-bmt-demo"></a>

**importante**  <a name="deprecation-message-demo"></a>
Esta demostración está alojada en el repositorio de Amazon-FreeRTOS, que está en desuso. Recomendamos [empezar por aquí](freertos-getting-started-modular.md) al crear un nuevo proyecto. Si ya tiene un proyecto FreeRTOS existente basado en el repositorio Amazon FreeRTOS, ahora obsoleto, consulte [Guía de migración del repositorio Github de Amazon-FreeRTOS](github-repo-migration.md).

## Introducción
<a name="core-http-bmt-demo-intro"></a>

Esta demostración utiliza las [colas seguras para subprocesos de FreeRTOS](https://freertos.org/a00018.html) para almacenar las solicitudes y respuestas en espera de procesarse. En esta demostración, hay tres tareas que hay que tener en cuenta.
+ La tarea principal espera a que las solicitudes aparezcan en la cola de solicitudes. Enviará esas solicitudes a través de la red y, a continuación, colocará la respuesta en la cola de respuestas.
+ Una tarea de solicitud crea objetos de solicitud de biblioteca HTTP para enviarlos al servidor y los coloca en la cola de solicitudes. Cada objeto de solicitud especifica un rango de bytes del archivo de S3 que la aplicación ha configurado para su descarga.
+ Una tarea de respuesta espera a que las respuestas aparezcan en la cola de respuestas. Registra todas las respuestas que recibe.

Esta demostración básica de varios subprocesos está configurada para usar una conexión TLS únicamente con la autenticación del servidor, que es requerida por el servidor HTTP de Amazon S3. La autenticación de la capa de aplicación se realiza mediante los parámetros de la [versión 4 de la firma](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) en la [consulta de URL prefirmada](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html).

## Organización del código fuente
<a name="core-http-bmt-demo-source"></a>

El proyecto de demostración tiene un nombre `http_demo_s3_download_multithreaded.c` y se puede encontrar en el `freertos/demos/coreHTTP/` directorio y en el [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download_multithreaded.c)sitio web.

## Creación del proyecto de demostración
<a name="core-http-bmt-demo-building"></a>

El proyecto de demostración usa la [edición comunitaria gratuita de Visual Studio](https://visualstudio.microsoft.com/vs/community/). Para crear la demostración:

1. Abra el archivo de la solución de Visual Studio `mqtt_multitask_demo.sln` desde el IDE de Visual Studio.

1. Seleccione **Crear solución** en el menú **Crear** del IDE.

**nota**  
Si utiliza Microsoft Visual Studio 2017 o una versión anterior, debe seleccionar un **conjunto de herramientas de plataforma** compatible con su versión: **Proyecto -> RTOSDemos Propiedades -> Conjunto de herramientas de plataforma**.

## Configuración del proyecto de demostración
<a name="core-http-bmt-demo-configuring"></a>

La demostración usa la [ TCP/IP pila FreeRTOS\$1TCP](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html), así que siga las instrucciones proporcionadas para el proyecto inicial de [TCP/IP](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html) para:

1. Instale los componentes [necesarios (como Win](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#prerequisites)). PCap

1. Si lo desea, [ configure una dirección IP estática o dinámica, una dirección de puerta de enlace y una máscara de red](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#static-dynamic).

1. Si lo desea, [ configure una dirección MAC](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#mac-addr).

1. [ Seleccione una interfaz de red Ethernet](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#network-interface) en su máquina host.

1. **Es importante** [probar la conexión de red](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#connectivity-test) antes de intentar ejecutar la demostración de HTTP.

## Configuración de la conexión del servidor HTTP de Amazon S3
<a name="core-http-bmt-demo-configuring-connection"></a>

Siga las instrucciones que se indican en [Configuración de la conexión del servidor HTTP de Amazon S3](core-http-s3-download-demo.md#core-http-s3-download-demo-configure-server) para la *demostración de descarga básica de coreHTTP*.

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

La demostración crea tres tareas en total: 
+ Una que envía solicitudes y recibe respuestas a través de la red.
+ Uno que crea solicitudes para enviarlas.
+ Uno que procesa las respuestas recibidas.

En esta demostración, la tarea principal: 

1. Crea las colas de solicitudes y respuestas. 

1. Crea la conexión al servidor.

1. Crea las tareas de solicitudes y respuestas.

1. Espera a que la cola de solicitudes envíe las solicitudes a través de la red.

1. Coloca las respuestas recibidas a través de la red en la cola de respuestas.

La tarea de solicitud:

1. Crea cada una de las solicitudes de rango.

La tarea de respuesta:

1. Uno que procesa las respuestas recibidas.

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

La demostración define las siguientes estructuras para admitir varios subprocesos.

**Elementos de solicitud**

Las siguientes estructuras definen un elemento de solicitud para colocarlo en la cola de solicitudes. El elemento de solicitud se copia en la cola después de que la tarea de solicitud cree una solicitud 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;
```

**Elemento de respuesta**

Las siguientes estructuras definen un elemento de respuesta para colocarlo en la cola de respuestas. El elemento de respuesta se copia en la cola después de que la tarea HTTP principal reciba una respuesta a través de la red.

```
/**
 * @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;
```

## Tarea principal de envío HTTP
<a name="core-http-bmt-demo-main-task"></a>

La tarea principal de la aplicación:

1. Analiza la URL prefirmada de la dirección del host para establecer una conexión con el servidor HTTP de Amazon S3.

1. Analiza la URL de prefirmada de la ruta de acceso a los objetos del bucket de S3.

1. Se conecta al servidor HTTP de Amazon S3 utilizando TLS con la autenticación del servidor.

1. Crea las colas de solicitudes y respuestas.

1. Crea las tareas de solicitudes y respuestas.

La función `prvHTTPDemoTask()` realiza esta configuración y proporciona el estado de demostración. El código fuente de esta función se puede encontrar en [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L451-L650).

En la función `prvDownloadLoop()`, la tarea principal bloquea y espera las solicitudes de la cola de solicitudes. Cuando recibe una solicitud, la envía mediante la función de la API `HTTPClient_Send()`. Si la función de la API se realiza correctamente, coloca la respuesta en la cola de respuestas. 

El código fuente de `prvDownloadLoop()` se puede encontrar en [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L1071-L1174).

## Tarea de solicitud HTTP
<a name="core-http-bmt-demo-request-task"></a>

La tarea de solicitud se especifica en la función `prvRequestTask`. El código fuente de esta función se puede encontrar en [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L778-L876).

La tarea de solicitud recupera el tamaño del archivo en el bucket de Amazon S3. Esto se hace en la función `prvGetS3ObjectFileSize`. El encabezado “Connection: keep-alive” se añade a esta solicitud a Amazon S3 para mantener la conexión abierta después de enviar la respuesta. Actualmente, el servidor HTTP de Amazon S3 no admite solicitudes HEAD que utilicen una URL prefirmada, por lo que se solicita el byte 0. El tamaño del archivo se incluye en el campo de encabezado `Content-Range` de la respuesta. Se espera una respuesta `206 Partial Content` del servidor; cualquier otro código de estado de respuesta recibido es un error. 

El código fuente de `prvGetS3ObjectFileSize` se puede encontrar en [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L757-L774).

Después de recuperar el tamaño del archivo, la tarea de solicitud continúa solicitando cada rango del archivo. Cada solicitud de rango se coloca en la cola de solicitudes para que la tarea principal la envíe. El usuario de la demostración configura los rangos de archivos en la macro `democonfigRANGE_REQUEST_LENGTH`. Las solicitudes de rango se admiten de forma nativa en la API de la biblioteca cliente HTTP mediante la función `HTTPClient_AddRangeHeader`. La función `prvRequestS3ObjectRange` muestra cómo utilizar `HTTPClient_AddRangeHeader()`.

El código fuente de la función `prvRequestS3ObjectRange` se puede encontrar en [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L694-L753).

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

Las tareas de respuesta esperan en la cola de respuestas las respuestas recibidas a través de la red. La tarea principal rellena la cola de respuestas cuando recibe correctamente una respuesta HTTP. Esta tarea procesa las respuestas registrando el código de estado, los encabezados y el cuerpo. En el entorno real, una aplicación puede procesar la respuesta escribiendo el cuerpo de la respuesta en una memoria flash, por ejemplo. Si el código de estado de la respuesta no es `206 partial content`, la tarea notifica a la tarea principal que la demostración debe fallar. La tarea de respuesta se especifica en la función `prvResponseTask`. El código fuente de esta función se puede encontrar en [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L961-L1047).