下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

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 免费社区版。要构建演示,请执行如下操作:

  1. 从 Visual Studio IDE 中打开 "mqtt_multitask_demo.sln" Visual Studio 解决方案文件。
  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 演示之前,测试了网络连接。
 

配置 AWS S3 HTTP 服务器连接

此演示支持的配置选项与 coreHTTP 基础 S3 下载演示相同。请参阅演示文档中关于配置 AWS S3 HTTP 服务器连接的说明。
 

功能

该演示共创建了三项任务:

  • 通过网络发送请求和接收响应
  • 创建要发送的请求
  • 处理收到的响应

在此演示中,主任务负责创建请求和响应队列,创建与服务器的连接,创建请求和响应任务,等待请求队列通过网络发送请求,并将通过网络接收的响应放入响应队列中。请求任务创建范围请求;响应任务则处理收到的所有响应。

Typedef

此演示定义了如下支持多线程的结构体:

请求项
以下结构体定义了要放入请求队列的请求项。请求任务创建 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,以建立与 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.