coreHTTP 기본 S3 다운로드 데모 - 무료RTOS

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

coreHTTP 기본 S3 다운로드 데모

중요

이 데모는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 여기서 시작하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드 섹션을 참조하세요.

소개

이 데모는 범위 요청을 사용하여 Amazon S3 HTTP 서버에서 파일을 다운로드하는 방법을 보여줍니다. HTTP 요청을 생성하는 데 HTTPClient_AddRangeHeader를 사용하면 coreHTTP API에서 범위 요청이 기본적으로 지원됩니다. 마이크로컨트롤러 환경에서는 범위 요청을 적극 권장합니다. 큰 파일을 단일 요청 대신 별도의 범위로 다운로드하면 네트워크 소켓을 차단하지 않고 파일의 각 섹션을 처리할 수 있습니다. 범위 요청을 사용하면 TCP 연결에서 재전송이 필요한 패킷 손실의 위험이 줄어들어 디바이스의 전력 소비가 향상됩니다.

이 예제에서는 mbedTLS를 사용하는 네트워크 전송 인터페이스를 사용하여 coreHTTP를 실행하는 IoT 디바이스 클라이언트와 Amazon S3 HTTP 서버 간에 상호 인증된 연결을 설정합니다.

참고

FreeRTOS 데모를 설정하고 실행하려면 무료로 시작하기RTOS의 단계를 따릅니다.

단일 스레드와 다중 스레드

coreHTTP 사용 모델에는 단일 스레드다중 스레드(멀티태스킹)의 두 가지가 있습니다. 이 섹션의 데모는 하나의 스레드에서 HTTP 라이브러리를 실행하지만 실제로는 단일 스레드 환경에서 coreHTTP를 사용하는 방법을 보여줍니다(데모에서는 하나의 태스크만 HTTP API를 사용함). 단일 스레드 애플리케이션은 HTTP 라이브러리를 반복적으로 직접 호출해야 하지만, 다중 스레드 애플리케이션은 대신 에이전트(또는 대몬(daemon)) 태스크 내에서 백그라운드로 HTTP 요청을 전송할 수 있습니다.

소스 코드 구성

데모 프로젝트의 이름은 http_demo_s3_download.c 정해져 있으며 freertos/demos/coreHTTP/ 디렉토리와 GitHub웹 사이트에서 찾을 수 있습니다.

Amazon S3 HTTP 서버 연결 구성

이 데모는 미리 서명된 URL을 사용하여 Amazon S3 HTTP 서버에 연결하고 다운로드할 객체에 대한 액세스 권한을 부여합니다. Amazon S3 HTTP 서버의 TLS 연결은 서버 인증만 사용합니다. 애플리케이션 수준에서는 객체 액세스가 미리 서명된 URL 쿼리의 파라미터를 사용하여 인증됩니다. 아래 단계에 따라 AWS에 대한 연결을 구성합니다.

  1. AWS 계정 설정:

    1. 아직 계정을 만들지 않았다면 AWS 계정을 만들고 활성화하세요.

    2. 계정 및 권한은 AWS Identity and Access Management (IAM) 을 사용하여 설정합니다. IAM을 사용하면 계정의 각 사용자에게 부여된 권한을 관리할 수 있습니다. 기본적으로 사용자는 루트 소유자가 부여할 때까지는 아무 권한도 없습니다.

      1. AWS 계정에 사용자를 추가하려면 IAM 사용 설명서를 참조하십시오.

      2. 다음 정책을 추가하여 AWS 계정에 AWS IoT FreeRTOS에 액세스할 수 있는 권한을 부여하십시오.

        • 아마존 S3 FullAccess

  2. Amazon Simple Storage Service 사용 설명서S3 버킷을 생성하려면 어떻게 해야 합니까?의 단계에 따라 S3에서 버킷을 생성합니다.

  3. S3 버킷에 파일 및 폴더를 업로드하려면 어떻게 해야 합니까?의 단계에 따라 파일을 S3에 업로드합니다.

  4. FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py 파일에 있는 스크립트를 사용하여 미리 서명된 URL을 생성합니다. 사용 지침은 FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md 섹션을 참조하세요.

기능

데모는 먼저 파일의 크기를 검색합니다. 그런 다음 democonfigRANGE_REQUEST_LENGTH의 범위 크기를 사용하여 루프에서 각 바이트 범위를 순차적으로 요청합니다.

데모의 소스 코드는 웹 사이트에서 찾을 수 있습니다. GitHub

Amazon S3 HTTP 서버에 연결

connectToServerWithBackoffRetries () 함수는 HTTP 서버에 대한 TCP 연결을 시도합니다. 연결이 실패하면 제한 시간이 경과한 후 다시 시도합니다. 최대 시도 횟수에 도달하거나 최대 제한 시간 값에 도달할 때까지 제한 시간 값은 기하급수적으로 증가합니다. connectToServerWithBackoffRetries() 함수는 구성된 시도 횟수 이후에도 서버에 대한 TCP 연결을 설정할 수 없는 경우 실패 상태를 반환합니다.

prvConnectToServer() 함수는 서버 인증만 사용하여 Amazon S3 HTTP 서버에 연결하는 방법을 보여줍니다. FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c 파일에 구현된 mbedTLS 기반 전송 인터페이스를 사용합니다.

의 소스 코드는 에서 찾을 prvConnectToServer() 수 있습니다. GitHub

범위 요청 생성

HTTPClient_AddRangeHeader() API 함수는 바이트 범위를 HTTP 요청 헤더로 직렬화하여 범위 요청을 구성할 수 있도록 지원합니다. 이 데모에서는 범위 요청을 사용하여 파일 크기를 검색하고 파일의 각 섹션을 요청합니다.

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

의 소스 코드는 에서 찾을 prvGetS3ObjectFileSize() GitHub있습니다.

이 데모는 파일 크기를 검색한 후 다운로드할 파일의 각 바이트 범위에 대해 새 범위 요청을 생성합니다. 파일의 각 섹션에 대해 HTTPClient_AddRangeHeader()를 사용합니다.

범위 요청 전송 및 응답 수신

prvDownloadS3ObjectFile() 함수는 전체 파일이 다운로드될 때까지 루프에서 범위 요청을 전송합니다. HTTPClient_Send() API 함수는 요청을 전송하고 동기식으로 응답을 수신합니다. 함수가 반환되면 응답이 xResponse로 수신됩니다. 그런 다음 상태 코드가 206 Partial Content인지 확인되고 지금까지 다운로드한 바이트 수가 Content-Length 헤더 값만큼 증가합니다.

의 소스 코드는 에서 찾을 prvDownloadS3ObjectFile() GitHub있습니다.