coreHTTP 基本多线程演示 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

coreHTTP 基本多线程演示

Introduction

此演示使用 FreeRTOS 的线程安全队列来保存等待处理的请求和响应。在此演示中,有三个需要记录的任务。

  • 主任务等待请求显示在请求队列中。它将通过网络发送这些请求,然后将响应放入响应队列中。

  • 请求任务创建 HTTP 库请求对象以发送到服务器,并将它们放入请求队列中。每个请求对象指定应用程序为下载而配置的 S3 文件的字节范围。

  • 响应任务等待响应队列中出现响应。它记录它收到的每个响应。

这个基本多线程演示配置为仅使用 TLS 连接与服务器身份验证,这是 Amazon S3 HTTP 服务器所需要的。应用程序层身份验证是使用预签名 URL 查询中的签名版本 4 参数完成的。

源代码组织

该演示项目名为 ,可以在 freertos/demos/coreHTTP/ 目录和 GitHub 网站中找到。

构建演示项目

该演示项目使用 Visual Studio 的免费社区版本。构建演示:

  1. 从 Visual Studio IDE 中打开 mqtt_multitask_demo.sln Visual Studio 解决方案文件。

  2. 从 IDE 的 Build (生成) 菜单中选择 Build Solution (生成解决方案)

注意

如果您使用的是 Microsoft Visual Studio 2017 或更早版本,则必须选择与您的版本兼容的平台工具集项目 -> RTOSDemos 属性 -> 平台工具集

配置演示项目

该演示使用 +TCP TCP/IP 堆栈FreeRTOS,因此请按照为 TCP/IP 初学者项目提供的说明操作,以:

  1. 安装 先决条件组件(例如 WinPCap)。

  2. (可选) 设置静态或动态 IP 地址、网关地址和网络掩码

  3. (可选) 设置 MAC 地址

  4. 在主机上选择以太网网络接口。

  5. 非常重要 先测试您的网络连接,然后再尝试运行 HTTP 演示。

配置 Amazon S3 HTTP 服务器连接

按照 配置 Amazon S3 HTTP 服务器连接 基本下载演示coreHTTP中的 说明进行操作。

Functionality

该演示总共创建三个任务:

  • 通过网络发送请求和接收响应的响应。

  • 用于创建要发送的请求的请求。

  • 一个用于处理收到的响应。

在此演示中,主要任务为:

  1. 创建请求和响应队列。

  2. 创建到服务器的连接。

  3. 创建请求和响应任务。

  4. 等待请求队列通过网络发送请求。

  5. 将网络上收到的响应放入响应队列中。

请求任务:

  1. 创建每个范围请求。

响应任务:

  1. 处理收到的每个响应。

Typedefs

该演示定义了以下结构来支持多线程处理。

请求项目

以下结构定义了要放入请求队列的请求项目。在请求任务创建 HTTP 请求后,请求项目将复制到队列中。

/** * @brief Data type for the request queue. * * Contains the request header struct and its corresponding buffer, to be * populated and enqueued by the request task, and read by the main task. The * buffer is included to avoid pointer inaccuracy during queue copy operations. */ typedef struct RequestItem { HTTPRequestHeaders_t xRequestHeaders; uint8_t ucHeaderBuffer[ democonfigUSER_BUFFER_LENGTH ]; } RequestItem_t;

响应项

以下结构定义了要放入响应队列的响应项目。在主要 HTTP 任务通过网络收到响应后,响应项将复制到队列中。

/** * @brief Data type for the response queue. * * Contains the response data type and its corresponding buffer, to be enqueued * by the main task, and interpreted by the response task. The buffer is * included to avoid pointer inaccuracy during queue copy operations. */ typedef struct ResponseItem { HTTPResponse_t xResponse; uint8_t ucResponseBuffer[ democonfigUSER_BUFFER_LENGTH ]; } ResponseItem_t;

主要 HTTP 发送任务

主应用程序任务:

  1. 分析主机地址的预签名 URL 以与 Amazon S3 HTTP 服务器建立连接。

  2. 解析 S3 存储桶中对象的路径预签名 URL。

  3. 将 TLS 与服务器身份验证结合使用来连接到 Amazon S3 HTTP 服务器。

  4. 创建请求和响应队列。

  5. 创建请求和响应任务。

函数 prvHTTPDemoTask() 会进行此设置,并提供演示状态。此函数的源代码可在 Github 上找到。

在函数 prvDownloadLoop() 中,主任务阻止并等待来自请求队列的请求。在收到请求时,它会使用 API 函数 HTTPClient_Send() 发送请求。 如果 API 函数成功,则将响应放入响应队列中。

可以在 prvDownloadLoop() Github 上找到 的源代码。

HTTP 请求任务

请求任务是在函数 prvRequestTask 中指定的。 此函数的源代码可在 Github 上找到。

请求任务检索 Amazon S3 存储桶中文件的大小。此操作在函数 prvGetS3ObjectFileSize 中完成。 发送响应后,将向 Amazon S3 发送“Connection: keep-alive”标头以保持连接打开状态。HTTP 服务器当前不支持使用预签名 URL 的 HEAD 请求,因此请求第 0 个字节。Amazon S3文件的 大小包含在响应的 Content-Range 标头字段中。预期来自服务器的是 206 Partial Content 响应;收到的任何其他响应状态代码都是错误。

可以在 prvGetS3ObjectFileSizeGithub 上找到 的源代码。

检索文件大小后,请求任务将继续请求文件的每个范围。每个范围请求都放在请求队列中,以供主任务发送。文件范围由宏 democonfigRANGE_REQUEST_LENGTH 中的演示用户配置。 使用 HTTPClient_AddRangeHeader 函数的 HTTP 客户端库 API 中本机支持范围请求。 函数 prvRequestS3ObjectRange 演示如何使用 HTTPClient_AddRangeHeader()

prvRequestS3ObjectRangeGithub 上可以找到函数 的源代码。

HTTP 响应任务

响应任务等待响应队列,以接收通过网络收到的响应。主任务在成功接收 HTTP 响应时填充响应队列。此任务通过记录状态代码、标头和正文来处理响应。例如,真实应用程序通过将响应正文写入闪存来处理响应。如果响应状态代码不是 206 partial content,则任务通知主任务演示应失败。响应任务是在函数 prvResponseTask 中指定的。 此函数的源代码可在 Github 上找到。