本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
CoreHTTP 基础版 S3 下载演示
此演示托管在 Amazon-FreeRTOS 存储库中,该存储库已过时。建议您创建新项目时从这里开始。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目,请参阅亚马逊 FreeRTOS Github 存储库迁移指南。
介绍
此演示展示了如何使用范围请求HTTPClient_AddRangeHeader
创建 HTTP 请求时,CoreHTTP 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 服务器并授权访问要下载的对象。Amazon S3 HTTP 服务器的 TLS 连接仅使用服务器身份验证。在应用程序级别,使用预签名 URL 查询中的参数对对象的访问进行身份验证。按照下述步骤操作,将您的连接配置为Amazon。
-
设置Amazon账户:
-
如果您尚不了解,请创建并激活一个Amazon帐户
。 -
使用Amazon Identity and Access Management (IAM) 设置账户和权限。IAM 允许您管理账户中每个用户的权限。默认情况下,只有在根所有者授予用户权限后,用户才有权限。
-
要向您的Amazon账户添加用户,请参阅 IAM 用户指南。
-
向您的Amazon账户授予访问 FreeRTOSAmazon IoT 的权限,并添加以下政策:
-
亚马逊 S3FullAccess
-
-
-
-
按照如何创建 S3 桶中的步骤操作,在 S3 中创建存储桶? 在《Amazon Service 控制台用户指南》中。
-
使用位于的脚本生成预签名 URL
FreeRTOS-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 服务器
函数 connectToServerWithBackoffRetries()connectToServerWithBackoffRetries()
如果在配置的尝试次数后仍无法建立与服务器的 TCP 连接,则返回失败状态。
该函数prvConnectToServer()
演示如何仅使用服务器身份验证与 Amazon S3 HTTP 服务器建立连接。它使用基于 mbedTLS 的传输接口,该接口在 freerTOS-plus/Source/Application-Protocols/network_transport/freertos_plus_TCP/using_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