Qt CoAP 概述

受限应用协议(CoAP)是一种物联网协议,专为受限网络中受限设备(如微控制器)之间的 M2M 数据交换而设计。

CoAP 的交互模型类似于 HTTP 的客户端/服务器模型,但与 HTTP 不同的是,它使用面向数据报的无连接传输(如 UDP),因此开销极低,并允许使用 UDP 广播和组播进行寻址。同时,它还提供了轻量级的可靠性机制和安全性。

Qt CoAP CoAP 的客户端是由 CoAP.NET 实现的。默认情况下,传输层使用 和 来保证安全性。通过实现 QCoapConnection 接口,可使用其他传输层。QUdpSocket QDtls

消息传递模型

CoAP 消息传递模型基于端点之间的消息交换:客户端向服务器发送请求;服务器发送响应。客户端可以GETPUTPOSTDELETE资源。客户端还可以通过提出发现请求来发现服务器上的资源,或在本地网络中通过提出组播发现请求来发现资源。也可以通过观测请求订阅资源。

传输的可靠性是通过标记消息的可确认性(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 链接格式表示。

专门的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) 的安全性。不过,如上所述,也可以提供具有其他安全类型的自定义传输。

为确保 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);

© 2025 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.