-
下载qtmqtt源码
下载地址:https://github.com/qt/qtmqtt,选择跟自己使用Qt版本一致的分支
-
使用qmake编译qtmqtt源码
编译环境:Ubuntu1804+Qt5.13.2
cd qtmqtt
mkdir build && cd build
qmake .. (此步执行报错的话请选用qmake的绝对路径)
make
make install
3. 编写Qt客户端测试程序
-
pro 文件增加
QT += mqtt
-
.h文件主要代码
#include <QMqttClient>
void initMqttClinet();
private slots:
void on_pBtn_Connect_clicked();
void stateChangedSlot(QMqttClient::ClientState state);
void errorChangedSlot(QMqttClient::ClientError error);
void messageReceivedSlot(const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName());
void on_pBtn_Publish_clicked();
void on_pBtn_Subscribe_clicked();
void on_pBtn_Ping_clicked();
private:
QMqttClient* mqttClient;
-
.cpp文件主要代码
void MainWindow::initMqttClinet()
{
mqttClient = new QMqttClient();
mqttClient->setHostname(ui->lineEditHost->text().trimmed());
mqttClient->setPort(1883);
mqttClient->setProtocolVersion(QMqttClient::MQTT_3_1_1);
mqttClient->setClientId(ui->lineEditClientId->text().trimmed());
mqttClient->setUsername("admin");
mqttClient->setPassword("password");
connect(mqttClient, &QMqttClient::stateChanged, this, &MainWindow::stateChangedSlot);
connect(mqttClient, &QMqttClient::errorChanged, this, &MainWindow::errorChangedSlot);
connect(mqttClient, &QMqttClient::messageReceived, this, &MainWindow::messageReceivedSlot);
mqttClient->connectToHost();
}
void MainWindow::on_pBtn_Connect_clicked()
{
initMqttClinet();
}
void MainWindow::stateChangedSlot(QMqttClient::ClientState state)
{
QString info("");
if(state == 0)
{
info = QString("mqtt disconnected. error:%1" ).arg(mqttClient->error());
}
else if(state == 1)
{
info = "mqtt connecting";
}
else if(state == 2)
{
info = QString("mqtt connected. hostname:%1").arg(mqttClient->hostname());
}
ui->editLog->insertPlainText(QDateTime::currentDateTime().toString()
+ QString("state:%1 info:%2\n").arg(state).arg(info));
}
void MainWindow::errorChangedSlot(QMqttClient::ClientError error)
{
qDebug()<<__FILE__<<__LINE__<<error;
ui->editLog->insertPlainText(QString("error:%1").arg(error));
}
void MainWindow::messageReceivedSlot(const QByteArray &message, const QMqttTopicName &topic)
{
qDebug()<<__FILE__<<__LINE__<<message<<topic;
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(" Received Topic: ")
+ topic.name()
+ QLatin1String(" Message: ")
+ message
+ QLatin1Char('\n');
ui->editLog->insertPlainText(content);
}
void MainWindow::on_pBtn_Publish_clicked() // 发布
{
if(mqttClient == nullptr)
{
ui->editLog->insertPlainText(QString("[Error] Before publish, Please init mqtt client.\n"));
return;
}
if (mqttClient->publish(ui->lineEditTopic->text(),ui->lineEditMessage->text().toUtf8()) == -1)
{
ui->editLog->insertPlainText(QString("[Error] Could not publish message.\n"));
}
}
void MainWindow::on_pBtn_Subscribe_clicked() // 订阅
{
if(mqttClient == nullptr)
{
ui->editLog->insertPlainText(QString("[Error] Before subscribe, Please init mqtt client.\n"));
return;
}
auto subscription = mqttClient->subscribe(ui->lineEditTopic->text());
if (!subscription) {
ui->editLog->insertPlainText(QString("[Error] Could not subscribe. Is there a valid connection?\n"));
return;
}
}
void MainWindow::on_pBtn_Ping_clicked()
{
bool res = mqttClient->requestPing();
ui->editLog->insertPlainText(QString("[RESULT] PING? %1\n").arg(res));
}
-
界面截图
4.部署mqtt服务端
-
Windows部署mosquitto
-
Linux部署EMQX
-
下载地址:免费下载、试用 EMQ 产品
-
安装方法如界面下图所示
-
打开浏览器测试服务端
输入url:http://127.0.0.1:18083打开界面如下图所示则表示服务器端已启动
初次登录时,默认用户名为admin,密码为public;需要根据提示自行设置密码。
1883(暴露给外部的MQTT服务端口),18083(服务器控制面板端口)