本页内容

QCoapClient Class

QCoapClient 类允许应用程序发送 CoAP 请求并接收响应。更多内容...

头文件: #include <QCoapClient>
CMake: find_package(Qt6 REQUIRED COMPONENTS Coap)
target_link_libraries(mytarget PRIVATE Qt6::Coap)
qmake: QT += coap
继承自: QObject

注:本类中的所有函数均为可重入函数。

属性

公共函数

QCoapClient(QtCoap::SecurityMode securityMode = QtCoap::SecurityMode::NoSecurity, QObject *parent = nullptr)
virtual ~QCoapClient()
QNetworkInterface bindInterface() const
void cancelObserve(QCoapReply *notifiedReply)
void cancelObserve(const QUrl &url)
QCoapReply *deleteResource(const QCoapRequest &request)
QCoapReply *deleteResource(const QUrl &url)
void disconnect()
QCoapResourceDiscoveryReply *discover(const QUrl &url, const QString &discoveryPath = QLatin1String("/.well-known/core"))
QCoapResourceDiscoveryReply *discover(QtCoap::MulticastGroup group = QtCoap::MulticastGroup::AllCoapNodesIPv4, int port = QtCoap::DefaultPort, const QString &discoveryPath = QLatin1String("/.well-known/core"))
QCoapReply *get(const QCoapRequest &request)
QCoapReply *get(const QUrl &url)
QCoapReply *observe(const QCoapRequest &request)
QCoapReply *observe(const QUrl &url)
QCoapReply *post(const QCoapRequest &request, const QByteArray &data = QByteArray())
QCoapReply *post(const QCoapRequest &request, QIODevice *device)
QCoapReply *post(const QUrl &url, const QByteArray &data = QByteArray())
QCoapReply *put(const QCoapRequest &request, const QByteArray &data = QByteArray())
QCoapReply *put(const QCoapRequest &request, QIODevice *device)
QCoapReply *put(const QUrl &url, const QByteArray &data = QByteArray())
void setAckRandomFactor(double ackRandomFactor)
void setAckTimeout(uint ackTimeout)
void setBindInterface(const QNetworkInterface &iface)
void setBlockSize(quint16 blockSize)
void setMaximumRetransmitCount(uint maximumRetransmitCount)
void setMaximumServerResponseDelay(uint responseDelay)
void setMinimumTokenSize(int tokenSize)
void setSecurityConfiguration(const QCoapSecurityConfiguration &configuration)
void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)

信号

void bindInterfaceChanged(const QNetworkInterface &iface)
void error(QCoapReply *reply, QtCoap::Error error)
void finished(QCoapReply *reply)
void responseToMulticastReceived(QCoapReply *reply, const QCoapMessage &message, const QHostAddress &sender)

详细说明

QCoapClient 类包含一些信号,当已发送请求的响应到达时,这些信号会被触发。

应用程序可以使用 QCoapClient 通过 CoAP 网络发送请求。它为标准请求提供了函数:每个函数都会返回一个QCoapReply 对象,响应数据将传递到该对象中;当finished() 信号触发时,即可读取该数据。

可通过以下方式发送一个简单请求:

QCoapClient *client = new QCoapClient(this);
connect(client, &QCoapClient::finished, this, &TestClass::slotFinished);
client->get(QCoapRequest(Qurl("coap://coap.me/test")));

注意: 请求处理完成后, 用户有责任在适当的时候删除QCoapReply 对象。请勿在连接到finished()的槽内直接删除它。您可以使用deleteLater()函数。

您还可以使用观察请求。其用法与上述相同,或者更方便地通过QCoapReply::notified() 信号实现:

QCoapRequest request = QCoapRequest(Qurl("coap://coap.me/obs"));
QCoapReply *reply = client->observe(request);
connect(reply, &QCoapReply::notified, this, &TestClass::slotNotified);

观察操作可通过以下方式取消:

client->cancelObserve(reply);

当收到回复时,QCoapClient 会发出一个finished() 信号。

注意:对于 发现请求,返回的对象是一个 `QCoapResourceDiscoveryReply`。它与 `QCoapReply ` 的用法相同,但还包含一个资源列表。

安全注意事项

在按块传输过程中,响应负载会累积在内存中,直到传输完成;而QtCoap 并未对累积大小设置上限。 因此,如果恶意或故障的服务器持续发送数据块却始终不发送最后一个数据块,可能会导致客户端内存耗尽。在传输进行过程中无法观察到累积大小,因此应用程序无法直接对其进行限制。请仅与可信服务器进行分块交换,并最好在可信或隔离的网络上进行。

组播

DTLS 用于保护两个端点之间的连接,因此无法应用于可能存在两个以上端点的组播场景。正因如此,组播请求及其响应既未加密也未经过身份验证。

组内每个主机都可能响应多播请求。在 CoAP 中,这些主机都是资源的合法所有者,且预期会提供等效的响应。当响应按块分批发送时,剩余的块将通过单播从任何一个已响应的主机处检索。

CoAP 多播的设计基于网络是安全的且组内每个节点都是可信的这一假设。仅在满足此假设的情况下才应使用多播。

另请参阅 QCoapRequest 、QCoapReply 以及QCoapResourceDiscoveryReply 。

属性文档

[since 6.11] bindInterface : QNetworkInterface

该属性存储了套接字将要使用的网络接口

默认值是一个 `invalid `QNetworkInterface 对象,这意味着将从所有网络接口接收传入数据包。同样,所有网络接口均可用于发送传出数据包。

当指定了一个有效的网络接口时,仅接受来自该接口的传入数据包。同样地,传出数据包也将仅通过该接口发送。

更改该属性仅在客户端下次绑定到套接字时生效,因此如果之前有过通信,请务必调用disconnect()。

此枚举类型在 Qt 6.11 中引入。

访问函数:

QNetworkInterface bindInterface() const
void setBindInterface(const QNetworkInterface &iface)

通知器信号:

void bindInterfaceChanged(const QNetworkInterface &iface)

成员函数文档

[explicit] QCoapClient::QCoapClient(QtCoap::SecurityMode securityMode = QtCoap::SecurityMode::NoSecurity, QObject *parent = nullptr)

根据给定的securityMode 构建一个QCoapClient对象,并将parent 设置为父对象。

securityMode 的默认值为QtCoap::NoSecurity ,这将禁用安全功能。

[virtual noexcept] QCoapClient::~QCoapClient()

销毁QCoapClient 对象并释放所有资源。请注意,由本类返回的QCoapReply 对象将其父对象设置为QCoapClient ,这意味着它们将随该父对象一同被删除。

void QCoapClient::cancelObserve(QCoapReply *notifiedReply)

使用observe()方法返回的响应notifiedReply ,取消对资源的监听。

这是一个重载函数。

另请参阅 observe()。

void QCoapClient::cancelObserve(const QUrl &url)

取消对由url 标识的资源的监听。

这是一个重载函数。

另请参阅 observe()。

QCoapReply *QCoapClient::deleteResource(const QCoapRequest &request)

使用 DELETE 方法发送request ,并返回一个新的QCoapReply 对象。

另请参阅 get()、put()、post()、observe() 以及discover()。

QCoapReply *QCoapClient::deleteResource(const QUrl &url)

向目标url 发送一个 DELETE 请求。

这是一个重载函数。

另请参阅 get()、put()、post()、observe() 以及discover()。

void QCoapClient::disconnect()

关闭已打开的套接字和连接,以释放传输通道。

注意:在 安全模式下 ,必须在更改安全配置或连接到另一台服务器之前调用此函数。

另请参阅 setSecurityConfiguration()。

QCoapResourceDiscoveryReply *QCoapClient::discover(const QUrl &url, const QString &discoveryPath = QLatin1String("/.well-known/core"))

用于发现指定url 路径下可用的资源,并返回一个新的QCoapResourceDiscoveryReply 对象,该对象会在响应到达时触发QCoapResourceDiscoveryReply::discovered() 信号。

发现路径默认为“/.well-known/core”,但可以通过向discoveryPath 传递不同的路径来更改。发现机制在RFC 6690 中有详细描述。

另请参阅 get()、post()、put()、deleteResource() 以及observe()。

QCoapResourceDiscoveryReply *QCoapClient::discover(QtCoap::MulticastGroup group = QtCoap::MulticastGroup::AllCoapNodesIPv4, int port = QtCoap::DefaultPort, const QString &discoveryPath = QLatin1String("/.well-known/core"))

发现已加入group 且位于指定port 的端点上可用的资源。返回一个新的QCoapResourceDiscoveryReply 对象,该对象会在收到响应时触发QCoapResourceDiscoveryReply::discovered()信号。group 是CoAP多播组地址之一,默认值为QtCoap::AllCoapNodesIPv4 。

发现路径默认为“/.well-known/core”,但可以通过向discoveryPath 传递不同的路径来更改。发现机制在RFC 6690 中有详细描述。

这是一个重载函数。

另请参阅 get()、post()、put()、deleteResource() 以及observe()。

[signal] void QCoapClient::error(QCoapReply *reply, QtCoap::Error error)

每当发生错误时,都会发出此信号。如果错误与特定的QCoapReply 无关,则reply 参数可以设置为nullptr 。error 参数包含错误代码。

另请参阅 finished()、QCoapReply::error(),以及QCoapReply::finished()。

[signal] void QCoapClient::finished(QCoapReply *reply)

每当接收到 CoAP 应答时(无论操作成功还是发生错误),都会与QCoapReply::finished() 信号一同发出此信号。reply 参数将包含指向刚刚接收到的应答的指针。

另请参阅 error()、QCoapReply::finished() 和QCoapReply::error()。

QCoapReply *QCoapClient::get(const QCoapRequest &request)

使用 GET 方法发送request ,并返回一个新的QCoapReply 对象。

另请参阅 post()、put()、deleteResource()、observe() 以及discover()。

QCoapReply *QCoapClient::get(const QUrl &url)

向url 发送一个 GET 请求,并返回一个新的QCoapReply 对象。

这是一个重载函数。

另请参阅 post()、put()、deleteResource()、observe() 以及discover()。

QCoapReply *QCoapClient::observe(const QCoapRequest &request)

向目标request 发送监听请求,并返回一个新的QCoapReply 对象,该对象会在收到新通知时触发QCoapReply::notified() 信号。

另请参阅 cancelObserve()、get()、post()、put()、deleteResource(),以及discover()。

QCoapReply *QCoapClient::observe(const QUrl &url)

向目标url 发送观察请求,并返回一个新的QCoapReply 对象,该对象会在收到新通知时触发QCoapReply::notified()信号。

这是一个重载函数。

另请参阅 cancelObserve()、get()、post()、put()、deleteResource(),以及discover()。

QCoapReply *QCoapClient::post(const QCoapRequest &request, const QByteArray &data = QByteArray())

使用 POST 方法发送request ,并返回一个新的QCoapReply 对象。将data 作为此请求的有效载荷。如果data 为空,则使用request 的有效载荷。

另请参阅 get()、put()、deleteResource()、observe() 和discover()。

QCoapReply *QCoapClient::post(const QCoapRequest &request, QIODevice *device)

使用 POST 方法发送request 请求,并返回一个新的QCoapReply 对象。将device 的内容用作此请求的有效载荷。若设备为 null,则视为内容为空,此时将使用request 的有效载荷。

注意: 调用此函数前,设备 必须处于已打开且可读状态。

这是一个重载函数。

另请参阅 get()、put()、deleteResource()、observe() 以及discover()。

QCoapReply *QCoapClient::post(const QUrl &url, const QByteArray &data = QByteArray())

向url 发送一个 POST 请求,并返回一个新的QCoapReply 对象。将data 作为此请求的有效载荷。

这是一个重载函数。

另请参阅 get()、put()、deleteResource()、observe(),以及discover()。

QCoapReply *QCoapClient::put(const QCoapRequest &request, const QByteArray &data = QByteArray())

使用 PUT 方法发送request ,并返回一个新的QCoapReply 对象。将data 作为此请求的有效载荷。如果data 为空,则使用request 的有效载荷。

另请参阅 get()、post()、deleteResource()、observe() 和discover()。

QCoapReply *QCoapClient::put(const QCoapRequest &request, QIODevice *device)

使用 PUT 方法发送request 请求,并返回一个新的QCoapReply 对象。将device 的内容用作此请求的有效载荷。空设备将被视为空内容,在这种情况下,将使用request 的有效载荷。

注意: 调用此函数前,设备 必须处于已打开且可读状态。

这是一个重载函数。

另请参阅 get()、post()、deleteResource()、observe() 以及discover()。

QCoapReply *QCoapClient::put(const QUrl &url, const QByteArray &data = QByteArray())

向url 发送一个 PUT 请求,并返回一个新的QCoapReply 对象。将data 作为此请求的有效载荷。

这是一个重载函数。

另请参阅 get()、post()、deleteResource()、observe()和discover()。

[signal] void QCoapClient::responseToMulticastReceived(QCoapReply *reply, const QCoapMessage &message, const QHostAddress &sender)

当收到针对多播请求的单播响应时,会发出此信号。reply 参数包含指向刚接收到的回复的指针,message 包含有效载荷和消息详细信息,sender 包含发送方地址。

注意:多播 请求无需身份验证;有关其依赖的信任模型,请参阅multicast security considerations 。

另请参阅 error()、QCoapReply::finished() 和QCoapReply::error()。

void QCoapClient::setAckRandomFactor(double ackRandomFactor)

将RFC 7252 第 4.2 节中定义的“ACK_RANDOM_FACTOR ”值设置为ackRandomFactor 。该值应大于或等于 1。默认值为 1.5。

另请参阅 setAckTimeout()。

void QCoapClient::setAckTimeout(uint ackTimeout)

将RFC 7252 第 4.2 节中定义的“ACK_TIMEOUT ”值设置为ackTimeout (单位为毫秒)。默认值为 2000 毫秒。

此超时仅适用于可确认的消息。可靠传输的实际超时时间是ACK_TIMEOUT 与ACK_TIMEOUT * ACK_RANDOM_FACTOR 之间的一个随机值。

另请参阅 setAckRandomFactor()。

void QCoapClient::setBlockSize(quint16 blockSize)

将协议在发送请求和接收响应时使用的最大块大小设置为blockSize 。块大小必须是2的幂。

void QCoapClient::setMaximumRetransmitCount(uint maximumRetransmitCount)

将RFC 7252 第 4.2 节中定义的“MAX_RETRANSMIT ”值设置为maximumRetransmitCount 。该值应小于或等于 25。默认值为 4。

void QCoapClient::setMaximumServerResponseDelay(uint responseDelay)

将“MAX_SERVER_RESPONSE_DELAY ”的值设置为responseDelay (单位为毫秒)。默认值为250秒。

根据RFC 7390 第 2.5 节的定义, MAX_SERVER_RESPONSE_DELAY 是客户端可向其发送组播请求的所有服务器所预期的最大响应延迟。

void QCoapClient::setMinimumTokenSize(int tokenSize)

将令牌的最小大小设置为tokenSize 字节。出于安全考虑,建议使用长度至少为4字节的令牌。该参数的默认值为4字节。

void QCoapClient::setSecurityConfiguration(const QCoapSecurityConfiguration &configuration)

从configuration 中设置安全配置参数。如果使用QtCoap::NoSecurity 模式,则该配置将被忽略。

注意: 必须在握手开始之前调用此 方法。如果需要在与服务器建立安全连接后更改安全配置,则必须先断开客户端连接。

另请参阅 disconnect()。

void QCoapClient::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)

将QUdpSocket 套接字option 设置为value 。

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