Linux下QT编程之MQTT实战

应课设要求需要使用MQTT通信协议进行网关开发,所以就花了时间捣鼓一下,也遇到很多的坑所以写了这篇博客记录一下。

1、mqtt服务器有很多在这里我选择EMQ X因为这个是开源并且还有可视化的后台管理便于开发和调试。可以到官网直接下载:点击进去下载 

Linux下QT编程之MQTT实战_第1张图片

Linux下QT编程之MQTT实战_第2张图片Linux下QT编程之MQTT实战_第3张图片 

3、接下来就是上传到Ubuntu虚拟机进行解压安装

解压命令:unzip        emqx-ubuntu16.04-4.3.10-amd64.zip

 安装直接进入解压目录:emqx/bin/ 

执行命令:./emqx         start

Linux下QT编程之MQTT实战_第4张图片

4、测试服务器:

在浏览器中输入 http://localhost:18083,用户名admin,密码public,进入Dashboard

 Linux下QT编程之MQTT实战_第5张图片

小编使用的测试工具是MQTT.fx,这个工具个人决定还是很好用的建议大家去下载

Linux下QT编程之MQTT实战_第6张图片 Linux下QT编程之MQTT实战_第7张图片

Linux下QT编程之MQTT实战_第8张图片 5、关闭服务器

在目录中输入./emqx stop 即可

6、服务其搭建好了之后接下来就是进行mqtt库的移植了,可以到GitHub下载源码点击下载

Linux下QT编程之MQTT实战_第9张图片

Linux下QT编程之MQTT实战_第10张图片

这里一定要注意的是版本号跟QT一定要对应否则编译不通过 !!!

7、接下来就是上传到Ubuntu进行解压

 

 8、进入解压目录使用QT打开工程文件编译源码

Linux下QT编程之MQTT实战_第11张图片

Linux下QT编程之MQTT实战_第12张图片

Linux下QT编程之MQTT实战_第13张图片Linux下QT编程之MQTT实战_第14张图片

 打开之后就是直接简单粗暴编译,过程有一丢丢慢(不出意外会报错,下面就会讲怎么修改

Linux下QT编程之MQTT实战_第15张图片

Linux下QT编程之MQTT实战_第16张图片

显示头文件找不到,是因为头文件路径的目录不正确,要进行修改 使用绝对路径即可

Linux下QT编程之MQTT实战_第17张图片

 Linux下QT编程之MQTT实战_第18张图片

 接下来就是反复调试查找要修改的头文件路径直到编译通过,通过之后会生成一个工程文件夹里面就有我们需要使用到的库了,别泄气老铁们到这里已经成功3/4了。需要用的只有include文件夹和lib文件夹。

 接下来就是新建我们自己的QT工程了,把库加进去就可以爽快的进行开发啦,下面是我自己新建的工程,这里可能会有些朋友不熟悉添加外部库(非常简单)

Linux下QT编程之MQTT实战_第19张图片

需要把include文件夹拷贝到源码的mqtt目录里面

Linux下QT编程之MQTT实战_第20张图片

 下面是把lib文件夹和刚才添加了include源码文件夹的mqtt文件夹放到自己的新建工程自己的工程添加完后的:

Linux下QT编程之MQTT实战_第21张图片

 打开工程添加库

Linux下QT编程之MQTT实战_第22张图片

 点击工程右键“添加库”

Linux下QT编程之MQTT实战_第23张图片

 Linux下QT编程之MQTT实战_第24张图片

 Linux下QT编程之MQTT实战_第25张图片

 选择对应的平台就可以了,小编的是Linux平台,你们按照自己的系统来选择即可。添加成功界面如下:

Linux下QT编程之MQTT实战_第26张图片

在头文件目录添加一个文件如下:

Linux下QT编程之MQTT实战_第27张图片

 在头文件中添加mqtt相关的文件编译成功,致辞移植成功啦!Linux下QT编程之MQTT实战_第28张图片

 Linux下QT编程之MQTT实战_第29张图片

 9、下面就是懒人图形界面设计

Linux下QT编程之MQTT实战_第30张图片

 设计好界面后直接上代码关联后台

.cpp源文件

#include "dialog.h"
#include "ui_dialog.h"
#include 

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    pMqttClient = new QMqttClient(this);//创建一个客户端对象
    connect(pMqttClient,&QMqttClient::stateChanged,this,&Dialog::updateLogStateChange);
    connect(pMqttClient,&QMqttClient::messageReceived,this,&Dialog::recv_message);
}

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

void Dialog::updateLogStateChange()//监测客户端的状态是否发生改变
{
    const QString content = QLatin1String(":state change")
            +QString::number(pMqttClient->state())+QLatin1Char('\n');
    qDebug()<setHostname(ui->ServerIPEdit->text().trimmed());//设置主机IP
    pMqttClient->setPort(ui->PortEdit->text().trimmed().toUInt());//设置端口号
    updateLogStateChange();
    if(pMqttClient->state()==QMqttClient::Disconnected){
        pMqttClient->connectToHost();
        ui->connectBt->setText(tr("Disconnected"));
    }else{
        pMqttClient->disconnectFromHost();
        ui->connectBt->setText(tr("Connect"));
    }
}

void Dialog::on_PublishBt_clicked()//发布主题
{
    QString topic=ui->topicEdit->text().trimmed();//获取主题
    QString playload = ui->playloadEdit->text().trimmed();
    pMqttClient->publish(QMqttTopicName(topic),playload.toLocal8Bit());
    qDebug()<<"publish: ["<Subscribe_top_Edit->text().trimmed();//获取订阅的主题
    pMqttClient->subscribe(QMqttTopicFilter(topic));
    qDebug()<<"Subscribe:"<Subscribe_play_Edit->toPlainText();
    QString receiveStr = receiveTempStr + "\n["+topic.name()+"] "+message;
    ui->Subscribe_play_Edit->setPlainText(receiveStr);
    ui->Subscribe_play_Edit->moveCursor(QTextCursor::End);
    qDebug()<
#ifndef DIALOG_H
#define DIALOG_H

#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
protected:
    QMqttClient *pMqttClient;
private slots:
    void on_connectBt_clicked();

    void on_PublishBt_clicked();

    void on_SubscribeBt_clicked();

    void updateLogStateChange();//客户端状态发生改变
    void recv_message(const QByteArray &message,const QMqttTopicName &topic);
private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

至此实验结束啦

你可能感兴趣的:(linux,qt,物联网)