开发环境:win7 64 + Qt5.9
基于MQTT协议的优良特性,和所从事的软件开发消息较多,与MQTT较为契合,因此先调研MQTT的使用。
一、MQTT官方库下载路径
github地址:https://github.com/qt/qtmqtt
我选择下载5.10版本。
二、编译下载的MQTT
我这里的编译环境是:Qt5.12.3+
编译完成后:bin目录下就是我们要的库文件:
三、新建MqttClient工程,将MQTT库作为外部库导入
新建工程目录下新建lib include目录
打开新建工程的pro文件,添加:
QT += core gui network
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
将 库文件放到新建工程的lib文件下
在mainwindow.h中加入头文件引用
#include "include/qmqttclient.h"
将所有的头文件拷贝到i新建nclude文件夹下
四、链接服务器、断开服务器、订阅消息、发布下次、接收消息代码
初始化mqtt指针
QMqttClient * m_client;//mqtt client指针
m_client = new QMqttClient(this);
链接断开服务器
void MainWindow::on_pushButton_clicked()
{
//未连接服务器则连接
if (m_client->state() == QMqttClient::Disconnected) {
m_client->setHostname("127.0.0.1");
m_client->setPort(1883);
m_client->connectToHost();
} else {//断开连接
m_client->disconnectFromHost();
}
}
订阅消息
void MainWindow::on_pushButton_3_clicked()
{
QString topicSub ="firsttopic";;
if(m_client->state() == QMqttClient::Connected)
{
m_client->subscribe(topicSub, 0);
connect(m_client, SIGNAL(messageReceived(QByteArray,QMqttTopicName)), this, SLOT(receiveMess(QByteArray,QMqttTopicName)));
return;
}
}
发布消息
void MainWindow::on_pushButton_2_clicked()
{
QString topic ="firsttopic";
QString mess ="第一条消息";
if (m_client->publish(topic,mess.toUtf8()) == -1){}
//QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}
接收消息
connect(m_client, SIGNAL(messageReceived(QByteArray,QMqttTopicName)), this, SLOT(receiveMess(QByteArray,QMqttTopicName)));
void MainWindow::receiveMess(const QByteArray &message, const QMqttTopicName &topic)
{
QString content;
content = QDateTime::currentDateTime().toString() + QLatin1Char('\n');
content += QLatin1String(" Received Topic: ") + topic.name() + QLatin1Char('\n');
content += QLatin1String(" Message: ") + message + QLatin1Char('\n');
ui->textEdit->append(content);
}
五、验证
链接服务器:
断开服务器
发布消息
通过MQTT.fx订阅程序发布的消息
接收消息