Linux下QT编程之MQTT实战

Posted @嵌入式Linux小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下QT编程之MQTT实战相关的知识,希望对你有一定的参考价值。

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

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

 

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

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

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

执行命令:./emqx         start

4、测试服务器:

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

 

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

 

 5、关闭服务器

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

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

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

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

 

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

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

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

 

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

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

 

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

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

 打开工程添加库

 点击工程右键“添加库”

 

 

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

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

 

 在头文件中添加mqtt相关的文件编译成功,致辞移植成功啦!

 

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

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

.cpp源文件

#include "dialog.h"
#include "ui_dialog.h"
#include <qdebug.h>

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()<<content;


void Dialog::on_connectBt_clicked()//连接服务器


    pMqttClient->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: ["<<topic<<"] "<<playload;


void Dialog::on_SubscribeBt_clicked()//订阅主题

    QString topic = ui->Subscribe_top_Edit->text().trimmed();//获取订阅的主题
    pMqttClient->subscribe(QMqttTopicFilter(topic));
    qDebug()<<"Subscribe:"<<topic;


void Dialog::recv_message(const QByteArray &message,const QMqttTopicName &topic)//获取订阅的消息内容

    QString receiveTempStr = ui->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()<<message<<"\\n"<<topic.name();


#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <mqtt/qmqttclient.h>

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编程之MQTT实战的主要内容,如果未能解决你的问题,请参考以下文章

QT应用编程: 编写MQTT客户端登录OnetNet服务器完成主题订阅与发布

QT应用编程: 编写MQTT客户端登录OnetNet服务器完成主题订阅与发布

MQTT——使用MQTT.fx工具接入阿里云物联网平台,实现基本通信调测

MQTT——使用MQTT.fx工具接入阿里云物联网平台,实现基本通信调测

Linux——Linux驱动之玩转SPI(上)Linux下SPI驱动框架简析及SPI设备驱动代码框架实现步骤

Linux——Linux驱动之玩转SPI(上)Linux下SPI驱动框架简析及SPI设备驱动代码框架实现步骤