Qt CoAP Visión general
Constrained Application Protocol (CoAP) es un protocolo IoT diseñado específicamente para el intercambio de datos M2M entre dispositivos limitados (como microcontroladores) en redes limitadas.
El modelo de interacción de CoAP es similar al modelo cliente/servidor de HTTP, pero a diferencia de éste, utiliza un transporte sin conexión orientado a datagramas como UDP, lo que conlleva una sobrecarga muy baja y permite utilizar UDP broadcast y multicast para el direccionamiento. Al mismo tiempo, proporciona mecanismos ligeros de fiabilidad y seguridad.
Qt CoAP implementa la parte cliente de CoAP. Por defecto, la capa de transporte utiliza QUdpSocket y QDtls para la seguridad. Se pueden utilizar transportes alternativos implementando la interfaz QCoapConnection.
Modelo de mensajería
El modelo de mensajería CoAP se basa en el intercambio de mensajes entre puntos finales: los clientes hacen peticiones a los servidores; los servidores devuelven las respuestas. Los clientes pueden GET, PUT, POST y DELETE recursos. También pueden descubrir recursos en un servidor haciendo peticiones de descubrimiento, o en la red local, haciendo peticiones de descubrimiento multicast. También es posible suscribirse a un recurso, con una solicitud de observación.
La fiabilidad de la transferencia se consigue marcando un mensaje como confirmable (CON). Un mensaje confirmable se retransmite utilizando un tiempo de espera predeterminado y un intervalo exponencial entre retransmisiones, hasta que el destinatario envía un mensaje de acuse de recibo (ACK). Cuando el destinatario no puede procesar un mensaje confirmable, responde con un mensaje de reinicio (RST) en lugar de un acuse de recibo.
Un mensaje que no requiera una transmisión fiable puede enviarse como mensaje no confirmable (NON).
Utilización de la API Qt CoAP
La comunicación del cliente con el servidor CoAP se realiza mediante la clase QCoapClient. Contiene los métodos para enviar diferentes solicitudes CoAP y las señales que se activan cuando llegan las respuestas a la solicitud enviada. La clase QCoapRequest se utiliza para crear peticiones CoAP. La respuesta del servidor se devuelve en un objeto QCoapReply. Por ejemplo
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"));
Funciones compatibles
Descubrimiento de recursos
Las solicitudes de descubrimiento CoAP se utilizan para consultar los recursos disponibles en un punto final o en toda la red. Esto es realmente importante para las aplicaciones M2M, donde no hay humanos en el bucle. Por ejemplo, en la automatización de viviendas o edificios, es necesario que los clientes y servidores locales se encuentren e interactúen entre sí sin intervención humana. El descubrimiento de recursos permite a los clientes conocer los puntos finales disponibles en la red.
Qt CoAP admite solicitudes de descubrimiento a un único punto final y a grupos multidifusión. Por ejemplo, una solicitud de descubrimiento a /.well-known/core, que es el punto de entrada de descubrimiento de recursos por defecto, puede devolver algo como:
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
Indicando que hay recursos para sensores de temperatura y luz y un recurso de firmware disponibles en la red. La respuesta se representa en formato de enlace CoRE.
La clase especializada QCoapResourceDiscoveryReply se utiliza para obtener las respuestas de descubrimiento:
// 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 devolverá la lista de recursos CoAP encontrados en la red.
Observación de recursos
Las solicitudes de observación se utilizan para recibir notificaciones automáticas del servidor sobre un recurso. El cliente se convierte en observador de un recurso observable enviando una solicitud de observación al recurso. Por ejemplo, el sensor de temperatura del ejemplo anterior es observable, porque tiene el atributo obs. Por lo tanto, el cliente puede suscribirse a las actualizaciones de temperatura enviando una solicitud de observación al recurso.
El siguiente código de ejemplo muestra cómo enviar peticiones de observación utilizando Qt CoAP:
QCoapReply *reply = client->observe(QUrl("127.0.0.1/temp")); connect(reply, &QCoapReply::notified, this, &MyClass::onNotified);
En el caso concreto de las solicitudes de observación, puede utilizar la señal QCoapReply::notified para gestionar las notificaciones del servidor CoAP.
Transferencias en el sentido de las agujas del reloj
Dado que CoAP se basa en transportes de datagramas como UDP, existen límites en cuanto al tamaño que puede tener una representación de recursos para ser transferida sin que la fragmentación cause problemas. Qt CoAP admite transferencias en bloque para situaciones en las que una representación de recursos es mayor de lo que puede transferirse cómodamente en la carga útil de un único datagrama CoAP.
Seguridad
Se definen los siguientes modos de seguridad para CoAP:
- Claveprecompartida: en este modo, el cliente debe enviar al servidor su identidad y la clave precompartida.
- Clave pública bruta - el cliente dispone de un par de claves asimétricas sin certificado (una clave pública bruta). El cliente también tiene una identidad calculada a partir de la clave pública y una lista de identidades de los nodos con los que puede comunicarse. Qt CoAP aún no ha implementado este modo.
- Certificado: el cliente tiene un par de claves asimétricas con un certificado X.509 firmado por una raíz de confianza común.
Dado que CoAP está diseñado para ser un protocolo basado en UDP, el módulo Qt CoAP implementa la seguridad basada en Datagram TLS (DTLS) sobre UDP. Sin embargo, como se mencionó anteriormente, es posible proporcionar un transporte personalizado con otro tipo de seguridad.
Para asegurar el cliente CoAP, se debe especificar uno de los modos de seguridad soportados al crear el cliente:
QCoapClient *client = new QCoapClient(this, QtCoap::PreSharedKey);
La clase QCoapSecurityConfiguration se utiliza para especificar los parámetros de seguridad. Por ejemplo, en modo de clave precompartida se puede utilizar el siguiente código de ejemplo:
QCoapSecurityConfiguration config; config.setPreSharedKey("secretPSK"); config.setIdentity("Client_identity"); client->setSecurityConfiguration(config);
Y en modo certificado
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.