

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# coreHTTP 기본 다중 스레드 데모
<a name="core-http-bmt-demo"></a>

**중요**  <a name="deprecation-message-demo"></a>
이 데모는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

## 소개
<a name="core-http-bmt-demo-intro"></a>

이 데모는 [FreeRTOS의 스레드 안전 대기열](https://freertos.org/a00018.html)을 사용하여 처리 대기 중인 요청 및 응답을 보관합니다. 이 데모에서 주목해야 할 세 가지 태스크가 있습니다.
+ 메인 태스크는 요청 대기열에 요청이 표시되기를 기다립니다. 네트워크를 통해 해당 요청을 전송한 다음 응답을 응답 대기열에 배치합니다.
+ 요청 태스크는 서버에 전송할 HTTP 라이브러리 요청 객체를 생성하여 요청 대기열에 배치합니다. 각 요청 객체는 애플리케이션이 다운로드하도록 구성한 S3 파일의 바이트 범위를 지정합니다.
+ 응답 태스크는 응답 대기열에 응답이 표시되기를 기다립니다. 그런 다음 수신한 모든 응답을 로그합니다.

이 기본 다중 스레드 데모는 서버 인증만 포함된 TLS 연결을 사용하도록 구성되어 있으며, 이는 Amazon S3 HTTP 서버에 필요합니다. 애플리케이션 계층 인증은 [미리 서명된 URL 쿼리](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html)의 [서명 버전 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 파라미터를 사용하여 수행됩니다.

## 소스 코드 구성
<a name="core-http-bmt-demo-source"></a>

데모 프로젝트는 이름이 `http_demo_s3_download_multithreaded.c`이며 `freertos/demos/coreHTTP/` 디렉터리 및 [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download_multithreaded.c) 웹 사이트에서 찾을 수 있습니다.

## 데모 프로젝트 빌드
<a name="core-http-bmt-demo-building"></a>

이 데모 프로젝트는 [Visual Studio의 무료 Community 에디션](https://visualstudio.microsoft.com/vs/community/)을 사용합니다. 데모를 빌드하려면

1. Visual Studio IDE 내에서 `mqtt_multitask_demo.sln` Visual Studio 솔루션 파일을 엽니다.

1. IDE의 **빌드** 메뉴에서 **솔루션 빌드**를 선택합니다.

**참고**  
Microsoft Visual Studio 2017 또는 이전 버전을 사용하는 경우 **프로젝트 -> RTOSDemos 속성 -> 플랫폼 도구 세트**에서 현재 버전과 호환되는 **플랫폼 도구 세트**를 선택해야 합니다.

## 데모 프로젝트 구성
<a name="core-http-bmt-demo-configuring"></a>

이 데모는 [FreeRTOS\$1TCP TCP/IP 스택](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html)을 사용하므로 [TCP/IP 스타터 프로젝트](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html)에 제공된 지침을 따라 다음을 수행합니다.

1. [필수 구성 요소](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#prerequisites)(예: WinPCap)를 설치합니다.

1. 선택적으로 [고정 또는 동적 IP 주소, 게이트웨이 주소 및 넷마스크를 설정](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#static-dynamic)합니다.

1. 선택적으로 [MAC 주소를 설정](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#mac-addr)합니다.

1. 호스트 시스템에서 [이더넷 네트워크 인터페이스를 선택](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#network-interface)합니다.

1. **중요한 것은** HTTP 데모를 실행하기 전에 [네트워크 연결을 테스트](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#connectivity-test)하는 것입니다.

## Amazon S3 HTTP 서버 연결 구성
<a name="core-http-bmt-demo-configuring-connection"></a>

*coreHTTP 기본 다운로드 데모*의 [Amazon S3 HTTP 서버 연결 구성](core-http-s3-download-demo.md#core-http-s3-download-demo-configure-server) 지침을 따릅니다.

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

이 데모에서 총 세 가지 태스크가 생성됩니다.
+ 네트워크를 통해 요청을 전송하고 응답을 수신하는 태스크.
+ 전송할 요청을 생성하는 태스크.
+ 수신된 응답을 처리하는 태스크.

이 데모에서, 메인 태스크: 

1. 요청 및 응답 대기열을 생성합니다.

1. 서버와의 연결을 생성합니다.

1. 요청 및 응답 태스크를 생성합니다.

1. 요청 대기열이 네트워크를 통해 요청을 전송할 때까지 기다립니다.

1. 네트워크를 통해 수신한 응답을 응답 대기열에 배치합니다.

요청 태스크:

1. 각 범위 요청을 생성합니다.

응답 태스크:

1. 수신된 각 응답을 처리합니다.

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

이 데모는 다중 스레딩을 지원하기 위해 다음 구조를 정의합니다.

**요청 항목**

다음 구조는 요청 대기열에 배치할 요청 항목을 정의합니다. 요청 태스크가 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;
```

**응답 항목**

다음 구조는 응답 대기열에 배치할 응답 항목을 정의합니다. 메인 HTTP 태스크가 네트워크를 통해 응답을 수신하면 응답 항목이 대기열에 복사됩니다.

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

## 메인 HTTP 전송 태스크
<a name="core-http-bmt-demo-main-task"></a>

메인 애플리케이션 태스크:

1. 호스트 주소의 미리 서명된 URL을 파싱하여 Amazon S3 HTTP 서버와의 연결을 설정합니다.

1. S3 버킷 내 객체에 대한 경로의 미리 서명된 URL을 파싱합니다.

1. 서버 인증 TLS를 사용하여 Amazon S3 HTTP 서버에 연결합니다.

1. 요청 및 응답 대기열을 생성합니다.

1. 요청 및 응답 태스크를 생성합니다.

`prvHTTPDemoTask()` 함수가 이 설정을 수행하고 데모 상태를 제공합니다. 이 함수의 소스 코드는 [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L451-L650)에서 찾을 수 있습니다.

`prvDownloadLoop()` 함수에서 메인 태스크는 요청 대기열의 요청을 차단하고 대기합니다. 요청을 수신하면 `HTTPClient_Send()` API 함수를 사용하여 전송합니다. API 함수가 성공하면 응답이 응답 대기열에 배치합니다.

`prvDownloadLoop()`의 소스 코드는 [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L1071-L1174)에서 찾을 수 있습니다.

## HTTP 요청 태스크
<a name="core-http-bmt-demo-request-task"></a>

요청 태스크는 `prvRequestTask` 함수에 지정됩니다. 이 함수의 소스 코드는 [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L778-L876)에서 찾을 수 있습니다.

요청 태스크는 Amazon S3 버킷에서 파일 크기를 검색합니다. 이 작업은 `prvGetS3ObjectFileSize` 함수로 수행됩니다. Amazon S3에 대한 이 첫 번째 요청에 ‘Connection: keep-alive’ 헤더가 추가되어 응답이 전송된 후에도 연결을 열린 상태로 유지합니다. Amazon S3 HTTP 서버는 현재 미리 서명된 URL을 사용하는 HEAD 요청을 지원하지 않으므로 0번째 바이트가 요청됩니다. 파일 크기는 응답의 `Content-Range` 헤더 필드에 포함되어 있습니다. 서버에서 `206 Partial Content` 응답을 전송해야 하며, 수신된 다른 모든 응답 상태 코드는 오류입니다.

`prvGetS3ObjectFileSize`의 소스 코드는 [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L757-L774)에서 찾을 수 있습니다.

요청 태스크는 파일 크기를 검색한 후 파일의 각 범위를 요청합니다. 각 범위 요청은 기본 태스크가 전송할 수 있도록 요청 대기열에 배치됩니다. 파일 범위는 데모 사용자가 매크로 `democonfigRANGE_REQUEST_LENGTH`에서 구성합니다. HTTP 클라이언트 라이브러리 API에서 `HTTPClient_AddRangeHeader` 함수를 사용하는 범위 요청이 기본적으로 지원됩니다. `prvRequestS3ObjectRange` 함수는 `HTTPClient_AddRangeHeader()` 사용 방법을 보여줍니다.

`prvRequestS3ObjectRange` 함수의 소스 코드는 [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L694-L753)에서 찾을 수 있습니다.

## HTTP 응답 태스크
<a name="core-http-bmt-demo-response-task"></a>

응답 태스크는 응답 대기열에서 네트워크를 통해 수신되는 응답을 대기합니다. 메인 태스크는 HTTP 응답을 성공적으로 수신하면 응답 대기열을 채웁니다. 이 태스크는 상태 코드, 헤더, 본문을 로그하여 응답을 처리합니다. 예를 들어 실제 애플리케이션은 응답 본문을 플래시 메모리에 쓰는 방식으로 응답을 처리할 수 있습니다. 응답 상태 코드가 `206 partial content`가 아닌 경우 태스크는 데모가 실패한다고 메인 태스크에 알립니다. 응답 태스크는 `prvResponseTask` 함수에 지정됩니다. 이 함수의 소스 코드는 [GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L961-L1047)에서 찾을 수 있습니다.