QMqttClient Class

QMqttClient 类代表与 MQTT 代理通信的中心访问。更多

头文件: #include <QMqttClient>
CMake: find_package(Qt6 REQUIRED COMPONENTS Mqtt)
target_link_libraries(mytarget PRIVATE Qt6::Mqtt)
qmake: QT += mqtt
继承: QObject

公共类型

enum ClientError { NoError, InvalidProtocolVersion, IdRejected, ServerUnavailable, BadUsernameOrPassword, …, Mqtt5SpecificError }
enum ClientState { Disconnected, Connecting, Connected }
enum ProtocolVersion { MQTT_3_1, MQTT_3_1_1, MQTT_5_0 }
enum TransportType { IODevice, AbstractSocket, SecureSocket }

属性

公共功能

QMqttClient(QObject *parent = nullptr)
virtual ~QMqttClient() override
void authenticate(const QMqttAuthenticationProperties &prop)
bool autoKeepAlive() const
bool cleanSession() const
QString clientId() const
void connectToHost()
void connectToHostEncrypted(const QSslConfiguration &conf)
QMqttConnectionProperties connectionProperties() const
void disconnectFromHost()
QMqttClient::ClientError error() const
QString hostname() const
quint16 keepAlive() const
QMqttLastWillProperties lastWillProperties() const
QString password() const
quint16 port() const
QMqttClient::ProtocolVersion protocolVersion() const
qint32 publish(const QMqttTopicName &topic, const QByteArray &message = QByteArray(), quint8 qos = 0, bool retain = false)
qint32 publish(const QMqttTopicName &topic, const QMqttPublishProperties &properties, const QByteArray &message = QByteArray(), quint8 qos = 0, bool retain = false)
bool requestPing()
QMqttServerConnectionProperties serverConnectionProperties() const
void setConnectionProperties(const QMqttConnectionProperties &prop)
void setLastWillProperties(const QMqttLastWillProperties &prop)
void setTransport(QIODevice *device, QMqttClient::TransportType transport)
QMqttClient::ClientState state() const
QMqttSubscription *subscribe(const QMqttTopicFilter &topic, quint8 qos = 0)
QMqttSubscription *subscribe(const QMqttTopicFilter &topic, const QMqttSubscriptionProperties &properties, quint8 qos = 0)
QIODevice *transport() const
void unsubscribe(const QMqttTopicFilter &topic)
void unsubscribe(const QMqttTopicFilter &topic, const QMqttUnsubscriptionProperties &properties)
QString username() const
QByteArray willMessage() const
quint8 willQoS() const
bool willRetain() const
QString willTopic() const

公共插槽

void setAutoKeepAlive(bool autoKeepAlive)
void setCleanSession(bool cleanSession)
void setClientId(const QString &clientId)
void setError(QMqttClient::ClientError error)
void setHostname(const QString &hostname)
void setKeepAlive(quint16 keepAlive)
void setPassword(const QString &password)
void setPort(quint16 port)
void setProtocolVersion(QMqttClient::ProtocolVersion protocolVersion)
void setState(QMqttClient::ClientState state)
void setUsername(const QString &username)
void setWillMessage(const QByteArray &willMessage)
void setWillQoS(quint8 willQoS)
void setWillRetain(bool willRetain)
void setWillTopic(const QString &willTopic)

信号

void authenticationFinished(const QMqttAuthenticationProperties &p)
void authenticationRequested(const QMqttAuthenticationProperties &p)
void autoKeepAliveChanged(bool autoKeepAlive)
void brokerSessionRestored()
void cleanSessionChanged(bool cleanSession)
void clientIdChanged(QString clientId)
void connected()
void disconnected()
void errorChanged(QMqttClient::ClientError error)
void hostnameChanged(QString hostname)
void keepAliveChanged(quint16 keepAlive)
void messageReceived(const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName())
void messageSent(qint32 id)
void messageStatusChanged(qint32 id, QMqtt::MessageStatus s, const QMqttMessageStatusProperties &properties)
void passwordChanged(QString password)
void pingResponseReceived()
void portChanged(quint16 port)
void protocolVersionChanged(QMqttClient::ProtocolVersion protocolVersion)
void stateChanged(QMqttClient::ClientState state)
void usernameChanged(QString username)
void willMessageChanged(QByteArray willMessage)
void willQoSChanged(quint8 willQoS)
void willRetainChanged(bool willRetain)
void willTopicChanged(QString willTopic)

详细说明

MQTT 客户端是使用 MQTT 与 MQTT 服务器(也称为代理)建立网络连接的程序或设备。连接请求必须包含唯一的客户端标识符。也可选择包含 Will Topic、Will Message、用户名和密码。

一旦创建了连接,客户端就可以发送其他客户端可能有兴趣接收的消息、订阅以请求主题通知、取消订阅以删除通知请求,以及断开与代理的连接。

成员类型文档

enum QMqttClient::ClientError

该枚举类型指定客户端的错误状态。

常量说明
QMqttClient::NoError0未发生错误。
QMqttClient::InvalidProtocolVersion1代理不接受使用指定协议版本的连接。
QMqttClient::IdRejected2客户端 ID 不正确。这可能与其长度有关。
QMqttClient::ServerUnavailable3网络连接已建立,但代理服务不可用。
QMqttClient::BadUsernameOrPassword4用户名或密码中的数据畸形。
QMqttClient::NotAuthorized5客户端无权连接。
QMqttClient::TransportInvalid256底层传输导致错误。例如,连接可能意外中断。
QMqttClient::ProtocolViolation257客户端遇到协议违规,因此关闭了连接。
QMqttClient::UnknownError258发生未知错误。
QMqttClient::Mqtt5SpecificError259该错误与 MQTT 协议第 5 级有关。原因代码可能会提供更多细节。

enum QMqttClient::ClientState

该枚举类型指定了客户端可以进入的状态。

常量描述
QMqttClient::Disconnected0客户端与代理断开连接。
QMqttClient::Connecting1已发出连接请求,但代理尚未批准连接。
QMqttClient::Connected2客户端已连接到代理。

enum QMqttClient::ProtocolVersion

该枚举用于指定与代理进行通信时使用的 MQTT 标准协议版本。

常量描述
QMqttClient::MQTT_3_13MQTT 标准 3.1
QMqttClient::MQTT_3_1_14MQTT 标准 3.1.1,公开称为版本 4
QMqttClient::MQTT_5_05MQTT 标准 5.0

enum QMqttClient::TransportType

该枚举类型指定用于实例化与代理的连接的连接方法。

常量描述
QMqttClient::IODevice0传输使用基于QIODevice 的类。
QMqttClient::AbstractSocket1传输使用基于QAbstractSocket 的类。
QMqttClient::SecureSocket2传输系统使用基于QSslSocket 的类。

属性文档

autoKeepAlive : bool

此属性表示客户端是否会自动向服务器发送保持存活信息。

如果该属性为true ,则客户端将在keepAlive 间隔自动向服务器发送 ping 消息。

否则,用户必须在指定的连接间隔内手动调用requestPing 。如果在该时间间隔内未发送 ping 信息,服务器将断开连接。

此属性的默认值为true

访问功能:

bool autoKeepAlive() const
void setAutoKeepAlive(bool autoKeepAlive)

Notifier 信号:

void autoKeepAliveChanged(bool autoKeepAlive)

另请参阅 keepAlive(),requestPing(),serverConnectionProperties() 和pingResponseReceived().

cleanSession : bool

此属性保存连接到代理后的状态。

访问功能:

bool cleanSession() const
void setCleanSession(bool cleanSession)

通知信号:

void cleanSessionChanged(bool cleanSession)

clientId : QString

该属性包含客户端的标识符值。

每个客户端都需要有一个唯一的 ID 才能连接到 MQTT 代理。如果用户没有指定客户端 ID,则会在建立连接时自动生成一个。

访问功能:

QString clientId() const
void setClientId(const QString &clientId)

通知信号:

void clientIdChanged(QString clientId)

error : ClientError

指定客户端当前的错误。

访问功能:

QMqttClient::ClientError error() const
void setError(QMqttClient::ClientError error)

通知信号:

void errorChanged(QMqttClient::ClientError error)

hostname : QString

该属性包含要连接的 MQTT 代理的主机名。

如果没有通过setTransport() 指定传输方式,客户端将自行实例化与指定主机名的套接字连接。

访问功能:

QString hostname() const
void setHostname(const QString &hostname)

通知信号:

void hostnameChanged(QString hostname)

keepAlive : quint16

该属性表示定期向代理发送 ping 信息的时间间隔。

一旦与代理建立了连接,客户端就需要频繁发送更新,以证明它仍然可以被连接到。这些更新之间的间隔由该属性指定。

间隔以秒为单位。

如果代理在宽限期内没有回应,连接将被关闭。

访问功能:

quint16 keepAlive() const
void setKeepAlive(quint16 keepAlive)

Notifier 信号:

void keepAliveChanged(quint16 keepAlive)

另请参阅 autoKeepAlive(),requestPing() 和pingResponseReceived()。

password : QString

该属性保存连接代理的密码。

访问功能:

QString password() const
void setPassword(const QString &password)

通知信号:

void passwordChanged(QString password)

port : quint16

该属性用于保存连接 MQTT 代理的端口。

如果没有通过setTransport() 指定传输方式,客户端将实例化一个连接到该端口号主机的套接字连接。

访问功能:

quint16 port() const
void setPort(quint16 port)

通知信号:

void portChanged(quint16 port)

protocolVersion : ProtocolVersion

该属性包含连接时使用的 MQTT 标准版本。

指定客户端连接到代理时使用的标准版本。有效值为

  • 3:MQTT 标准版本 3.1。
  • 4:MQTT 标准 3.1.1 版,通常称为 MQTT 4。
  • 5:MQTT 标准 5.0。

访问功能:

QMqttClient::ProtocolVersion protocolVersion() const
void setProtocolVersion(QMqttClient::ProtocolVersion protocolVersion)

通知信号:

void protocolVersionChanged(QMqttClient::ProtocolVersion protocolVersion)

state : ClientState

该属性保存客户端的当前状态。

访问功能:

QMqttClient::ClientState state() const
void setState(QMqttClient::ClientState state)

通知信号:

void stateChanged(QMqttClient::ClientState state)

username : QString

该属性保存连接到代理的用户名。

访问功能:

QString username() const
void setUsername(const QString &username)

通知信号:

void usernameChanged(QString username)

willMessage : QByteArray

该属性保存 Will 报文的有效载荷。

访问功能:

QByteArray willMessage() const
void setWillMessage(const QByteArray &willMessage)

Notifier 信号:

void willMessageChanged(QByteArray willMessage)

willQoS : quint8

该属性表示发送和存储 Will 报文的 QoS 级别。

访问功能:

quint8 willQoS() const
void setWillQoS(quint8 willQoS)

通知信号:

void willQoSChanged(quint8 willQoS)

willRetain : bool

此属性表示是否应将 Will Message 保留在代理上,供未来订阅者接收。

访问功能:

bool willRetain() const
void setWillRetain(bool willRetain)

Notifier 信号:

void willRetainChanged(bool willRetain)

willTopic : QString

该属性包含 Will Topic。

访问功能:

QString willTopic() const
void setWillTopic(const QString &willTopic)

Notifier 信号:

void willTopicChanged(QString willTopic)

成员函数文档

[explicit] QMqttClient::QMqttClient(QObject *parent = nullptr)

使用指定的parent 创建新的 MQTT 客户端实例。

[override virtual noexcept] QMqttClient::~QMqttClient()

删除 MQTT 客户端。如果 MQTT 客户端尚未断开与 MQTT 代理的连接,则会自动断开。

void QMqttClient::authenticate(const QMqttAuthenticationProperties &prop)

prop 指定满足身份验证请求所需的信息。

该函数只能在QMqttClient::authenticationRequested 信号发出后调用。

注: 扩展身份验证是 MQTT 5.0 标准的一部分,只有当客户端将MQTT_5_0 指定为ProtocolVersion 时才能使用。

另请参阅 authenticationRequested() 和authenticationFinished()。

[signal] void QMqttClient::authenticationFinished(const QMqttAuthenticationProperties &p)

该信号在扩展身份验证完成后发出。p 指明身份验证过程的可用详细信息。

认证成功后,QMqttClient::connected

注: 扩展身份验证是 MQTT 5.0 标准的一部分,只有当客户端指定MQTT_5_0ProtocolVersion 时才能使用。

另请参阅 authenticationRequested() 和authenticate()。

[signal] void QMqttClient::authenticationRequested(const QMqttAuthenticationProperties &p)

该信号在客户端调用QMqttClient::connectToHostQMqttClient::connectToHostEncrypted 之后、连接建立之前发出。在扩展身份验证中,代理可能会要求提供更多细节,这些细节需要通过调用QMqttClient::authenticate 来提供。p 指定代理提供的属性。

注意: 扩展身份验证是 MQTT 5.0 标准的一部分,只有当客户端将MQTT_5_0 指定为ProtocolVersion 时才能使用。

另请参阅 authenticationFinished() 和authenticate()。

[signal] void QMqttClient::brokerSessionRestored()

在客户端成功连接到cleanSession 属性设置为false 的代理,且代理已恢复会话后,会发出该信号。

如果客户端之前使用相同的clientId 进行过连接,则会话可以被恢复。

[invokable] void QMqttClient::connectToHost()

启动与 MQTT 代理的连接。

注: 可通过元对象系统和 QML 调用该函数。请参阅Q_INVOKABLE

void QMqttClient::connectToHostEncrypted(const QSslConfiguration &conf)

启动与 MQTT 代理的加密连接。

conf 指定连接使用的 SSL 配置

[signal] void QMqttClient::connected()

连接建立后会发出该信号。

QMqttConnectionProperties QMqttClient::connectionProperties() const

返回客户端向代理请求的连接属性。

注意: QMqttConnectionProperties 只能在客户端将MQTT_5_0 指定为ProtocolVersion 时使用。

另请参阅 setConnectionProperties() 。

[invokable] void QMqttClient::disconnectFromHost()

断开与 MQTT 代理的连接。

注: 可通过元对象系统和 QML 调用此函数。请参阅Q_INVOKABLE

[signal] void QMqttClient::disconnected()

连接关闭时发出该信号。连接可能在调用disconnectFromHost() 或代理断开连接时关闭。

QMqttLastWillProperties QMqttClient::lastWillProperties() const

返回最后的意愿属性。

注意: QMqttLastWillProperties 只能在客户端指定MQTT_5_0ProtocolVersion 时使用。

另请参阅 setLastWillProperties() 。

[signal] void QMqttClient::messageReceived(const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName())

收到新信息时发出该信号。信息的类别由topic 指定,内容为message

[signal] void QMqttClient::messageSent(qint32 id)

表示通过publish() 函数发送的报文已被代理接收。idpublish() 返回的信息相同,有助于跟踪信息的状态。

[signal] void QMqttClient::messageStatusChanged(qint32 id, QMqtt::MessageStatus s, const QMqttMessageStatusProperties &properties)

id s 指定信息的新状态, 指定服务器提供的附加属性。properties

[signal] void QMqttClient::pingResponseReceived()

该信号在代理响应requestPing() 调用或keepAlive() ping 消息后发出,且连接仍然有效。

[invokable] qint32 QMqttClient::publish(const QMqttTopicName &topic, const QByteArray &message = QByteArray(), quint8 qos = 0, bool retain = false)

用指定的topic 向代理发布messageqos 指定传输消息所需的 QoS 级别。

如果retain 设置为true ,则消息将保留在代理上,供其他客户端连接并接收消息。

返回内部用于标识报文的 ID。

注: 可通过元对象系统和 QML 调用此函数。请参阅Q_INVOKABLE

[invokable] qint32 QMqttClient::publish(const QMqttTopicName &topic, const QMqttPublishProperties &properties, const QByteArray &message = QByteArray(), quint8 qos = 0, bool retain = false)

通过指定的propertiestopic 向代理发布messageqos 指定传输消息所需的 QoS 级别。

如果retain 设置为true ,则消息将留在代理上,供其他客户端连接并接收消息。

返回内部用于标识报文的 ID。

注意: 只有当客户端将MQTT_5_0 指定为ProtocolVersion 时,才会将properties 传递给代理。

注: 可通过元对象系统和 QML 调用此函数。请参阅Q_INVOKABLE

bool QMqttClient::requestPing()

向代理发送 ping 消息并等待回复。

如果连接处于活动状态,且autoKeepAlivetrue ,则调用此函数将失败,因为客户端负责管理此进程。

手动使用requestPing() 时,只要连接处于活动状态,就需要在keepAlive 间隔内每次调用一次。

要检查 ping 是否成功,请连接pingResponseReceived() 信号。

如果可以发送 ping 请求,则返回true

另请参阅 pingResponseReceived()、autoKeepAlive() 和keepAlive()。

QMqttServerConnectionProperties QMqttClient::serverConnectionProperties() const

返回代理在尝试连接后返回的QMqttServerConnectionProperties

这可用于验证QMqttClient::setConnectionProperties 设置的客户端连接属性是否已被代理接受。此外,在连接尝试失败的情况下,它还可用于连接诊断。

注意: QMqttServerConnectionProperties 只能在客户端将MQTT_5_0 指定为ProtocolVersion 时使用。

另请参阅 connectionProperties() 。

void QMqttClient::setConnectionProperties(const QMqttConnectionProperties &prop)

将连接属性设置为propQMqttConnectionProperties 可用于要求服务器使用特定功能集。发出连接请求后,可通过调用QMqttClient::serverConnectionProperties 获取服务器响应。

注意: 只有当 MQTT 客户端处于Disconnected 状态时,才能设置连接属性。

注意: QMqttConnectionProperties 只能在客户端将MQTT_5_0 指定为ProtocolVersion 时使用。

另请参阅 connectionProperties() 。

void QMqttClient::setLastWillProperties(const QMqttLastWillProperties &prop)

将最后意愿属性设置为propQMqttLastWillProperties 允许为存储在代理处的最后意愿消息设置附加功能。

注意: 只有当 MQTT 客户端处于Disconnected 状态时,才能设置连接属性。

注意: QMqttLastWillProperties 只能在客户端将MQTT_5_0 指定为ProtocolVersion 时使用。

另请参阅 lastWillProperties() 。

void QMqttClient::setTransport(QIODevice *device, QMqttClient::TransportType transport)

将传输设置为device 。传输可以是套接字类型,也可以是从QIODevice 派生的,由transport 指定。

注: 只有当 MQTT 客户端处于Disconnected 状态时,才能交换传输。

注: 为客户端设置自定义传输并不意味着移交连接管理责任。在调用QMqttClient::connectToHost() 之前,必须为基于QIODevice 的传输打开传输,或为套接字类型的传输连接传输。

另请参阅 transport()。

QMqttSubscription *QMqttClient::subscribe(const QMqttTopicFilter &topic, quint8 qos = 0)

添加新订阅以接收topic 上的通知。参数qos 指定接收安全信息的级别。有关可用 QoS 级别的更多信息,请参阅服务质量

此函数返回一个指向QMqttSubscription 的指针。如果同一主题被订阅两次,返回值将指向同一订阅实例。MQTT 客户端是订阅的所有者。

QMqttSubscription *QMqttClient::subscribe(const QMqttTopicFilter &topic, const QMqttSubscriptionProperties &properties, quint8 qos = 0)

添加新订阅以接收topic 上的通知。参数properties 指定要由代理验证的其他订阅属性。参数qos 指定接收安全信息的级别。有关可用 QoS 级别的更多信息,请参阅服务质量

此函数返回一个指向QMqttSubscription 的指针。如果同一主题被订阅两次,返回值将指向同一订阅实例。MQTT 客户端是订阅的所有者。

注意: 只有当客户端将MQTT_5_0 指定为ProtocolVersion 时,才会将properties 传递给代理。

QIODevice *QMqttClient::transport() const

返回与经纪人通信时使用的传输方式。

另请参阅 setTransport().

void QMqttClient::unsubscribe(const QMqttTopicFilter &topic)

topic 取消订阅。将不会向调用subscribe() 的任何订阅发送通知。

注: 如果客户断开与代理的连接而未取消订阅,代理将存储所有消息并在下次重新连接时发布它们。

void QMqttClient::unsubscribe(const QMqttTopicFilter &topic, const QMqttUnsubscriptionProperties &properties)

topic 取消订阅。调用subscribe() 将不会向任何订阅发送通知。properties 指定了要传递给代理的其他用户属性。

注意: 如果客户断开与代理的连接而未取消订阅,代理将存储所有消息并在下次重新连接时发布它们。

注意: 只有当客户端将MQTT_5_0 指定为ProtocolVersion 时,才会将properties 传递给代理。

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