下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

coreHTTP 基础 S3 下载演示

 

单线程 VS 多线程

coreHTTP 有两种使用模式,一种是单线程式的,另一种是多线程式的 (多任务)。虽然此页面上的演示在线程中运行 HTTP 库,但它实际上是在演示如何在单线程环境(只有一个任务在演示中使用 HTTP API )中使用 coreHTTP。单线程应用程序必须重复调用 HTTP 库,而多线程应用程序则可以在 agent(或守护进程)任务的后台执行发送 HTTP 请求。
 

简介

本演示展示如何使用范围请求从 AWS S3 http 服务器下载文件。使用 HTTPClient_AddRangeHeader() 创建 HTTP 请求时,coreHTTP API 原生支持范围请求。对于微控制器环境, 强烈建议使用范围请求——使用方法是以不同范围下载大文件,而不是在单个请求中下载,这样可以在不阻塞网络套接字的情况下处理文件的每个部分。范围请求降低了出现丢弃数据包的风险,这些数据包需要在 TCP 连接上重新传输,因此这有助于优化设备的功耗。

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

core HTTP S3 下载演示项目使用 FreeRTOS Windows 移植,因此 您可以利用 Windows上的 免费社区版 Visual Studios 来构建和评估此移植,无需使用任何特定的 MCU 硬件。
 

源代码组织

演示项目名为 http_s3_download_demo.sln, 位于 FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download (在 FreeRTOS 主下载中)(也可在 GitHub 上的 coreHTTP_Windows_Simulator 存储库中找到)。
 

构建演示项目

此演示项目 使用 Visual Studio 免费社区版本。要构建演示,请执行如下操作:

  1. 从 Visual Studio IDE 中打开 Visual Studio 解决方案文件 http_s3_download_demo.sln
  2. 在 IDE 的 Build 菜单中选择 Build Solution

注意:如果您使用的是 Microsoft Visual Studio 2017 或更早版本,则必须选择与您的版本兼容的 “Platform Toolset”:"Project -> RTOSDemos Properties -> Platform Toolset"。
 

配置演示项目

此演示使用 FreeRTOS-Plus-TCP TCP/IP 堆栈,因此请遵照 TCP/IP 入门项目的说明以确保您:

  1. 安装必备 组件(例如 WinPCap)。
  2. 设置静态或 动态 IP 地址、网关地址和网络掩码(可选)。
  3. 设置了 MAC 地址(可选)。
  4. 在主机上选择了 以太网网络接口
  5. 最重要的是 , 请先测试您的网络连接,然后再尝试运行 HTTP 演示。

交付时, TCP/IP 堆栈被配置为使用动态 IP 地址。
 

配置 AWS S3 HTTP 服务器连接

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

  1. 设置 Amazon Web Services (AWS) 帐户:
    • 如果您还没有账户, 请创建并激活 AWS 帐户(其中包括一个免费层级)。
    • 使用 AWS 身份和访问管理 (IAM) 设置帐户和权限。使用 IAM, 可管理帐户中每个用户的权限。默认情况下,获得根所有者的授权 才具有权限。
      1. 要将 IAM 用户添加到您的 AWS 帐户,请参阅《IAM 用户指南》
      2. 通过添加以下策略,授予您的 AWS 帐户访问 FreeRTOS 和 AWS IoT 的权限:
        • AmazonS3FullAccess
  2. 按照 “How do I create an S3 Bucket?” 中的步骤在 S3 中创建存 储桶(请参阅 《Amazon Simple Storage User Guide》
  3. 按照 “How do I upload files and folders to an S3 bucket?”中的步骤将文件上传到 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
 

功能

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

演示的源代码可以 在 GitHub 上的 S3DownloadHTTPExample.c 中下载。
 

连接到 AWS S3 HTTP 服务器

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

connectToServerWithBackoffRetries()的源代码可以 在 GitHub 上的 http_demo_utils.c 中下载。

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

prvConnectToServer() 可 在 GitHub 上的 S3DownloadHTTPExample.c 中下载。
 

创建范围请求

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

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

prvGetS3ObjectFileSize() 的源代码可以 在 GitHub 上的 S3DownloadHTTPExample.c 中下载。

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

源代码可以 在 GitHub 上的 S3DownloadHTTPExample.c 中下载
 

发送范围请求和接收响应

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

prvDownloadS3ObjectFile() 的源代码可以 在 GitHub 上的 S3DownloadHTTPExample.c 中下载。

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.