Qt CoAP Vue d'ensemble
Constrained Application Protocol (CoAP) est un protocole IoT spécialement conçu pour l'échange de données M2M entre des dispositifs contraints (tels que des microcontrôleurs) dans des réseaux contraints.
Le modèle d'interaction de CoAP est similaire au modèle client/serveur de HTTP, mais contrairement à HTTP, il utilise un transport sans connexion orienté datagramme tel que UDP, ce qui entraîne un très faible surcoût et permet d'utiliser la diffusion et la multidiffusion UDP pour l'adressage. En même temps, il fournit des mécanismes de fiabilité et de sécurité légers.
Qt CoAP met en œuvre le côté client de CoAP. Par défaut, la couche transport utilise QUdpSocket et QDtls pour la 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 est basé sur l'échange de messages entre les points d'extrémité : les clients adressent des demandes aux serveurs ; les serveurs renvoient des réponses. Les clients peuvent obtenir des ressources GET, PUT, POST et DELETE. Ils peuvent également découvrir des ressources sur un serveur en effectuant des demandes de découverte, ou dans le réseau local, en effectuant des demandes de découverte multicast. Il est également possible de s'abonner à une ressource au moyen d'une demande d'observation.
La fiabilité du transfert est assurée par le marquage d'un message comme confirmable (CON). Un message confirmable est retransmis en utilisant un délai d'attente par défaut et un délai 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 qui ne nécessite pas une transmission fiable peut être envoyé en tant que message non confirmable (NON).
Utilisation de l'API Qt CoAP
La communication du client avec le serveur CoAP se fait à l'aide de la classe QCoapClient. Elle contient les méthodes permettant d'envoyer différentes requêtes CoAP et les signaux qui sont déclenchés lorsque les réponses aux requêtes envoyées arrivent. La classe QCoapRequest est utilisée pour 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 demandes de découverte CoAP sont utilisées pour interroger les ressources disponibles sur un point d'extrémité ou dans l'ensemble du réseau. C'est très important pour les applications M2M, où il n'y a pas d'humains dans la boucle. Par exemple, pour l'automatisation de la maison ou du bâtiment, il est nécessaire que les clients et les serveurs locaux se trouvent et interagissent les uns avec les autres sans intervention humaine. La découverte de ressources permet aux clients de connaître les points d'extrémité disponibles sur le réseau.
Qt CoAP L'application prend en charge les demandes de découverte adressées à un seul point d'extrémité et à 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 quelque chose comme :
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
Indiquant qu'il y a des ressources pour les capteurs de température et de lumière et une ressource de microprogrammation disponible dans le réseau. La réponse est représentée dans le format de lien CoRE.
La classe spécialisée QCoapResourceDiscoveryReply est utilisée pour obtenir 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);
Le site QCoapResourceDiscoveryReply::discovered renvoie la liste des ressources CoAP trouvées dans le réseau.
Observation des ressources
Les demandes d'observation sont utilisées pour recevoir des notifications automatiques du serveur pour une ressource. Le client devient observateur d'une ressource observable en envoyant une demande d'observation à la 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 la température en envoyant une demande d'observation à cette ressource.
L'exemple de code suivant montre comment envoyer des demandes 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 demandes d'observation en particulier, vous pouvez utiliser le signal QCoapReply::notified pour gérer les notifications du serveur CoAP.
Transferts dans le sens des aiguilles d'une montre
Étant donné que le protocole CoAP est basé sur des transports de datagrammes tels que l'UDP, il existe des limites à la taille de la représentation d'une ressource qui peut être transférée sans que la fragmentation ne pose de problèmes. Qt CoAP prend en charge les transferts par blocs dans les cas où la représentation d'une ressource est plus grande que ce qui peut être confortablement transféré 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 (clé publique brute). Le client dispose également d'une identité calculée à partir de la clé publique et d'une liste d'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 avec un certificat X.509 signé par une racine de confiance commune.
Étant donné que le CoAP est conçu pour être un protocole basé sur UDP, le module Qt CoAP met en œuvre une sécurité basée sur 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é.
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 est utilisée pour spécifier les paramètres de sécurité. Par exemple, en mode clé pré-partagée, l'exemple de code 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.