

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

Esta demostración muestra cómo utilizar [solicitudes de rango](https://tools.ietf.org/html/rfc7233) para descargar archivos del servidor HTTP de Amazon S3. Las solicitudes de rango se admiten de forma nativa en la API coreHTTP cuando se utiliza `HTTPClient_AddRangeHeader` para crear la solicitud HTTP. Para un entorno de microcontroladores, se recomienda encarecidamente utilizar solicitudes de rango. Al descargar un archivo grande en rangos separados, en lugar de hacerlo en una sola solicitud, se puede procesar cada sección del archivo sin bloquear el socket de red. Las solicitudes de rango reducen el riesgo de que se pierdan paquetes, lo que requiere retransmisiones en la conexión TCP, por lo que mejoran el consumo de energía del dispositivo.

En este ejemplo se utiliza una [interfaz de transporte de red](https://freertos.org/network-interface.html) que utiliza mbedTLS para establecer una conexión con autenticación mutua entre un cliente de dispositivo IoT que ejecuta coreHTTP y el servidor HTTP de Amazon S3.

**nota**  
Para configurar y ejecutar las demostraciones de FreeRTOS, siga los pasos que se indican en [Introducción a FreeRTOS](freertos-getting-started.md).

### Subproceso único frente a varios subprocesos
<a name="core-http-s3-download-demo-threads"></a>

Hay dos modelos de uso de coreHTTP: *subproceso único* y *varios subprocesos* (multitarea). Aunque la demostración de esta sección ejecuta la biblioteca HTTP en un subproceso, en realidad muestra cómo usar coreHTTP en un entorno de un solo subproceso (solo una tarea utiliza la API HTTP en la demostración). Si bien las aplicaciones con un solo subproceso deben llamar repetidamente a la biblioteca HTTP, las aplicaciones con varios subprocesos pueden enviar solicitudes HTTP en segundo plano dentro de una tarea de agente (o daemon).

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

El proyecto de demostración tiene un nombre `http_demo_s3_download.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.c)sitio web. 

## Configuración de la conexión del servidor HTTP de Amazon S3
<a name="core-http-s3-download-demo-configure-server"></a>

Esta demostración utiliza una URL prefirmada para conectarse al servidor HTTP de Amazon S3 y autorizar el acceso al objeto que se va a descargar. La conexión TLS del servidor HTTP de Amazon S3 utiliza únicamente la autenticación del servidor. En el nivel de la aplicación, el acceso al objeto se autentica con los parámetros de la consulta de URL prefirmada. Siga los pasos que se indican a continuación para configurar la conexión a AWS.

1. Configure una AWS cuenta:

   1. Si aún no lo has hecho, [crea y activa una AWS cuenta](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).

   1. Las cuentas y los permisos se configuran mediante AWS Identity and Access Management (IAM). IAM le permite gestionar los permisos de cada usuario de su cuenta. De forma predeterminada, un usuario no tiene permisos hasta que el propietario raíz los concede.

      1. Para añadir un usuario a tu AWS cuenta, consulta la Guía del [usuario de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/).

      1. Conceda permiso a su AWS cuenta para acceder a FreeRTOS y AWS IoT añada estas políticas:
         + Amazon S3 FullAccess

1. Cree un bucket en S3 siguiendo los pasos que se indican en [¿Cómo se puede crear un bucket de S3?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html) en la *Guía del usuario de la consola de Amazon Simple Storage Service*.

1. Cargue un archivo en S3 siguiendo los pasos que se indican en [¿Cómo puedo cargar archivos y carpetas en un bucket de S3?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html).

1. Genere una URL prefirmada mediante el script ubicado en `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py`. Para obtener instrucciones, consulte `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md`. 

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

La demostración recupera primero el tamaño del archivo. Luego, solicita cada rango de bytes secuencialmente, en un bucle, con tamaños de rango de `democonfigRANGE_REQUEST_LENGTH`.

El código fuente de la demostración se encuentra en el sitio [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c)web.

### Conexión al servidor HTTP de Amazon S3
<a name="core-http-s3-download-demo-connecting"></a>

La función [ connectToServerWithBackoffRetries()](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) intenta establecer una conexión TCP con el servidor HTTP. Si la conexión falla, se vuelve a intentar cuando se agota el tiempo de espera. El valor de tiempo de espera aumentará exponencialmente hasta que se alcance el número máximo de intentos o se alcance el valor de tiempo de espera máximo. `connectToServerWithBackoffRetries()` devuelve un estado de error si la conexión TCP con el servidor no se puede establecer después del número de intentos configurado. 

La función `prvConnectToServer()` muestra cómo establecer una conexión con el servidor HTTP de Amazon S3 utilizando únicamente la autenticación del servidor. [Utiliza la interfaz de transporte basada en MbedTLS que se implementa en el archivo 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) 

El código fuente de se encuentra en. `prvConnectToServer()` [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L273-L333)

### Creación de una solicitud de rango
<a name="core-http-s3-download-demo-creating-range-request"></a>

La función API `HTTPClient_AddRangeHeader()` admite la serialización de un rango de bytes en los encabezados de las solicitudes HTTP para formar una solicitud de rango. En esta demostración, las solicitudes de rango se utilizan para recuperar el tamaño del archivo y solicitar cada sección del archivo.

La función `prvGetS3ObjectFileSize()` recupera el tamaño del archivo del bucket de S3. El encabezado `Connection: keep-alive` se añade en esta primera solicitud a Amazon S3 para mantener la conexión abierta después de enviar la respuesta. Actualmente, el servidor HTTP de 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 se `prvGetS3ObjectFileSize()` puede encontrar en [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L337-L502).

Después de recuperar el tamaño del archivo, esta demostración crea una nueva solicitud de rango para cada rango de bytes del archivo que se va a descargar. Utiliza `HTTPClient_AddRangeHeader()` para cada sección del archivo. 

### Envío de solicitudes de rango y recepción de respuestas
<a name="core-http-s3-download-demo-send-request"></a>

La función `prvDownloadS3ObjectFile()` envía las solicitudes de rango en un bucle hasta que se descarga todo el archivo. La función API `HTTPClient_Send()` envía una solicitud y recibe la respuesta de forma sincrónica. Cuando la función regresa, la respuesta se recibe en un `xResponse`. A continuación, se comprueba que el código de estado sea `206 Partial Content` y el número de bytes descargados hasta el momento se incrementa en función del valor del encabezado `Content-Length`. 

El código fuente de se `prvDownloadS3ObjectFile()` puede encontrar en [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L506-L651).