QT简单实现MQTT通信

目录

前言

一、ubuntu搭建mqtt服务器

1.1、资源下载

1.2、安装

1.3、修改配置文件

1.4、启动以及测试mosquitto

二、移植MQTT官方库

1.下载官方源码

2、打开文件并且编译文件

 3、移植官方库文件

 4、编写qt代码

 5、实验现象

三、移植第三方库

1、下载第三方源码

2、移植

 3、编写qt代码

总结


前言

关于mqtt和qt的干货知识就不进行讲解了,直接配置mqtt库以及简单的使用qt进行简单通信。中间也出现了一点点小坑,希望能有用。

一、ubuntu搭建mqtt服务器

1.1、资源下载

        进入官网下载源码,ubuntu的搭建我这里省略,可以直接在ubuntu中下载也可以在windows上下载到共享文件夹使用。

1.2、安装

在终端中执行以下命令(中间安装可能会出现要更新apt-get,根据提示执行命令即可,如出现问题请自行查阅)

# 安装mosquitto
sudo apt-get install mosquitto
# 安装客户端
sudo apt-get install mosquitto-clients
# 安装设备端
sudo apt-get install mosquitto-dev

1.3、修改配置文件

把刚刚我们下载的源码解压(tar命令)

 如果出现上面没有共享文件的现象可以执行以下命令(要在桌面路径或者根路径下执行)

sudo vmhgfs-fuse .host:/ /mnt/hgfs -o nonempty -o allow_other

将解压好的mosquitto.conf替换掉/etc/mosquitto/mosquitto.conf,直接强制cp替换掉就好。

sudo cp mosquitto.conf /etc/mosquitto/mosquitto.conf -f

1.4、启动以及测试mosquitto

启动mosquitto

mosquitto -c /etc/mosquitto/mosquitto.conf

再开一个终端测试是否能成功

 使用mqttfx进行连接测试

二、移植MQTT官方库

1.下载官方源码

mqtt官方将源码放到了Github上,建议下载和自己qt对应的版本,如果qt版本过低就随便下载就好了。(我后续会把mqttfx,源码等打包放在网盘中放在最底下)

2、打开文件并且编译文件

qmake和构建这个src文件就可以,可以将模式换成release模式,也可以debug,不同的编译后续的操作也不同

 

 后续可能会报错,根据提示就是没有这个库文件,我在后面加上.h就行了

构建完成后,提取我们需要的文件

 

 

 

 3、移植官方库文件

 

 

 

 

 4、编写qt代码

ui界面如下

 widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

    //初始化
    client = new QMqttClient();

    //连接接收到主题消息的信号槽函数
    connect(client,SIGNAL(messageReceived(QByteArray,QMqttTopicName)),this,SLOT(MQTT_ReceiveMessage(QByteArray,QMqttTopicName)));
}

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

//发布按钮的点击槽函数
void Widget::on_pushButton_clicked()
{
    QString topic = ui->topicLineEdit->text();
    QString msg = ui->msgLineEdit->text();

    QByteArray qba;
    qba.append(msg);

    if(client->state() == QMqttClient::Connected)
    {
        if(client->publish(QMqttTopicName(topic),qba))
        {
           qDebug()<<"发布失败";
        }
        else
        {
            qDebug()<<"发布成功";
        }
    }
    else
    {
        qDebug()<<client->state();
        QMessageBox::warning(this,"提示","mqtt未连接");
    }
}
//订阅按钮的点击槽函数
void Widget::on_subPushBottom_clicked()
{
    QString topic = ui->subtopicLineEdit->text();

   if(client->state() == QMqttClient::Connected)
   {
       client->subscribe(QMqttTopicFilter(topic));

       qDebug()<<"订阅的消息为:"+topic;
   }
   else
   {
       QMessageBox::warning(this,"提示","mqtt未连接");
       qDebug()<<"订阅信息失败";
   }


}

//连接/断开按钮的槽函数
void Widget::on_conPushButtom_clicked()
{
    if(client->state() != QMqttClient::Connected)
    {
        client->setHostname("192.168.88.134");
        client->setPort(1883);
        client->keepAlive();
        client->cleanSession();
        client->connectToHost();
        qDebug()<<client->state();
    }
    else
    {
        client->disconnectFromHost();
        QMessageBox::information(this,"提示","断开连接");
    }
}
//接收消息的槽函数
void Widget::MQTT_ReceiveMessage(QByteArray qba,QMqttTopicName qtopicname)
{
    QString content = "";
    content = "Receive topic is "+ qtopicname.name()+"\n";
    content = "data is "+QString(qba);

    ui->textBrowser->setText(content);
}

 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtMqtt/qmqttclient.h>
#include <QMessageBox>
#include <QDebug>
#include <QByteArray>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void MQTT_ReceiveMessage(QByteArray qba,QMqttTopicName topic);

private slots:
    void on_pushButton_clicked();

    void on_subPushBottom_clicked();

    void on_conPushButtom_clicked();



private:
    Ui::Widget *ui;
    QMqttClient *client;
};

#endif // WIDGET_H

 5、实验现象

 

 

注意:编译的时候要根据自己选择的lib库进行适合的方式编译,我之前用的debug一直连接不上mqtt,换了方式就ok了。(当然不排除你在使用的时候有其他的原因导致,如出现问题请自行百度)

三、移植第三方库

1、下载第三方源码

下载地址

2、移植

与上述官方库移植步骤一致,我就不一一截图进行解释了,简单描述下步骤。

1、打开src.pro工程文件

2、编译工程文件(会出现错误,根据错误修改一下包含的头文件)

3、根据需要将编译好的lib中的库文件进行拷贝,以及源文件中的src/mqtt中的所有.h文件

4、新建自己的工程,加入include和lib文件,在工程中加入network,以及添加外部库


最后两句如果没有可以自己加上

 3、编写qt代码

ui界面

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "qmqtt.h"
#include <QMessageBox>
#include <QDebug>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void MQTT_RecvMsg(QMQTT::Message msg);

private slots:
    void doConnection();

    void on_conPushBottom_clicked();

    void on_pubPushBottom_clicked();

    void on_subPushBottom_clicked();

private:
    Ui::Widget *ui;
    QMQTT::Client *client;
};

#endif // WIDGET_H

 widget.c

#include "widget.h"
#include "ui_widget.h"

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

    //初始化
    client = new QMQTT::Client;

    //连接连接成功的信号槽函数
    connect(client,SIGNAL(connected()),this,SLOT(doConnection()));
    //连接接收的信号槽函数
    connect(client,SIGNAL(received(QMQTT::Message)),this,SLOT(MQTT_RecvMsg(QMQTT::Message)));

//    QMQTT::Message msg(1,QString("test"),QByteArray("test"));
//    client->publish(msg);
}

Widget::~Widget()
{
    delete ui;
}
//提示连接成功的状态
void Widget::doConnection()
{
    QMessageBox::information(this,"连接状态","连接成功");
    qDebug()<<"连接成功";
}
//连接按钮的槽函数
void Widget::on_conPushBottom_clicked()
{
    client->setHostName("192.168.88.134");
    client->setPort(1883);
    client->keepAlive();
    client->cleanSession();

    if(client->connectionState() != QMQTT::STATE_CONNECTED)
    {
        client->connectToHost();
        qDebug()<<client->connectionState();
        if(client->connectionState() == QMQTT::STATE_CONNECTED)
        {
            qDebug()<<"连接成功";
        }
    }
    else
    {
        client->disconnectFromHost();
        if(client->connectionState() == QMQTT::STATE_DISCONNECTED)
        {
            qDebug()<<"断开连接";
        }
    }

}


//发布按钮的槽函数
void Widget::on_pubPushBottom_clicked()
{
   if(client->connectionState() != QMQTT::STATE_CONNECTED)
   {
       QMessageBox::warning(this,"提示","请先连接服务器");
   }
   else
   {
       QString topic = ui->sendTopicLineEdit->text();
       QString msg = ui->sendmsgLineEdit->text();
       if(topic.isEmpty() || msg.isEmpty())
       {
           QMessageBox::warning(this,"提示","主题/信息不能为空");
       }
       else
       {
           QMQTT::Message sendMsg(1,topic,QByteArray(msg.toLatin1()));
           client->publish(sendMsg);
       }
   }
}
//订阅按钮的槽函数
void Widget::on_subPushBottom_clicked()
{
    if(client->connectionState() != QMQTT::STATE_CONNECTED)
    {
        QMessageBox::warning(this,"提示","请先连接服务器");
    }
    else
    {
        QString topic = ui->recvTopicLineEdit->text();
        if(topic.isEmpty())
        {
            QMessageBox::warning(this,"提示","主题不能为空");
        }
        else
        {
            client->subscribe(topic);
            qDebug()<<"订阅成功,主题为:"+topic;
        }
    }
}
//接收信息的槽函数
void Widget::MQTT_RecvMsg(QMQTT::Message msg)
{
    QString topic = msg.topic();
    QString payload = msg.payload();
    if(topic.isEmpty() || payload.isEmpty())
    {
        qDebug()<<"接收到的主题/信息为空";
    }
    else
    {
        QString send2Text = "";
        send2Text = "主题:" + topic + "消息:" + payload;
        ui->recvMsgTextBrowse->setText(send2Text);
        qDebug()<<"接收成功,内容为:"+send2Text;
    }
}

实验现象与官方库一致,就不展示了

总结

关于官方库和第三方库的函数API就不介绍了,根据需要去查找即可。我这里就简单的使用一下。

本文章涉及到的源码以及mqttfx软件链接如下:

http://链接:https://pan.baidu.com/s/1Zk8FCpTAGVi3fz5I32vzZw?pwd=10th 提取码:10th

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
Qt是一个跨平台的GUI开发框架,通过Qt库可以很方便地实现各种功能。MQTT是一种轻量级的消息发布/订阅协议,用于在物联网设备之间传输消息。因此,我们可以通过Qt实现MQTT客户端来进行消息的发布和订阅。 首先,我们需要在Qt项目中添加MQTT库的支持。可以使用Qt自带的网络模块或者第三方的MQTT库,如QMQTT、Paho等。然后,在Qt的代码中引入相关的头文件,并创建一个MQTT客户端对象。 接下来,我们可以配置MQTT客户端的连接参数,包括服务器地址、端口号、用户名、密码等。可以通过调用MQTT客户端对象的setHostname、setPort、setUsername、setPassword等方法进行设置。 然后,我们需要连接到MQTT服务器。可以调用MQTT客户端对象的connect方法来连接到服务器。连接成功后,可以订阅特定的主题或者取消已有的订阅。可以调用MQTT客户端对象的subscribe和unsubscribe方法进行操作。 在连接成功后,我们可以发送消息到指定的主题。可以调用MQTT客户端对象的publish方法来发送消息,需要指定消息的主题和内容。同时,我们也可以接收来自服务器的消息。可以通过继承MQTT客户端的回调函数,在接收到消息时进行处理。 最后,在使用完MQTT客户端后,记得要正确地关闭连接,以释放资源。可以调用MQTT客户端对象的disconnect方法来关闭连接。 通过以上步骤,我们就可以使用Qt实现一个简单MQTT客户端。通过该客户端,我们可以实现消息的发布和订阅功能,方便地在物联网设备之间进行通信。当然,具体的实现细节还需要根据具体的需求进行适配和调整。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hard-coding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值