Es ist eine clientseitige Implementierung des Constrained Application Protocol (CoAP) für das Internet der Dinge. Die Bibliothek bietet eine schnelle und einfache Möglichkeit, das CoAP-Protokoll in Ihren plattformübergreifenden Qt-Anwendungen zu verwenden. Wie bereits angekündigt, wird QtCoAP in der neuen Version Qt 5.13 als Teil von Qt for Automation zusammen mit anderen IoT-Protokollimplementierungen wie MQTT, KNX und OPC UA verfügbar sein.
Was ist CoAP?
CoAP wurde als leichtgewichtiges M2M-Kommunikationsprotokoll (Machine-to-Machine) entwickelt, das auf Geräten mit begrenztem Arbeitsspeicher und begrenzten Rechenressourcen ausgeführt werden kann. Es basiert auf dem Konzept von RESTful APIs und ist HTTP sehr ähnlich.
CoAP ist eine Client-Server-Architektur und verwendet GET-, POST-, PUT- und DELETE -Anforderungen, um mit Daten zu interagieren. Aber im Gegensatz zu HTTP verwendet es anstelle von TCP leichtgewichtiges UDP für den Transport. Darüber hinaus unterstützt es einige interessante Funktionen wie Multicast-Anfragen, Ressourcenerkennung und Überwachung.
Aufgrund seiner geringen Kosten und Einfachheit hat sich CoAP zu einem der beliebtesten IoT-Protokolle für die Verwendung auf eingebetteten Geräten entwickelt. Es wirkt wie eine Art HTTP für die eingebaute Welt.
Überblick über die QtCoAP-Implementierung
QtCoAP unterstützt die folgenden Funktionen:
- Ressourcenüberwachung.
- Ressourcenentdeckung.
- Gruppenkommunikation (Multicast).
- Übersetzungen blockieren.
- Sicherheit.
Die Bibliothek ist wirklich einfach zu bedienen. Sie müssen nur das Objekt QCoapClient instanziieren und seine Signale verbinden:
QCoapClient client; connect(&client, &QCoapClient::finished, this, &CoapHandler::onFinished); connect(&client, &QCoapClient::error, this, &CoapHandler::onError);
Sie können jetzt Anfragen senden und Antworten erhalten:
// GET requests client.get(QUrl("coap://127.0.0.1:5683/resource")); // or simply client.get(QUrl("127.0.0.1/resource")); // PUT/POST requests QFile file("data.json"); // ... client.post(QUrl("127.0.0.1/resource"), file.readAll()); client.put(QUrl("127.0.0.1/resource"), file.readAll()); // DELETE requests client.deleteResource(QUrl("127.0.0.1/resource"));
Mit der Klasse QCoapRequest können Sie Parameter übergeben und Ihre Anfragen anpassen. Zum Beispiel:
QCoapRequest request; request.setUrl(QUrl("127.0.0.1")); request.setPayload(file.readAll()); request.addOption(QCoapOption::UriPath, "resource"); client.put(request);
CoAP bietet auch einen Publish-Subscribe-Mechanismus, der durch „Observe“-Anfragen erreicht wird:
QCoapReply *observeReply = client.observe(QUrl("127.0.0.1/temperature")); connect(observeReply, &QCoapReply::notified, this, &CoapHandler::onNotified);
Jetzt wird Ihre Anwendung benachrichtigt, wenn sich die Ressource „/temperatur“ („/temperatur“) ändert.
Was CoAP noch interessanter macht, ist die Möglichkeit, CoAP-Ressourcen zu finden und zu entdecken. Sie können Ressourcen auf einem bestimmten Host finden:
QCoapResourceDiscoveryReply *discoverReply = client.discover(QUrl("127.0.0.1"));
Oder über das Netzwerk:
QCoapResourceDiscoveryReply *discoverReply = client.discover();
Dadurch wird eine IPv4-CoAP-Multicast-Gruppenerkennungsanforderung gesendet. Sie können die Erkennung auch für IPv6-Hosts ausführen:
discoverReply = client.discover(QtCoap::MulticastGroup::AllCoapNodesIPv6LinkLocal); // or discoverReply = client.discover(QtCoap::MulticastGroup::AllCoapNodesIPv6SiteLocal); ... connect(discoverReply, &QCoapResourceDiscoveryReply::discovered, this, &CoapHandler::onDiscovered);
Sie erhalten mehrere Discovery-Antworten von jedem CoAP-Gerät in Ihrem Netzwerk. Zum Beispiel:
Gastgeber 1:
RES: 2.05 Content ;rt="temperature-c";if="sensor";obs, ;rt="firmware";sz=262144
Gastgeber 2:
RES: 2.05 Content ;rt="temperature-c";if="sensor";obs,
Dies bedeutet, dass es in Ihrem Netzwerk zwei Geräte gibt, auf denen CoAP-Server ausgeführt werden: eines davon ist mit Temperatur- und Lichtsensoren verbunden, das andere ist nur mit einem Temperatursensor verbunden.
Sicherheit
Last but not least ist Sicherheit. Die Qt CoAP-Bibliothek unterstützt die folgenden Sicherheitsmodi:
- Authentifizierung mit Pre-Shared Keys (Shared Keys).
- Verwenden Sie X.509-Zertifikate (X.509-Zertifikate).
Um eine CoAP-Verbindung zu sichern, müssen Sie beim Erstellen eines Clients einen dieser Modi durchlaufen und ihn entsprechend konfigurieren. Zum Beispiel:
QCoapClient secureClient(QtCoap::SecurityMode::PreSharedKey); QCoapSecurityConfiguration config; config.setIdentity("Client_identity"); config.setPreSharedKey("secretPSK"); secureClient.setSecurityConfiguration(config);