树莓派上用QT搭建MQTT环境教程

第一步:下载源码

git clone https://code.qt.io/qt/qtmqtt.git

也可以去我的百度网盘里下载,下面的链接
下载链接
提取码:fopr

注意:编译安装MQTT模块需要用到CMake和Perl,所以如果没有安装的话,需要先安装:

sudo apt-get install cmake
sudo apt-get install perl

第二步:树莓派安装依赖库

sudo apt install qtbase5-private-dev

第三步:开始编译

cd qtmqtt
qmake
make -j4

在这里插入图片描述
发现编译失败,编译过程中会可能会出现一个或两个错误:
第一个错误

qmqttclient_p.h:49:31: fatal error: private/qobject_p.h:

这是因为少安装了一个库

解决办法

sudo apt install qtbase5-private-dev

第二个错误
在这里插入图片描述
看报错提示是没有这个符号重载,那么我们就需要打开源代码对它进行更改。从上图可以看出这个错误是在文件qmqtttopicfilter.cpp中的第231行,我们打开源代码,找到报错点:
在这里插入图片描述
然后做如下更改:
在这里插入图片描述
第三个错误
在这里插入图片描述
看报错提示仍然是没有这个符号重载,而且这个错误还是在文件qmqtttopicfilter.cpp中,第250行,我们打开源代码,找到报错点,然后做如下更改:
在这里插入图片描述

第四步:继续编译

make -j4

如果
发现没有报错则编译完成。

第五步:安装

sudo make install

在这里插入图片描述
没有报错,安装成功。然后你会发现文件夹中多了几个文件夹,我把它们全部放到一个新的文件夹Compiler_OK里面了,如下图示:
在这里插入图片描述

第六步:使用

  • 首先打开qtcreator创建一个新的工程:MQTT_Test
  • 将编译产生的include文件夹复制到源码的src/mqtt文件夹中,如下所示:
    在这里插入图片描述
  • 将源码src下的mqtt文件夹整个复制到自己新建的工程MQTT_Test中,如下图示:
    在这里插入图片描述
  • 将编译产生的lib文件夹整个复制到自己新建的工程MQTT_Test中,如下图示:
    在这里插入图片描述
  • 在新建工程中加入MQTT支持文件(右键->添加现有文件),如下图示:
    在这里插入图片描述
  • 添加外部库,如下图示:
    在这里插入图片描述
    在这里插入图片描述
    注意路径,这个库文件在lib文件夹下。
    在这里插入图片描述
  • 将lib文件夹下的库文件(.so后缀文件)复制到新建工程编译文件夹中,我不管它全部复制过去了。
    在这里插入图片描述
  • 添加头文件开始编程,以下是示例中摘取的一个例子:
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtCore/QDateTime>
#include <QtMqtt/QMqttClient>
#include <QtWidgets/QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_client = new QMqttClient(this);
    m_client->setHostname(ui->lineEditHost->text());
    m_client->setPort(ui->spinBoxPort->value());

    connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
    connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);

    connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
        const QString content = QDateTime::currentDateTime().toString()
                    + QLatin1String(" Received Topic: ")
                    + topic.name()
                    + QLatin1String(" Message: ")
                    + message
                    + QLatin1Char('\n');
        ui->editLog->insertPlainText(content);
    });

    connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {
        const QString content = QDateTime::currentDateTime().toString()
                    + QLatin1String(" PingResponse")
                    + QLatin1Char('\n');
        ui->editLog->insertPlainText(content);
    });

    connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);
    connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
    updateLogStateChange();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_buttonConnect_clicked()
{
    if (m_client->state() == QMqttClient::Disconnected) {
        ui->lineEditHost->setEnabled(false);
        ui->spinBoxPort->setEnabled(false);
        ui->buttonConnect->setText(tr("Disconnect"));
        m_client->connectToHost();
    } else {
        ui->lineEditHost->setEnabled(true);
        ui->spinBoxPort->setEnabled(true);
        ui->buttonConnect->setText(tr("Connect"));
        m_client->disconnectFromHost();
    }
}

void MainWindow::on_buttonQuit_clicked()
{
    QApplication::quit();
}

void MainWindow::updateLogStateChange()
{
    const QString content = QDateTime::currentDateTime().toString()
                    + QLatin1String(": State Change")
                    + QString::number(m_client->state())
                    + QLatin1Char('\n');
    ui->editLog->insertPlainText(content);
}

void MainWindow::brokerDisconnected()
{
    ui->lineEditHost->setEnabled(true);
    ui->spinBoxPort->setEnabled(true);
    ui->buttonConnect->setText(tr("Connect"));
}

void MainWindow::setClientPort(int p)
{
    m_client->setPort(p);
}

void MainWindow::on_buttonPublish_clicked()
{
    if (m_client->publish(ui->lineEditTopic->text(), ui->lineEditMessage->text().toUtf8()) == -1)
        QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}

void MainWindow::on_buttonSubscribe_clicked()
{
    auto subscription = m_client->subscribe(ui->lineEditTopic->text());
    if (!subscription) {
        QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not subscribe. Is there a valid connection?"));
        return;
    }
}
  • MQTT源码中有个example文件夹,里面有很多示例,入门学习是很不错的
    在这里插入图片描述
    在这里插入图片描述

看到这里如果对你有帮助的话,请点个赞支持一下,谢谢!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值