Qt CoAP Überblick

Constrained Application Protocol (CoAP) ist ein IoT-Protokoll, das speziell für den M2M-Datenaustausch zwischen eingeschränkten Geräten (z. B. Mikrocontrollern) in eingeschränkten Netzwerken entwickelt wurde.

Das Interaktionsmodell von CoAP ähnelt dem Client/Server-Modell von HTTP, aber im Gegensatz zu HTTP verwendet es einen datagrammorientierten verbindungslosen Transport wie UDP, was zu einem sehr geringen Overhead führt und die Verwendung von UDP-Broadcast und Multicast für die Adressierung ermöglicht. Gleichzeitig bietet es leichtgewichtige Zuverlässigkeitsmechanismen und Sicherheit.

Qt CoAP implementiert die Client-Seite von CoAP. Standardmäßig verwendet die Transportschicht QUdpSocket und QDtls für die Sicherheit. Alternative Transporte können durch Implementierung der Schnittstelle QCoapConnection verwendet werden.

Messaging-Modell

Das CoAP-Nachrichtenmodell basiert auf dem Austausch von Nachrichten zwischen Endpunkten: Clients stellen Anfragen an Server; Server senden Antworten zurück. Clients können Ressourcen GET, PUT, POST und DELETE. Sie können auch Ressourcen auf einem Server entdecken, indem sie Discovery-Anfragen stellen, oder im lokalen Netzwerk, indem sie Multicast-Discovery-Anfragen stellen. Es ist auch möglich, eine Ressource zu abonnieren, indem man eine Beobachtungsanfrage stellt.

Die Zuverlässigkeit der Übertragung wird durch die Kennzeichnung einer Nachricht als bestätigungsfähig (CON) erreicht. Eine bestätigungsfähige Nachricht wird mit einem Standard-Timeout und exponentiellem Abstand zwischen den Übertragungen erneut übertragen, bis der Empfänger eine Bestätigungsnachricht (ACK) sendet. Wenn der Empfänger nicht in der Lage ist, eine bestätigungsfähige Nachricht zu verarbeiten, antwortet er mit einer Reset-Nachricht (RST) anstelle einer Bestätigung.

Eine Nachricht, die keine zuverlässige Übertragung erfordert, kann als nicht bestätigungsfähige Nachricht (NON) gesendet werden.

Verwendung der Qt CoAP API

Die Kommunikation des Clients mit dem CoAP-Server erfolgt über die Klasse QCoapClient. Sie enthält die Methoden zum Senden verschiedener CoAP-Anfragen und die Signale, die ausgelöst werden, wenn die Antworten auf die gesendeten Anfragen eintreffen. Die Klasse QCoapRequest wird für die Erstellung von CoAP-Anfragen verwendet. Die Antwort des Servers wird in einem QCoapReply Objekt zurückgegeben. Ein Beispiel:

QCoapClient *client = new QCoapClient();
connect(client, &QCoapClient::finished, this, &MyClass::onFinished);
connect(client, &QCoapClient::error, this, &MyClass::onError);

QCoapRequest request(QUrl("coap://127.0.0.1/test"), QCoapMessage::Confirmable);
client->get(request);
client->put(request, QByteArray("payload"));

Unterstützte Funktionen

Ressourcenermittlung

CoAP Discovery-Anfragen werden verwendet, um die auf einem Endpunkt oder im gesamten Netzwerk verfügbaren Ressourcen abzufragen. Dies ist besonders wichtig für M2M-Anwendungen, bei denen keine Menschen in der Schleife sind. Bei der Haus- oder Gebäudeautomatisierung beispielsweise müssen lokale Clients und Server ohne menschliches Eingreifen zueinander finden und miteinander kommunizieren können. Die Ressourcenerkennung ermöglicht es den Clients, sich über die im Netz verfügbaren Endpunkte zu informieren.

Qt CoAP unterstützt Discovery-Anfragen an einen einzelnen Endpunkt und an Multicast-Gruppen. Eine Suchanfrage an /.well-known/core, dem Standard-Einstiegspunkt für die Ressourcenermittlung, kann zum Beispiel Folgendes zurückgeben:

RES: 2.05 Content
</sensors/temp>;rt="temperature-c";if="sensor";obs,
</sensors/light>;rt="light-lux";if="sensor",
</firmware/v2.1>;rt="firmware";sz=262144

Es wird angezeigt, dass im Netz Ressourcen für Temperatur- und Lichtsensoren sowie eine Firmware-Ressource verfügbar sind. Die Antwort wird im CoRE Link Format dargestellt.

Die spezialisierte Klasse QCoapResourceDiscoveryReply wird verwendet, um die Discovery-Antworten zu erhalten:

// This will make a multicast discovery request to the CoAP IPv4 multicast group.
QCoapResourceDiscoveryReply *discoverReply = client->discover();
connect(discoverReply, &QCoapResourceDiscoveryReply::discovered, this, &MyClass::onDiscovered);

Die QCoapResourceDiscoveryReply::discovered gibt die Liste der im Netz gefundenen CoAP-Ressourcen zurück.

Ressourcenbeobachtung

Observe-Anfragen werden verwendet, um automatische Server-Benachrichtigungen für eine Ressource zu erhalten. Der Client wird zum Beobachter einer beobachtbaren Ressource, indem er eine Beobachtungsanfrage an die Ressource sendet. Der Temperatursensor aus dem obigen Beispiel ist beispielsweise beobachtbar, da er das Attribut obs hat. Der Client kann also die Temperaturaktualisierungen abonnieren, indem er eine Beobachtungsanforderung an ihn sendet.

Der folgende Beispielcode zeigt, wie Observe-Anforderungen mit Qt CoAP gesendet werden können:

QCoapReply *reply = client->observe(QUrl("127.0.0.1/temp"));
connect(reply, &QCoapReply::notified, this, &MyClass::onNotified);

Speziell für Observe-Anfragen können Sie das Signal QCoapReply::notified verwenden, um Benachrichtigungen vom CoAP-Server zu verarbeiten.

Blockweise Übertragungen

Da CoAP auf Datagrammtransporten wie UDP basiert, gibt es Grenzen für die Größe einer Ressourcendarstellung, die übertragen werden kann, ohne dass eine Fragmentierung zu Problemen führt. Qt CoAP unterstützt blockweise Übertragungen für Situationen, in denen eine Ressourcendarstellung größer ist, als bequem in der Nutzlast eines einzelnen CoAP-Datagramms übertragen werden kann.

Sicherheit

Die folgenden Sicherheitsmodi sind für CoAP definiert:

  • Pre-Shared Key - in diesem Modus muss der Client seine Identität und den Pre-Shared Key an den Server senden.
  • Raw Public Key - der Client verfügt über ein asymmetrisches Schlüsselpaar ohne Zertifikat (ein Raw Public Key). Der Client verfügt außerdem über eine aus dem öffentlichen Schlüssel berechnete Identität und eine Liste der Identitäten der Knoten, mit denen er kommunizieren kann. Qt CoAP hat diesen Modus noch nicht implementiert.
  • Zertifikat - der Client verfügt über ein asymmetrisches Schlüsselpaar mit einem X.509-Zertifikat, das von einer gemeinsamen Vertrauenswurzel unterzeichnet ist.

Da CoAP als UDP-basiertes Protokoll konzipiert ist, implementiert das Modul Qt CoAP die Sicherheit auf Basis von Datagram TLS (DTLS) über UDP. Wie bereits erwähnt, ist es jedoch möglich, einen benutzerdefinierten Transport mit einem anderen Sicherheitstyp bereitzustellen.

Um den CoAP-Client zu sichern, sollte bei der Erstellung des Clients einer der unterstützten Sicherheitsmodi angegeben werden:

QCoapClient *client = new QCoapClient(this, QtCoap::PreSharedKey);

Die Klasse QCoapSecurityConfiguration wird für die Angabe der Sicherheitsparameter verwendet. Im Pre-Shared-Key-Modus kann zum Beispiel der folgende Beispielcode verwendet werden:

QCoapSecurityConfiguration config;
config.setPreSharedKey("secretPSK");
config.setIdentity("Client_identity");
client->setSecurityConfiguration(config);

Und im Zertifikatsmodus:

QCoapClient *client = new QCoapClient(this, QtCoap::Certificate);
QList<QSslCertificate> localCertificates, caCertificates;
QCoapPrivateKey key;
// Initialize the key and certificates
QCoapSecurityConfiguration config;
config.setLocalCertificateChain(localCertificates);
config.setCaCertificates(caCertificates)
config.setPrivateKey(key);
client->setSecurityConfiguration(config);

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.