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

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

CoreHTTP 基本多线程演示

重要

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

介绍

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

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

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

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

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

源代码组织

演示项目已命名http_demo_s3_download_multithreaded.c,可以在freertos/demos/coreHTTP/目录和 GitHub网站上找到。

构建演示项目

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

  1. mqtt_multitask_demo.sln Visual Studio IDE 中打开视觉工作室解决方案文件。

  2. 从 IDE 的 “生成” 菜单中选择 “生成解决方案”。

注意

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

配置演示项目

该演示使用 FreerTOS+TCP TCP/IP 堆栈,因此请按照为 TCP/IP 入门项目提供的说明进行操作:

  1. 安装必备组件(例如 WinPCap)。

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

  3. (可选)设置 MAC 地址

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

  5. 重要的是,在尝试运行 HTTP 演示之前,请测试您的网络连接

配置Amazon S3 HTTP 服务器连接

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

功能

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

  • 一种通过网络发送请求和接收响应的服务器。

  • 一个创建要发送的请求。

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

在这个演示中,主要任务是:

  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 的请求中添加了 “连接:keep-alive” 标头,以在发送响应后保持连接处于打开状态。Amazon S3 HTTP 服务器目前不支持使用预签名 URL 的 HEAD 请求,因此请求第 0 字节。文件的大小包含在响应的Content-Range标头字段中。预计服务器会206 Partial Content做出响应;收到的任何其他响应状态码都是错误。

的源代码prvGetS3ObjectFileSize可以在 Github 上找到。

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

该函数的源代码prvRequestS3ObjectRange可以在 Github 上找到。

HTTP 响应任务

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