coreHTTP 基础多线程演示
简介
本演示使用 FreeRTOS线程安全队列保存等待处理的请求和响应。在该演示中,
需注意三项任务:
- 主任务等待请求队列中的请求,通过网络发送这些请求,然后
将响应放入响应队列。
- 请求任务创建要发送到服务器的 HTTP 库请求对象,然后将它们放入请求队列。每个
请求对象均可指定应用程序配置用于下载的 S3 文件的字节范围。
- 响应任务等待响应队列中的响应,并会记录收到的所有响应。
出于 S3 HTTP 服务器的要求,此基础多线程演示配置为仅使用带有服务器身份验证的 TLS 连接。应用层身份验证使用预签名 URL 查询中的 Signature Version 4 参数完成。
coreHTTP 基础多线程演示项目使用
FreeRTOS Windows 端口,因此您可以
因此您可以用 Windows 上免费的 Visual Studio 社区版来构建和评估该演示,而无需任何特殊 MCU 硬件。
源代码组织
多线程 HTTP S3 演示的 Visual Studio 解决方案被称为
http_s3_download_multithreaded_demo.sln
,位于
/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded 目录,
而该目录位于主 FreeRTOS 下载中。
构建演示项目
此演示项目使用
Visual Studio
免费社区版。要构建演示,请执行如下操作:
- 从 Visual Studio IDE 中打开 "
mqtt_multitask_demo.sln
" Visual Studio 解决方案文件。
- 在 IDE 的 '
Build
' 菜单中选择 'Build Solution
'。
注意:如果您使用的是 Microsoft Visual Studio 2017 或更早版本,则必须选择与您的版本兼容的 “Platform
Toolset
”:"Project -> RTOSDemos Properties -> Platform Toolset
"。
配置演示项目
此演示使用
FreeRTOS-Plus-TCP TCP/IP 堆栈,因此请遵照
TCP/IP 入门项目的说明以确保您:
- 安装了必要的
组件(如 WinPCap)。
- 设置静态或
动态 IP 地址、网关地址和网络掩码(可选)。
- 设置了 MAC 地址(可选)。
- 在主机上选择了
以太网网络接口。
- 最重要的是 ,
在尝试运行 HTTP 演示之前,测试了网络连接。
配置 AWS S3 HTTP 服务器连接
此演示支持的配置选项与 coreHTTP 基础 S3 下载演示相同。请参阅演示文档中关于配置 AWS S3 HTTP 服务器连接的说明。
功能
该演示共创建了三项任务:
- 通过网络发送请求和接收响应
- 创建要发送的请求
- 处理收到的响应
在此演示中,主任务负责创建请求和响应队列,创建与服务器的连接,创建请求和响应任务,等待请求队列通过网络发送请求,并将通过网络接收的响应放入响应队列中。请求任务创建范围请求;响应任务则处理收到的所有响应。
Typedef
此演示定义了如下支持多线程的结构体:
请求项
以下结构体定义了要放入请求队列的请求项。请求任务创建 HTTP 请求之后,请求项会复制到队列中。
typedef struct RequestItem
{
HTTPRequestHeaders_t xRequestHeaders;
uint8_t ucHeaderBuffer[ democonfigUSER_BUFFER_LENGTH ];
} RequestItem_t;
响应项
以下结构体定义了要放入响应队列的响应项。主 HTTP 任务通过网络接收到响应之后,响应项会复制到队列中。
typedef struct ResponseItem
{
HTTPResponse_t xResponse;
uint8_t ucResponseBuffer[ democonfigUSER_BUFFER_LENGTH ];
} ResponseItem_t;
主 HTTP 发送任务
主应用程序任务首先解析主机地址的预签名 URL,以建立与 AWS
S3 HTTP 服务器的连接。该任务还会解析 S3 存储桶中对象路径的预签名 URL,然后使用带有服务器身份验证的 TLS 连接到 AWS HTTP S3
服务器。接下来,创建请求和响应队列以及请求和响应任务
。函数 "prvHTTPDemoTask()
" 执行此设置并提供演示状态。
有关此函数的源代码,
详见 GitHub 上的 S3DownloadMultithreadedHTTPExample.c 文件。
在函数 "prvDownloadLoop()
" 中,主任务阻塞并等待来自请求队列的请求,然后使用
API 函数 "HTTPClient_Send()
" 发送收到的请求。如果 API 函数成功,
则将响应放入响应队列。
有关 "prvDownloadLoop()
" 的源代码,详见 GitHub 上的 S3DownloadMultithreadedHTTPExample.c 文件。
HTTP 请求任务
请求任务在函数 "prvRequestTask
" 中指定。
有关此函数的源代码,详见 GitHub 上的 S3DownloadMultithreadedHTTPExample.c 文件。
请求任务首先检索 S3 中对象的大小,由函数 "prvGetS3ObjectFileSize
" 完成。请求任务还会检索 S3 存储桶中文件的大小。在对 S3 的请求中添加 "Connection: keep-alive" 标头,即可在发送响应后保持连接开启。S3 HTTP 服务器当前不支持使用预签名 URL 的 HEAD 请求,因此请求第 0 个字节。文件的大小包含在响应的 Content-Range
标头字段中。预计服务器会返回 206 Partial Content
响应;收到的其他响应状态代码均为错误。
有关 "prvGetS3ObjectFileSize
" 的源代码,详见 GitHub 上的 S3DownloadMultithreadedHTTPExample.c 文件。
检索到文件大小后,请求任务会持续请求文件的每个范围。每个范围请求会放入请求队列中,等待主任务发送。文件范围由演示用户在宏 democonfigRANGE_REQUEST_LENGTH
中配置。范围请求在使用函数 "HTTPClient_AddRangeHeader()
" 的 HTTP 客户端库 API 中可获原生支持。函数 "prvRequestS3ObjectRange()
" 演示了 "HTTPClient_AddRangeHeader()
" 的用法。
有关 "prvRequestS3ObjectRange()
" 的源代码,详见 GitHub 上的 S3DownloadMultithreadedHTTPExample.c 文件。
HTTP 响应任务
响应任务在响应队列中等待通过网络接收到的响应。成功接收到 HTTP 响应后,主任务会填充响应队列。此任务通过记录状态代码、标头和正文来处理响应。例如,实际应用程序在处理响应时可以将响应主体写入闪存。如果响应状态代码不是 206 Partial Content
,则该任务会通知主任务演示失败。响应任务在函数 "prvResponseTask()
" 中指定。
有关此函数的源代码,详见 GitHub 上的 S3DownloadMultithreadedHTTPExample.c 文件。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.