Demo zur gegenseitigen CoreMQTT-Authentifizierung - FreeRTOS

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.

Demo zur gegenseitigen CoreMQTT-Authentifizierung

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 Amazon-FreerTOS Github-Repositorys

Einführung

Das Demo-Projekt zur gegenseitigen Authentifizierung von CoreMQTT zeigt Ihnen, wie Sie mithilfe von TLS eine Verbindung zu einem MQTT-Broker mit gegenseitiger Authentifizierung zwischen dem Client und dem Server herstellen. Diese Demo verwendet eine MbedTLS-basierte Transportschnittstellenimplementierung, um eine server- und clientauthentifizierte TLS-Verbindung herzustellen, und demonstriert den Subscribe-Publish-Workflow von MQTT auf QoS-1-Ebene. Es abonniert einen Themenfilter, veröffentlicht dann Themen, die dem Filter entsprechen, und wartet auf den Empfang dieser Nachrichten vom Server auf QoS-1-Ebene. Dieser Zyklus der Veröffentlichung auf dem Broker und dem Empfang derselben Nachricht vom Broker wird auf unbestimmte Zeit wiederholt. Nachrichten in dieser Demo werden mit QoS 1 gesendet, was mindestens eine Lieferung gemäß der MQTT-Spezifikation garantiert.

Anmerkung

Folgen Sie den Schritten unter, um die FreeRTOS-Demos einzurichten und auszuführen. Erste Schritte mit FreeRTOS

Quellcode

Die Demo-Quelldatei ist benannt mqtt_demo_mutual_auth.c und befindet sich im freertos/demos/coreMQTT/ Verzeichnis und auf der Website. GitHub

Funktionalität

Die Demo erstellt eine einzelne Anwendungsaufgabe, die eine Reihe von Beispielen durchläuft, die zeigen, wie eine Verbindung zum Broker hergestellt, ein Thema auf dem Broker abonniert, ein Thema auf dem Broker veröffentlicht und schließlich die Verbindung zum Broker getrennt wird. Die Demo-Anwendung abonniert und veröffentlicht dasselbe Thema. Jedes Mal, wenn die Demo eine Nachricht an den MQTT-Broker veröffentlicht, sendet der Broker dieselbe Nachricht zurück an die Demo-Anwendung.

Bei erfolgreichem Abschluss der Demo wird eine Ausgabe generiert, die der folgenden Abbildung ähnelt.

Ausgabe des MQTT-Demo-Terminals bei erfolgreichem Abschluss

Die AWS IoT Konsole generiert eine Ausgabe, die der folgenden Abbildung ähnelt.

Ausgabe der MQTT-Demo-Konsole bei erfolgreichem Abschluss

Wiederholen Sie die Logik mit exponentiellem Backoff und Jitter

Die prvBackoffForWiederholungsfunktion zeigt, wie fehlgeschlagene Netzwerkoperationen mit dem Server, z. B. TLS-Verbindungen oder MQTT-Abonnementanfragen, mit exponentiellem Backoff und Jitter wiederholt werden können. Die Funktion berechnet die Backoff-Periode für den nächsten Wiederholungsversuch und führt die Backoff-Verzögerung durch, falls die Wiederholungsversuche noch nicht ausgeschöpft sind. Da die Berechnung der Backoff-Periode die Generierung einer Zufallszahl erfordert, verwendet die Funktion das Modul, um die Zufallszahl zu generieren. PKCS11 Die Verwendung des PKCS11 Moduls ermöglicht den Zugriff auf einen True Random Number Generator (TRNG), sofern die Herstellerplattform dies unterstützt. Wir empfehlen, den Zufallszahlengenerator mit einer gerätespezifischen Entropiequelle auszustatten, um die Wahrscheinlichkeit von Kollisionen durch Geräte bei erneuten Verbindungsversuchen zu verringern.

Verbindung zum MQTT-Broker herstellen

Die prvConnectToServerWithBackoffRetriesFunktion versucht, eine gegenseitig authentifizierte TLS-Verbindung zum MQTT-Broker herzustellen. Wenn die Verbindung fehlschlägt, versucht sie es nach einer Backoff-Periode erneut. Die Backoff-Periode wird exponentiell erhöht, bis die maximale Anzahl von Versuchen oder die maximale Backoff-Periode erreicht ist. Die BackoffAlgorithm_GetNextBackoff Funktion liefert einen exponentiell steigenden Backoff-Wert und kehrt zurück, RetryUtilsRetriesExhausted wenn die maximale Anzahl von Versuchen erreicht wurde. Die prvConnectToServerWithBackoffRetries Funktion gibt einen Fehlerstatus zurück, wenn die TLS-Verbindung zum Broker nach der konfigurierten Anzahl von Versuchen nicht hergestellt werden kann.

Die MQTTConnection WithBroker Funktion PrvCreate demonstriert, wie eine MQTT-Verbindung zu einem MQTT-Broker mit einer sauberen Sitzung hergestellt wird. Sie verwendet die TLS-Transportschnittstelle, die in der Datei implementiert ist. FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c Denken Sie daran, dass wir die Keep-Alive-Sekunden für den Broker festlegen. xConnectInfo

Die nächste Funktion zeigt, wie die TLS-Transportschnittstelle und die Zeitfunktion mithilfe der Funktion in einem MQTT-Kontext eingestellt werden. MQTT_Init Sie zeigt auch, wie eine Event-Callback-Funktion pointer (prvEventCallback) gesetzt wird. Dieser Callback wird für die Meldung eingehender Nachrichten verwendet.

Ein MQTT-Thema abonnieren

Die MQTTSubscribe WithBackoffRetries Funktion prv demonstriert, wie man einen Themenfilter auf dem MQTT-Broker abonniert. Das Beispiel zeigt, wie ein Themenfilter abonniert wird, aber es ist möglich, eine Liste von Themenfiltern in demselben Abonnement-API-Aufruf zu übergeben, um mehr als einen Themenfilter zu abonnieren. Falls der MQTT-Broker die Abonnementanfrage ablehnt, versucht das Abonnement außerdem erneut, mit exponentiellem Backoff, für. RETRY_MAX_ATTEMPTS

So veröffentlichen Sie in einem Thema

Die MQTTPublishToTopicprv-Funktion demonstriert, wie Sie zu einem Thema auf dem MQTT-Broker veröffentlichen.

Empfangen eingehender Nachrichten

Die Anwendung registriert eine Rückruffunktion für Ereignisse, bevor sie eine Verbindung zum Broker herstellt, wie zuvor beschrieben. Die prvMQTTDemoTask Funktion ruft die MQTT_ProcessLoop Funktion auf, um eingehende Nachrichten zu empfangen. Wenn eine eingehende MQTT-Nachricht empfangen wird, ruft sie die von der Anwendung registrierte Event-Callback-Funktion auf. Die prvEventCallbackFunktion ist ein Beispiel für eine solche Event-Callback-Funktion. prvEventCallbackuntersucht den Typ des eingehenden Pakets und ruft den entsprechenden Handler auf. Im folgenden Beispiel ruft die Funktion entweder die Verarbeitung prvMQTTProcessIncomingPublish() eingehender Veröffentlichungsnachrichten oder die Verarbeitung von Bestätigungen (ACK) prvMQTTProcessResponse() auf.

Verarbeitung eingehender MQTT-Veröffentlichungspakete

Die MQTTProcess IncomingPublish Funktion prv demonstriert, wie ein vom MQTT-Broker veröffentlichtes Paket verarbeitet wird.

Abmeldung von einem Thema

Der letzte Schritt im Workflow besteht darin, das Abonnement des Themas zu kündigen, sodass der Broker keine veröffentlichten Nachrichten von sendet. mqttexampleTOPIC Hier ist die Definition der Funktion prv MQTTUnsubscribe FromTopic.

Änderung der in der Demo verwendeten Root-CA

Standardmäßig verwenden die FreeRTOS-Demos das Amazon Root CA 1-Zertifikat (RSA 2048-Bit-Schlüssel), um sich beim Server zu authentifizieren. AWS IoT Core Es ist möglich, andere CA-Zertifikate für die Serverauthentifizierung zu verwenden, einschließlich des Amazon Root CA 3-Zertifikats (ECC 256-Bit-Schlüssel). Um die Root-CA für die Demo zur gegenseitigen CoreMQTT-Authentifizierung zu ändern:

  1. Öffnen Sie die Datei freertos/vendors/vendor/boards/board/aws_demos/config_files/mqtt_demo_mutual_auth_config.h in einem Texteditor.

  2. Suchen Sie in der Datei nach der folgenden Zeile.

    * #define democonfigROOT_CA_PEM "...insert here..."

    Entfernen Sie den Kommentar zu dieser Zeile und verschieben Sie sie gegebenenfalls über das Ende */ des Kommentarblocks hinaus.

  3. Kopieren Sie das CA-Zertifikat, das Sie verwenden möchten, und fügen Sie es dann in den "...insert here..." Text ein. Das Ergebnis sollte wie folgt aussehen:

    #define democonfigROOT_CA_PEM "-----BEGIN CERTIFICATE-----\n"\ "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\ "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\ "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\ "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\ "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\ "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\ "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\ "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\ "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\ "YyRIHN8wfdVoOw==\n"\ "-----END CERTIFICATE-----\n"
  4. (Optional) Sie können die Stammzertifizierungsstelle für andere Demos ändern. Wiederholen Sie die Schritte 1 bis 3 für jede freertos/vendors/vendor/boards/board/aws_demos/config_files/demo-name_config.h Datei.