Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
CoreHTTP-Basis-Multithread-Demo
Wichtig
Diese Demo wird im Amazon-FreeRTOS-Repository gehostet, das veraltet ist. Wir empfehlen, dass Sie hier beginnen, wenn Sie ein neues Projekt erstellen. Wenn Sie bereits ein vorhandenes FreeRTOS-Projekt haben, das auf dem inzwischen veralteten Amazon-FreeRTOS-Repository basiert, finden Sie weitere Informationen unter. Leitfaden zur Migration des kostenlosen RTOS Github-Repositorys von Amazon
Einführung
Diese Demo verwendet die threadsicheren Warteschlangen von FreeRTOS, um Anfragen und Antworten zu speichern
-
Die Hauptaufgabe wartet darauf, dass Anfragen in der Anforderungswarteschlange erscheinen. Sie sendet diese Anfragen über das Netzwerk und platziert die Antwort dann in die Antwortwarteschlange.
-
Eine Anforderungsaufgabe erstellt Anforderungsobjekte der HTTP-Bibliothek, die an den Server gesendet werden sollen, und platziert sie in der Anforderungswarteschlange. Jedes Anforderungsobjekt gibt einen Bytebereich der S3-Datei an, die die Anwendung für den Download konfiguriert hat.
-
Eine Antwortaufgabe wartet darauf, dass Antworten in der Antwortwarteschlange erscheinen. Sie protokolliert jede Antwort, die sie erhält.
Diese grundlegende Multithread-Demo ist so konfiguriert, dass sie nur eine TLS-Verbindung mit Serverauthentifizierung verwendet. Dies ist für den Amazon S3 S3-HTTP-Server erforderlich. Die Authentifizierung auf Anwendungsebene erfolgt mithilfe der Signature Version 4-Parameter in der vorsignierten URL-Abfrage.
Organisation des Quellcodes
Das Demo-Projekt ist benannt http_demo_s3_download_multithreaded.c
und kann im
Verzeichnis und auf der GitHubfreertos
/demos/coreHTTP/
Das Demo-Projekt erstellen
Das Demo-Projekt verwendet die kostenlose Community-Edition von Visual Studio
-
Öffnen Sie die
mqtt_multitask_demo.sln
Visual Studio-Lösungsdatei in der Visual Studio-IDE. -
Wählen Sie im Build-Menü der IDE die Option Build Solution aus.
Anmerkung
Wenn Sie Microsoft Visual Studio 2017 oder früher verwenden, müssen Sie ein Platform Toolset auswählen, das mit Ihrer Version kompatibel ist: Project -> RTOSDemos Properties -> Platform Toolset.
Konfiguration des Demo-Projekts
Die Demo verwendet den FreeRTOS+TCP TCP/IP-Stack. Folgen Sie daher den Anweisungen für das TCP/IP-Starterprojekt
-
Installieren Sie die erforderlichen Komponenten
(z. B. WinPCap). -
Legen Sie optional eine statische oder dynamische IP-Adresse, Gateway-Adresse und Netzmaske
fest. -
Wählen Sie eine Ethernet-Netzwerkschnittstelle
auf Ihrem Host-Computer aus. -
Testen Sie unbedingt Ihre Netzwerkverbindung
, bevor Sie versuchen, die HTTP-Demo auszuführen.
Konfiguration der Amazon S3 S3-HTTP-Serververbindung
Folgen Sie den Anweisungen Konfiguration der Amazon S3 S3-HTTP-Serververbindung in der CoreHTTP Basic Download-Demo.
Funktionalität
Die Demo erstellt insgesamt drei Aufgaben:
Eine, die Anfragen sendet und Antworten über das Netzwerk empfängt.
Eine, die Sendeanfragen erstellt.
Eine, die die empfangenen Antworten verarbeitet.
In dieser Demo ist die Hauptaufgabe:
Erstellt die Anforderungs- und Antwortwarteschlangen.
Stellt die Verbindung zum Server her.
Erstellt die Anforderungs- und Antwortaufgaben.
Wartet darauf, dass die Anforderungswarteschlange Anfragen über das Netzwerk sendet.
Platziert über das Netzwerk empfangene Antworten in die Antwortwarteschlange.
Die Anforderungsaufgabe:
Erstellt jede der Bereichsanforderungen.
Die Antwortaufgabe:
Verarbeitet jede der eingegangenen Antworten.
Typdefinitionen
Die Demo definiert die folgenden Strukturen zur Unterstützung von Multithreading.
Artikel anfragen
Die folgenden Strukturen definieren ein Anforderungselement, das in die Anforderungswarteschlange gestellt werden soll. Das Anforderungselement wird in die Warteschlange kopiert, nachdem die Anforderungsaufgabe eine HTTP-Anfrage erstellt hat.
/**
* @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;
Antwortelement
Die folgenden Strukturen definieren ein Antwortelement, das in die Antwortwarteschlange aufgenommen werden soll. Das Antwortelement wird in die Warteschlange kopiert, nachdem die HTTP-Hauptaufgabe eine Antwort über das Netzwerk erhalten hat.
/**
* @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;
Hauptaufgabe zum Senden von HTTP
Die Hauptaufgabe der Anwendung:
Analysiert die vorsignierte URL für die Hostadresse, um eine Verbindung mit dem Amazon S3 S3-HTTP-Server herzustellen.
Analysiert die vorsignierte URL nach dem Pfad zu den Objekten im S3-Bucket.
Stellt über TLS mit Serverauthentifizierung eine Verbindung zum Amazon S3 S3-HTTP-Server her.
Erstellt die Anforderungs- und Antwortwarteschlangen.
Erstellt die Anfrage- und Antwortaufgaben.
Die Funktion prvHTTPDemoTask()
führt diese Einrichtung durch und gibt den Demo-Status an. Der Quellcode für diese Funktion ist auf Github
In der Funktion prvDownloadLoop()
blockiert und wartet die Hauptaufgabe auf Anfragen aus der Anforderungswarteschlange. Wenn sie eine Anfrage erhält, sendet sie sie mithilfe der API-FunktionHTTPClient_Send()
. Wenn die API-Funktion erfolgreich war, wird die Antwort in die Antwortwarteschlange gestellt.
Der Quellcode für prvDownloadLoop()
ist auf Github zu finden.
HTTP-Anforderungsaufgabe
Die Anforderungsaufgabe ist in der Funktion angegebenprvRequestTask
. Der Quellcode für diese Funktion ist auf Github
Die Anforderungsaufgabe ruft die Größe der Datei im Amazon S3 S3-Bucket ab. Dies erfolgt in der FunktionprvGetS3ObjectFileSize
. Der Header „Connection: keep-alive“ wird zu dieser Anfrage an Amazon S3 hinzugefügt, damit die Verbindung auch nach dem Senden der Antwort bestehen bleibt. Der Amazon S3 S3-HTTP-Server unterstützt derzeit keine HEAD-Anfragen, die eine vorsignierte URL verwenden, daher wird das 0-te Byte angefordert. Die Größe der Datei ist im Content-Range
Header-Feld der Antwort enthalten. Eine 206 Partial Content
Antwort wird vom Server erwartet; jeder andere empfangene Antwortstatuscode ist ein Fehler.
Der Quellcode für prvGetS3ObjectFileSize
kann auf Github gefunden werden.
Nach dem Abrufen der Dateigröße fordert die Anforderungsaufgabe weiterhin jeden Bereich der Datei an. Jede Bereichsanforderung wird in die Anforderungswarteschlange gestellt, damit die Hauptaufgabe gesendet werden kann. Die Dateibereiche werden vom Demo-Benutzer im Makro konfiguriertdemoconfigRANGE_REQUEST_LENGTH
. Bereichsanforderungen werden in der HTTP-Clientbibliothek-API mithilfe der Funktion HTTPClient_AddRangeHeader
nativ unterstützt. Die Funktion prvRequestS3ObjectRange
demonstriert, wie man sie benutztHTTPClient_AddRangeHeader()
.
Der Quellcode für die Funktion prvRequestS3ObjectRange
ist auf Github
HTTP-Antwort-Aufgabe
Die Antwortaufgaben warten in der Antwortwarteschlange auf Antworten, die über das Netzwerk empfangen wurden. Die Hauptaufgabe füllt die Antwortwarteschlange, wenn sie erfolgreich eine HTTP-Antwort empfängt. Diese Aufgabe verarbeitet die Antworten, indem sie den Statuscode, die Header und den Hauptteil protokolliert. Eine reale Anwendung kann die Antwort verarbeiten, indem sie beispielsweise den Antworttext in den Flash-Speicher schreibt. Wenn der Antwortstatuscode nicht lautet206 partial content
, teilt die Aufgabe der Hauptaufgabe mit, dass die Demo fehlschlagen sollte. Die Antwortaufgabe ist in der Funktion angegeben. prvResponseTask
Der Quellcode für diese Funktion ist auf Github