Qt CoAP Présentation
Le protocole CoAP (Constrained Application Protocol) est un protocole IoT spécialement conçu pour l'échange de données M2M entre des appareils aux ressources limitées (tels que des microcontrôleurs) au sein de réseaux aux ressources limitées.
Le modèle d’interaction de CoAP est similaire au modèle client/serveur du protocole HTTP, mais contrairement à ce dernier, il utilise un transport sans connexion orienté datagrammes, tel que le protocole UDP, ce qui se traduit par une surcharge très faible et permet d’utiliser la diffusion UDP (broadcast) et la multidiffusion (multicast) pour l’adressage. Parallèlement, il offre des mécanismes de fiabilité et de sécurité légers.
Qt CoAP implémente le côté client de CoAP. Le transport par défaut repose sur QUdpSocket, tandis que QDtls n'assure la sécurité que lorsqu'un mode sécurisé est sélectionné ; aucun mode de sécurité n'est activé par défaut (voir Sécurité). D'autres transports peuvent être utilisés en implémentant l'interface QCoapConnection.
Modèle de messagerie
Le modèle de messagerie CoAP repose sur l’échange de messages entre des points d’extrémité : les clients envoient des requêtes aux serveurs ; les serveurs renvoient des réponses. Les clients peuvent effectuer des opérations GET, PUT, POST et DELETE sur des ressources. Ils peuvent également découvrir des ressources sur un serveur en effectuant des requêtes de découverte, ou sur le réseau local, en effectuant des requêtes de découverte en multidiffusion. Il est également possible de s’abonner à une ressource, à l’aide d’une requête d’observation.
La fiabilité du transfert est assurée en marquant un message comme confirmable (CON). Un message confirmable est retransmis en utilisant un délai d’expiration par défaut et un recul exponentiel entre les retransmissions, jusqu’à ce que le destinataire envoie un message d’accusé de réception (ACK). Lorsque le destinataire n’est pas en mesure de traiter un message confirmable, il répond par un message de réinitialisation (RST) au lieu d’un accusé de réception.
Un message ne nécessitant pas de transmission fiable peut être envoyé en tant que message non confirmable (NON).
Utilisation de l’API « Qt CoAP »
La communication entre le client et le serveur CoAP s’effectue à l’aide de la classe ` QCoapClient `. Celle-ci contient les méthodes permettant d’envoyer différentes requêtes CoAP ainsi que les signaux déclenchés à l’arrivée des réponses aux requêtes envoyées. La classe ` QCoapRequest ` sert à créer des requêtes CoAP. La réponse du serveur est renvoyée dans un objet ` QCoapReply `. Par exemple :
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"));Fonctionnalités prises en charge
Découverte de ressources
Les requêtes de découverte CoAP permettent d’interroger les ressources disponibles sur un point de terminaison ou sur l’ensemble du réseau. Cela revêt une importance capitale pour les applications M2M, où aucun être humain n’intervient dans le processus. Par exemple, dans le cadre de la domotique ou de l’automatisation des bâtiments, il est nécessaire que les clients et les serveurs locaux puissent se localiser et interagir entre eux sans intervention humaine. La découverte de ressources permet aux clients de recenser les points d’extrémité disponibles sur le réseau.
Qt CoAP prend en charge les requêtes de découverte vers un point de terminaison unique et vers des groupes de multidiffusion. Par exemple, une requête de découverte adressée à /.well-known/core, qui est le point d’entrée par défaut pour la découverte de ressources, peut renvoyer un résultat similaire à :
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=262144Ce qui indique que des ressources pour des capteurs de température et de lumière, ainsi qu’une ressource de micrologiciel, sont disponibles sur le réseau. La réponse est représentée au format CoRE Link.
La classe spécialisée ` QCoapResourceDiscoveryReply ` est utilisée pour récupérer les réponses de découverte :
// This will make a multicast discovery request to the CoAP IPv4 multicast group.
QCoapResourceDiscoveryReply *discoverReply = client->discover();
connect(discoverReply, &QCoapResourceDiscoveryReply::discovered, this, &MyClass::onDiscovered);La classe ` QCoapResourceDiscoveryReply::discovered ` renverra la liste des ressources CoAP détectées sur le réseau.
Observation des ressources
Les requêtes d’observation sont utilisées pour recevoir des notifications automatiques du serveur concernant une ressource. Le client devient observateur d’une ressource observable en envoyant une requête d’observation à cette ressource. Par exemple, le capteur de température de l’exemple ci-dessus est observable, car il possède l’attribut « obs ». Le client peut donc s’abonner aux mises à jour de température en lui envoyant une requête d’observation.
L'exemple de code suivant montre comment envoyer des requêtes d’observation à l’aide de Qt CoAP:
QCoapReply *reply = client->observe(QUrl("127.0.0.1/temp"));
connect(reply, &QCoapReply::notified, this, &MyClass::onNotified);Pour les requêtes « observe » en particulier, vous pouvez utiliser le signal « QCoapReply::notified » pour gérer les notifications provenant du serveur CoAP.
Transferts par blocs
CoAP reposant sur des protocoles de transport par datagrammes tels que l’UDP, la taille maximale d’une représentation de ressource pouvant être transférée sans que la fragmentation ne pose de problèmes est limitée. Qt CoAP prend en charge les transferts par blocs lorsque la taille d’une représentation de ressource dépasse celle pouvant être facilement transférée dans la charge utile d’un seul datagramme CoAP.
Sécurité
Les modes de sécurité suivants sont définis pour CoAP :
- Clé pré-partagée: dans ce mode, le client doit envoyer au serveur son identité et la clé pré-partagée.
- Clé publique brute: le client dispose d’une paire de clés asymétriques sans certificat (une clé publique brute). Le client dispose également d’une identité calculée à partir de la clé publique et d’une liste des identités des nœuds avec lesquels il peut communiquer. Qt CoAP n’a pas encore implémenté ce mode.
- Certificat: le client dispose d’une paire de clés asymétriques accompagnée d’un certificat X.509 signé par une racine de confiance commune.
CoAP étant conçu pour être un protocole basé sur UDP, le module Qt CoAP implémente la sécurité via Datagram TLS (DTLS) sur UDP. Cependant, comme mentionné ci-dessus, il est possible de fournir un transport personnalisé avec un autre type de sécurité.
Remarque : lorsque vous fournissez un transport personnalisé, la protection DTLS décrite ici ne s’applique plus. La sécurisation de l’échange relève alors de la responsabilité de ce transport, qui doit assurer le chiffrement, l’authentification des pairs et le formatage des messages adaptés au protocole sur lequel il repose. Un transport qui omet l’un de ces éléments laisse les requêtes et les réponses sans protection, et cette perte n’est pas visible pour le reste de l’application.
Avertissement : par défaut, Qt CoAP fonctionne sans sécurité de transport. À moins qu’un mode sécurisé ne soit sélectionné, les requêtes et les réponses sont envoyées sous forme de datagrammes UDP en clair. N’utilisez la valeur par défaut (QtCoap::NoSecurity) que sur des réseaux entièrement fiables ; sur tout réseau non fiable, configurez QCoapClient avec un mode sécurisé.
Pour sécuriser le client CoAP, l'un des modes de sécurité pris en charge doit être spécifié lors de la création du client :
QCoapClient *client = new QCoapClient(this, QtCoap::PreSharedKey);La classe ` QCoapSecurityConfiguration ` permet de définir les paramètres de sécurité. Par exemple, en mode « clé pré-partagée », le code d’exemple suivant peut être utilisé :
QCoapSecurityConfiguration config;
config.setPreSharedKey("secretPSK");
config.setIdentity("Client_identity");
client->setSecurityConfiguration(config);Et en mode certificat :
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.