coreHTTP 基本 S3 下载演示 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

coreHTTP 基本 S3 下载演示

Introduction

此演示演示如何使用范围请求从 Amazon S3 HTTP 服务器下载文件。当您使用 coreHTTP 创建 HTTP 请求时,HTTPClient_AddRangeHeader API 本机支持范围请求。对于微控制器环境,强烈建议使用范围请求。通过下载单独范围而不是单个请求中的大型文件,可以处理文件的每个部分,而不会阻止网络套接字。范围请求可降低数据包丢失的风险,这需要通过 TCP 连接重新传输,因此可提高设备的功耗。

此示例使用网络传输接口,该接口使用 mbedTLS 在运行 IoT 的 coreHTTP 设备客户端与 Amazon S3 HTTP 服务器之间建立经相互身份验证的连接。

注意

要设置和运行 FreeRTOS 演示,请按照开始使用 FreeRTOS中的步骤操作。

单线程与多线程

有两种 coreHTTP 使用模型:单线程多线程(多任务)。虽然本节中的演示在线程中运行 HTTP 库,但它实际上演示了如何在单个线程环境中使用 coreHTTP(在演示中只有一个任务使用 HTTP API)。虽然单线程应用程序必须重复调用 HTTP 库,但多线程应用程序可以在代理 (或 守护程序) 任务的后台发送 HTTP 请求。

源代码组织

该演示项目名为 http_demo_s3_download.c,可以在 freertos/demos/coreHTTP/ 目录和 GitHub 网站上找到它。

配置 Amazon S3 HTTP 服务器连接

此演示使用预签名 URL 连接到 Amazon S3 HTTP 服务器并授权访问要下载的对象。HTTP 服务器的 TLS 连接仅使用服务器身份验证。Amazon S3在应用程序级别,将使用预签名 URL 查询中的参数对对象访问进行身份验证。按照以下步骤配置到 AWS 的连接。

  1. 设置 Amazon Web Services (AWS) 账户:

    1. 如果您尚未执行此操作,请创建并激活一个 AWS 账户

    2. 使用 AWS Identity and Access Management (IAM) 设置账户和权限。IAM 允许您管理您账户中每个用户的权限。默认情况下,用户在根所有者授予权限之前没有权限。

      1. 要将 IAM 用户添加到您的 AWS 账户,请参阅 IAM 用户指南

      2. 通过添加以下策略,向您的 AWS 账户授予访问 FreeRTOS 和 AWS IoT 的权限:

        • AmazonS3FullAccess

  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_generato/README.md

Functionality

该演示首先检索文件大小。然后,它在循环中按顺序请求每个字节范围,范围大小为 democonfigRANGE_REQUEST_LENGTH

演示的源代码可在 GitHub 网站中找到。

连接到 Amazon S3 HTTP 服务器

函数 connectToServerWithBackoffRetries() 尝试与 HTTP 服务器建立 TCP 连接。如果连接失败,它会在超时后重试。超时值将以指数方式增加,直到达到最大尝试次数或达到最大超时值。connectToServerWithBackoffRetries() 在配置的尝试次数后,如果无法建立与服务器的 TCP 连接,则返回失败状态。

函数 prvConnectToServer() 演示如何仅使用服务器身份验证建立与 Amazon S3 HTTP 服务器的连接。它使用在文件 mbedTLS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c 中实现的基于 FreeRTOS 的传输接口。

的源代码可在 prvConnectToServer() GitHub 上找到。

创建范围请求

API 函数 HTTPClient_AddRangeHeader() 支持将字节范围序列化到 HTTP 请求标头中,从而形成范围请求。在此演示中,使用范围请求来检索文件大小并请求文件的每个部分。

函数 prvGetS3ObjectFileSize() 检索 S3 存储桶中文件的大小。在此第一个请求中,将添加 Connection: keep-alive 标头 Amazon S3,以在发送响应后使连接保持打开状态。S3 HTTP 服务器当前不支持使用预签名 URL 的 HEAD 请求,因此请求第 0 个字节。响应的 Content-Range 标头字段中包含文件的大小。预计服务器会发出 206 Partial Content 响应;收到的任何其他响应状态代码会出现错误。

的源代码可在 prvGetS3ObjectFileSize() GitHub 上找到。

在检索文件大小后,该演示会为要下载的文件的每个字节范围创建一个新的范围请求。它对文件的每个部分使用 HTTPClient_AddRangeHeader()

发送范围请求和接收响应

函数 prvDownloadS3ObjectFile() 以循环方式发送范围请求,直到下载整个文件。API 函数 HTTPClient_Send() 发送请求并同步接收响应。当函数返回时,响应在 xResponse 中接收。 然后,状态代码将验证为 206 Partial Content,并且到目前为止下载的字节数将由 Content-Length 标头值增加。

的源代码可在 prvDownloadS3ObjectFile() GitHub 上找到。