Qt CoAP 概述

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

CoAP的交互模式与HTTP的客户端/服务器模式类似,但与HTTP不同,它使用面向数据报的、无连接的传输方式,如UDP,这导致了非常低的开销,并允许使用UDP广播和多播进行寻址。同时,它提供了轻量级的可靠性和安全性机制。

Qt CoAP实现了CoAP的客户端功能。默认情况下,传输层使用QUdpSocketQDtls进行安全性。可以通过实现QCoapConnection接口来使用其他传输。

消息模型

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等数据报文传输,资源表示的大小有限制,以便在传输中不会因数据包分片而出现问题。Qt CoAP支持分块传输,用于资源表示大于单个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);

© 2024 Qt公司有限公司。所包含的文档贡献的版权均为其所有者的版权。此处提供的文档是在自由软件基金会发布的GNU自由文档许可证第1.3版条款下许可的。Qt及其相关标志是芬兰和/或其他国家的Qt公司有限公司的商标。所有其他商标均为其各自拥有者的财产。