Qt CoAP 概述
受限应用协议(CoAP)是一种物联网协议,专为受限网络中受限设备(如微控制器)之间的M2M数据交换而设计。
CoAP 的交互模型与 HTTP 的客户端/服务器模型相似,但与 HTTP 不同的是,它使用 UDP 等面向数据报的无连接传输协议,这使得开销非常低,并允许使用 UDP 广播和组播进行寻址。同时,它还提供了轻量级的可靠性机制和安全性。
Qt CoAP 实现了 CoAP 的客户端。默认传输层基于QUdpSocket 构建,其中QDtls 仅在选择安全模式时提供安全性;默认情况下未启用任何安全模式(参见“安全性”)。通过实现 QCoapConnection 接口,可以使用其他传输层。
消息传递模型
CoAP 消息传递模型基于端点之间的消息交换:客户端向服务器发送请求;服务器返回响应。 客户端可以对资源执行 GET、PUT、POST和DELETE 操作。它们还可以通过发出发现请求来发现服务器上的资源,或者通过发出组播发现请求来发现本地网络中的资源。此外,还可以通过观察请求(observe request)订阅资源。
通过将消息标记为可确认(CON)来实现传输的可靠性。 可确认消息将按照默认超时设置进行重传,且每次重传之间采用指数退避算法,直至接收方发送确认(ACK)消息。当接收方无法处理可确认消息时,将发送重置(RST)消息而非确认消息。
不需要可靠传输的消息可以作为不可确认(NON)消息发送。
使用Qt CoAP API
客户端与 CoAP 服务器之间的通信通过 `QCoapClient ` 类实现。该类包含用于发送不同 CoAP 请求的方法,以及在收到已发送请求的响应时触发的信号。`QCoapRequest ` 类用于创建 CoAP 请求。来自服务器的响应将作为 `QCoapReply ` 对象返回。例如:
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"));支持的功能
资源发现
CoAP 发现请求用于查询端点或整个网络中可用的资源。这对 M2M 应用至关重要,因为这类应用中不存在人工干预。例如,在家庭或楼宇自动化中,本地客户端和服务器需要在无需人工干预的情况下相互发现并进行交互。 资源发现使客户端能够了解网络中可用的端点。
Qt CoAP 支持针对单个端点和多播组的发现请求。例如,向/.well-known/core (这是默认的资源发现入口点)发送的发现请求可能会返回类似以下内容:
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这表明网络中存在温度和光传感器资源,以及一个固件资源。该响应采用CoRE Link 格式表示。
专用类QCoapResourceDiscoveryReply 用于获取发现响应:
// 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 将返回网络中发现的 CoAP 资源列表。
资源观察
观察请求用于接收服务器针对某资源发出的自动通知。客户端通过向资源发送观察请求,即可成为该可观察资源的观察者。例如,上文示例中的温度传感器是可观察的,因为它具有obs 属性。因此,客户端可以通过向其发送观察请求来订阅温度更新。
以下示例代码展示了如何使用 `Qt CoAP` 发送观察请求:
QCoapReply *reply = client->observe(QUrl("127.0.0.1/temp"));
connect(reply, &QCoapReply::notified, this, &MyClass::onNotified);对于“观察”请求,您可以使用QCoapReply::notified 信号来处理来自 CoAP 服务器的通知。
分块传输
由于 CoAP 基于 UDP 等数据报传输协议,因此资源表示的大小存在限制,以避免因分片而引发问题。当资源表示的大小超过单个 CoAP 数据报有效载荷可舒适传输的范围时,Qt CoAP 支持分块传输。
安全性
CoAP 定义了以下安全模式:
- 预共享密钥——在此模式下,客户端必须向服务器发送其身份信息和预共享密钥。
- 原始公钥——客户端拥有一个没有证书的非对称密钥对(即原始公钥)。客户端还拥有根据公钥计算得出的身份,以及其可通信节点的身份列表。Qt CoAP 尚未实现此模式。
- 证书——客户端拥有一个附带 X.509 证书的非对称密钥对,该证书由某个通用信任根证书签名。
由于 CoAP 设计为基于 UDP 的协议,Qt CoAP 模块通过 UDP 上的数据报 TLS(DTLS)实现安全保护。不过,如上所述,也可以提供采用其他安全类型的自定义传输层。
注意:当 您提供自定义传输层时, 此处描述的 DTLS 保护将不再适用。此时,确保通信安全成为该传输层的责任,该传输层必须提供与其所基于的协议相适应的加密、对等方认证和消息分帧。 若传输层遗漏了上述任何一项,请求和响应将处于无保护状态,且数据丢失对应用程序的其他部分不可见。
警告:默认情况下, Qt CoAP 在 没有传输安全保护的情况下运行。除非选择了安全模式,否则请求和响应将作为明文UDP数据报发送。仅在完全可信的网络上使用默认模式(QtCoap::NoSecurity );在任何不可信的网络上,应构建带有安全模式的QCoapClient 。
为了保障 CoAP 客户端的安全,在创建客户端时应指定一种受支持的安全模式:
QCoapClient *client = new QCoapClient(this, QtCoap::PreSharedKey);QCoapSecurityConfiguration 类用于指定安全参数。例如,在预共享密钥模式下,可以使用以下示例代码:
QCoapSecurityConfiguration config;
config.setPreSharedKey("secretPSK");
config.setIdentity("Client_identity");
client->setSecurityConfiguration(config);而在证书模式下:
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.