本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
CoreHttp 基本多线程演示
介绍
此演示使用FreeRTOS 的线程安全队列
-
主要任务等待请求出现在请求队列中。它将通过网络发送这些请求,然后将响应放入响应队列中。
-
请求任务创建 HTTP 库请求对象以发送到服务器,然后将它们放入请求队列中。每个请求对象都指定应用程序已配置为下载的 S3 文件的字节范围。
-
响应任务等待响应出现在响应队列中。它会记录收到的每个响应。
此基本的多线程演示配置为仅将 TLS 连接与服务器身份验证结合使用,这是 Amazon S3 HTTP 服务器所要求的。通过使用签名版本 4中的参数预签名 URL 查询.
源代码组织
该演示项目被命名http_demo_s3_download_multithreaded.c
可以在中找到
目录和GitHubfreertos
/demos/coreHTTP/
构建演示项目
该演示项目使用Visual Studio 的免费社区版
-
打开
mqtt_multitask_demo.sln
Visual Studio IDE 中的 Visual Studio 解决方案文件。 -
Select构建方案从 IDE 中构建菜单。
如果你使用的是微软 Visual Studio 2017 或更早版本,那么你必须选择平台工具集与你的版本兼容:项目-> rtosDemOS 属性-> 平台工具集.
配置演示项目
该演示使用FreeRTOS+TCP TCP/IP 堆栈
配置 Amazon S3 HTTP 服务器连接
按照说明进行操作配置 Amazon S3 HTTP 服务器连接中的CoreHttp 基本下载演示.
功能
该演示共创建了三个任务:
通过网络发送请求和接收响应的一个。
创建要发送的请求的一个。
处理收到的回复的一个。
在此演示中,主要任务是:
创建请求和响应队列。
创建与服务器的连接。
创建请求和响应任务。
等待请求队列通过网络发送请求。
将通过网络收到的回复放入响应队列中。
请求任务:
创建每个范围请求。
响应任务:
处理收到的每个回复。
Typededs
该演示定义了以下结构来支持多线程。
请求商品
以下结构定义了要放入请求队列的请求项。请求任务创建 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 发送任务
主要的应用程序任务:
解析主机地址的预签名 URL 以建立与 Amazon S3 HTTP 服务器的连接。
解析 S3 存储桶中对象的路径的预签名 URL。
使用带服务器身份验证的 TLS 连接到 Amazon S3 HTTP 服务器。
创建请求和响应队列。
创建请求和响应任务。
此函数prvHTTPDemoTask()
是否设置了,并给出演示状态。可以在中找到此函数的源代码Github
在函数prvDownloadLoop()
,主要任务会阻止并等待来自请求队列的请求。当它收到请求时,它会使用 API 函数发送它HTTPClient_Send()
. 如果 API 函数成功,则会将响应放入响应队列中。
用于的源代码prvDownloadLoop()
可以在以下网站找到GitHub。
HTTP 请求任务
请求任务在函数中指定prvRequestTask
. 可以在中找到此函数的源代码Github
请求任务将检索 Amazon S3 存储桶中文件的大小。这是在函数中完成的。prvGetS3ObjectFileSize
. 向 Amazon S3 发出的此请求中添加了 “连接:保持活动状态” 标头,以便在发送响应后保持连接的打开状态。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