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

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

CoreHttp 基本 S3 下载演示

介绍

本演示将说明如何使用范围请求从 Amazon S3 HTTP 服务器下载文件。当您使用时,CoreHttp API 本身支持范围请求HTTPClient_AddRangeHeader创建 HTTP 请求。对于微控制器环境,强烈鼓励范围请求。通过在不同范围内下载大文件,而不是在单个请求中下载大文件,可以在不阻止网络套接字的情况下处理文件的每个部分。范围请求降低了丢弃数据包的风险,这需要在 TCP 连接上重新传输,因此它们可以提高设备的功耗。

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

注意

要设置和运行 FreeRTOS 演示,请按照中的步骤操作入门.

单线程与多线程

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

源代码组织

该演示项目被命名http_demo_s3_download.c可以在中找到freertos/demos/coreHTTP/目录和GitHub网站.

配置 Amazon S3 HTTP 服务器连接

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

  1. 设置Amazon账户:

    1. 如果您尚未设置,创建并激活Amazon帐户.

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

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

      2. 向你的授予权限Amazon账户访问 FreeRTOS 和Amazon IoT通过添加这些策略:

        • AmazonS3FullAccess

  2. 按照中的步骤在 S3 中创建存储桶如何创建 S3 存储桶?中的Amazon Simple Storage Storage Service 控制台.

  3. 按照中的步骤将文件上传到 S3如何将文件和文件夹上传至 S3 存储桶?.

  4. 使用位于的脚本生成预签名 URLFreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py. 有关使用说明,请参阅FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md.

功能

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

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

连接到 Amazon S3 HTTP 服务器

此函数使用退避重试连接到服务器 ()尝试与 HTTP 服务器建立 TCP 连接。如果连接失败,则会在超时后重试。在达到最大尝试次数或达到最大超时值之前,超时值将呈指数级增加。connectToServerWithBackoffRetries()如果在配置的尝试次数之后无法建立与服务器的 TCP 连接,则返回失败状态。

此函数prvConnectToServer()演示如何仅使用服务器身份验证建立与 Amazon S3 HTTP 服务器的连接。它使用在文件中实现的基于 mbedTLS 的传输接口Freeertos-Plus /源/应用程序协议/网络_运输/freertos_Plus_Plus_TCP/使用_mbedTLS/USing_mbedTLS/使用_mbedTLS.C.

的源代码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.