本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
coreHTTP 基本 S3 下载演示
Introduction
此演示演示如何使用范围请求HTTPClient_AddRangeHeader
API 本机支持范围请求。对于微控制器环境,强烈建议使用范围请求。通过下载单独范围而不是单个请求中的大型文件,可以处理文件的每个部分,而不会阻止网络套接字。范围请求可降低数据包丢失的风险,这需要通过
TCP 连接重新传输,因此可提高设备的功耗。
此示例使用网络传输接口
要设置和运行 FreeRTOS 演示,请按照开始使用 FreeRTOS中的步骤操作。
单线程与多线程
有两种 coreHTTP 使用模型:单线程 和多线程(多任务)。虽然本节中的演示在线程中运行 HTTP 库,但它实际上演示了如何在单个线程环境中使用 coreHTTP(在演示中只有一个任务使用 HTTP API)。虽然单线程应用程序必须重复调用 HTTP 库,但多线程应用程序可以在代理 (或 守护程序) 任务的后台发送 HTTP 请求。
源代码组织
该演示项目名为 http_demo_s3_download.c
,可以在
目录和 GitHubfreertos
/demos/coreHTTP/
配置 Amazon S3 HTTP 服务器连接
此演示使用预签名 URL 连接到 Amazon S3 HTTP 服务器并授权访问要下载的对象。HTTP 服务器的 TLS 连接仅使用服务器身份验证。Amazon S3在应用程序级别,将使用预签名 URL 查询中的参数对对象访问进行身份验证。按照以下步骤配置到 AWS 的连接。
-
设置 Amazon Web Services (AWS) 账户:
-
如果您尚未执行此操作,请创建并激活一个 AWS 账户
。 -
使用 AWS Identity and Access Management (IAM) 设置账户和权限。IAM 允许您管理您账户中每个用户的权限。默认情况下,用户在根所有者授予权限之前没有权限。
-
要将 IAM 用户添加到您的 AWS 账户,请参阅 IAM 用户指南
。 -
通过添加以下策略,向您的 AWS 账户授予访问 FreeRTOS 和 AWS IoT 的权限:
-
AmazonS3FullAccess
-
-
-
-
按照 Amazon Simple Storage Service 控制台用户指南中的如何创建 S3 存储桶?中的步骤在 S3 中创建存储桶。
-
按照如何将文件和文件夹上传到 S3 存储桶?中的步骤将文件上传到 S3。
-
使用位于
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()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