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

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

CoreHTTP 基础版 S3 下载演示

重要

此演示托管在 Amazon-FreeRTOS 存储库中,该存储库已过时。建议您创建新项目时从这里开始。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目,请参阅亚马逊 FreeRTOS Github 存储库迁移指南

介绍

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

此示例使用网络传输接口,该接口使用 mbedTLS 在运行 CoreHTTP 的 IoT 设备客户端与 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 服务器并授权访问要下载的对象。Amazon S3 HTTP 服务器的 TLS 连接仅使用服务器身份验证。在应用程序级别,使用预签名 URL 查询中的参数对对象的访问进行身份验证。按照下述步骤操作,将您的连接配置为Amazon。

  1. 设置Amazon账户:

    1. 如果您尚不了解,请创建并激活一个Amazon帐户

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

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

      2. 向您的Amazon账户授予访问 FreeRTOSAmazon IoT 的权限,并添加以下政策:

        • 亚马逊 S3FullAccess

  2. 按照如何创建 S3 桶中的步骤操作,在 S3 中创建存储桶? 在《Amazon 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 服务器

函数 connectToServerWithBackoffRetries() 尝试与 HTTP 服务器建立 TCP 连接。如果连接失败,它会在超时后重试。在达到最大尝试次数或达到最大超时值之前,超时值将呈指数级增长。 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