Auf dieser Seite

Qt CoAP Übersicht

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

Das Interaktionsmodell von CoAP ähnelt dem Client-Server-Modell von HTTP, nutzt jedoch im Gegensatz zu HTTP 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. Der Standardtransport basiert auf QUdpSocket, wobei QDtls nur dann Sicherheit bietet, wenn ein sicherer Modus ausgewählt ist; standardmäßig ist kein Sicherheitsmodus aktiviert (siehe Sicherheit). Alternative Transporte können durch Implementierung der Schnittstelle `QCoapConnection` verwendet werden.

Nachrichtenmodell

Das CoAP-Nachrichtenmodell basiert auf dem Austausch von Nachrichten zwischen Endpunkten: Clients senden Anfragen an Server; Server senden Antworten zurück. Clients können Ressourcen mit den Methoden GET, PUT, POST und DELETE abrufen. Sie können Ressourcen auch auf einem Server durch Discovery-Anfragen oder im lokalen Netzwerk durch Multicast-Discovery-Anfragen ermitteln. Es ist zudem möglich, eine Ressource mit einer Observe-Anfrage zu abonnieren.

Die Zuverlässigkeit der Übertragung wird dadurch gewährleistet, dass eine Nachricht als bestätigungsfähig (CON) gekennzeichnet wird. Eine bestätigungsfähige Nachricht wird unter Verwendung eines Standard-Timeouts und eines exponentiellen Back-offs zwischen den Wiederholungssendungen erneut übertragen, bis der Empfänger eine Bestätigungsnachricht (ACK) sendet. Wenn der Empfänger eine bestätigungsfähige Nachricht nicht verarbeiten kann, 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 (NON) Nachricht 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 sowie die Signale, die ausgelöst werden, wenn die Antworten auf die gesendete Anfrage eintreffen. Die Klasse „ QCoapRequest “ wird zum Erstellen von CoAP-Anfragen verwendet. Die Antwort vom Server wird in einem „ QCoapReply “-Objekt zurückgegeben. 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

Ressourcenerkennung

CoAP-Erkennungsanfragen werden verwendet, um die an einem Endpunkt oder im gesamten Netzwerk verfügbaren Ressourcen abzufragen. Dies ist besonders wichtig für M2M-Anwendungen, bei denen keine Menschen involviert sind. Beispielsweise müssen bei der Haus- oder Gebäudeautomation lokale Clients und Server einander ohne menschliches Eingreifen finden und miteinander interagieren können. Die Ressourcenerkennung ermöglicht es Clients, sich über die im Netzwerk verfügbaren Endpunkte zu informieren.

Qt CoAP unterstützt Erkundungsanfragen an einen einzelnen Endpunkt sowie an Multicast-Gruppen. Beispielsweise kann eine Erkundungsanfrage an /.well-known/core – den Standard-Einstiegspunkt für die Ressourcenerkennung – etwa folgende Antwort liefern:

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

Dies zeigt an, dass im Netzwerk Ressourcen für Temperatur- und Lichtsensoren sowie eine Firmware-Ressource verfügbar sind. Die Antwort wird im CoRE-Link-Format dargestellt.

Die spezielle Klasse ` QCoapResourceDiscoveryReply ` wird verwendet, um die Erkennungsantworten abzurufen:

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

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

Ressourcenbeobachtung

Beobachtungsanfragen dienen dazu, automatische Serverbenachrichtigungen für eine Ressource zu erhalten. Der Client wird zum Beobachter einer beobachtbaren Ressource, indem er eine Beobachtungsanfrage an die Ressource sendet. Beispielsweise ist der Temperatursensor aus dem obigen Beispiel beobachtbar, da er über das Attribut „ obs “ verfügt. Der Client kann also die Temperaturaktualisierungen abonnieren, indem er eine Beobachtungsanfrage an ihn sendet.

Der folgende Beispielcode zeigt, wie „Observe“-Anfragen unter Verwendung von „ Qt CoAP “ gesendet werden:

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 Datagramm-Transportprotokollen wie UDP basiert, gibt es Grenzen hinsichtlich der Größe einer Ressourcenrepräsentation, die ohne Probleme durch Fragmentierung übertragen werden kann. „ Qt CoAP “ unterstützt blockweise Übertragungen für Fälle, in denen eine Ressourcenrepräsentation größer ist, als sie bequem in der Nutzlast eines einzelnen CoAP-Datagramms übertragen werden kann.

Sicherheit

Für CoAP sind die folgenden Sicherheitsmodi definiert:

  • Vorab geteilter Schlüssel – in diesem Modus muss der Client dem Server seine Identität und den vorab geteilten Schlüssel senden.
  • Raw Public Key – Der Client verfügt über ein asymmetrisches Schlüsselpaar ohne Zertifikat (einen „Raw Public Key“). Der Client verfügt außerdem über eine aus dem öffentlichen Schlüssel berechnete Identität sowie 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 signiert 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 oben erwähnt, ist es jedoch möglich, einen benutzerdefinierten Transport mit einem anderen Sicherheitstyp bereitzustellen.

Hinweis: Wenn Sie einen benutzerdefinierten Transport bereitstellen, gilt der hier beschriebene DTLS-Schutz nicht mehr. Die Sicherung des Datenaustauschs liegt dann in der Verantwortung dieses Transports, der eine Verschlüsselung, Peer-Authentifizierung und Nachrichtenformatierung bereitstellen muss, die dem zugrunde liegenden Protokoll entsprechen. Ein Transport, der eine dieser Komponenten auslässt, lässt Anfragen und Antworten ungeschützt, und der Verlust ist für den Rest der Anwendung nicht erkennbar.

Warnung: Standardmäßig arbeitet „ Qt CoAP “ ohne Transportsicherheit. Sofern kein sicherer Modus ausgewählt ist, werden Anfragen und Antworten als einfache UDP-Datagramme gesendet. Verwenden Sie die Standardeinstellung (QtCoap::NoSecurity) nur in vollständig vertrauenswürdigen Netzwerken; in nicht vertrauenswürdigen Netzwerken sollten Sie „ QCoapClient “ mit einem sicheren Modus konfigurieren.

Zur Absicherung des CoAP-Clients sollte beim Erstellen des Clients einer der unterstützten Sicherheitsmodi angegeben werden:

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

Die Klasse „ QCoapSecurityConfiguration “ dient zur Festlegung der Sicherheitsparameter. Im Modus mit vorab geteiltem Schlüssel kann beispielsweise 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);

© 2026 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.