1.QT的mqtt安装
下载地址:https://github.com/emqx/qmqtt
由于项目原因,要使用QT的mqtt模块,但之前使用的是QT5.5.1版本,而Qt5.10之前不支持mqtt,因此需要编译的方式去安装子模块,参考QT以编译方式安装mqtt进行安装。
2.使用
如果在QT中使用,在pro文件中加上:
QT += qmqtt
如果在vs中集成qt使用该模块,则需要在项目属性中包含目录加入mqtt的目录
还要在附加依赖项中加入Qt5Qmqtt.lib
使用TCP连接(Client第一个参数是根据你的服务器地址确定,这里用的是本机地址,即127.0.0.1):
#include "qmqtt.h"
QMQTT::Client *client = new QMQTT::Client(QHostAddress::LocalHost, 1883);//连接127.0.0.1:1883
client->setClientId("clientId");//客户端id
client->setUsername("user");//用户名
client->setPassword("password");//密码
client->connectToHost();//连接服务器
3.测试
测试的话采用emqx,下载地址https://www.emqx.cn/downloads#broker,根据操作系统进行下载,我用的是windows,下图所示命令打开emqx服务器:
在浏览器中输入127.0.0.1:18083,即可进入控制台
此时可以进行测试。
4.MQTT
MQTT (Message Queue Telemetry Transport),其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。
MQTT是应用层的协议。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器的通信协议。
图示如下:
具体讲解以及和socket区别可以参考这篇博客:socket和mqtt
5.基本命令
mqtt的使用包括订阅和接收等命令,具体如下代码所示:
//连接
connect(m_client, &QMQTT::Client::connected, this, [this]() {
const QString content = QLatin1String(" connected");
});
//断开连接
connect(m_client, &QMQTT::Client::disconnected, this, [this]() {
const QString content = QLatin1String(" disconnected");
});
//接收消息
connect(m_client, &QMQTT::Client::received, this, [this](const QMQTT::Message& message) {
const QString content = QString("received, Topic: %1, Message: %2").arg(message.topic()).arg(QString(message.payload()));
});
//订阅
connect(m_client, &QMQTT::Client::subscribed, this, [this](const QString& topic, const quint8 qos) {
const QString content = QString("subscribed, Topic: %1, qos: %2").arg(topic).arg(qos);
});
//取消订阅
connect(m_client, &QMQTT::Client::unsubscribed, this, [this](const QString& topic) {
const QString content = QString("unsubscribed, Topic: %1").arg(topic);
});
//发布
connect(m_client, &QMQTT::Client::published, this, [this](const QMQTT::Message& message, quint16 msgid) {
const QString content = QString("published, Topic: %1, Message: %2, msgid:%3").arg(message.topic()).arg(QString(message.payload())).arg(msgid);
});
//错误
connect(m_client, &QMQTT::Client::error, this, [this](const QMQTT::ClientError error) {
const QString content = QString("error, value: %1").arg(error);
});
上述代码使用qt的槽和函数进行绑定,当发生相应的事件时,执行函数。
发布和订阅的命令如下所示:
QString m_pub_Topic = "pub";// pub topic
//发布
m_client->publish(QMQTT::Message(1,m_pub_Topic,QString("send").toUtf8()));
//订阅
m_client->subscribe(m_pub_Topic);
发布和订阅是以topic进行的,根据对应的topic进行发布和订阅。