QT简单实现MQTT通信

这篇具有很好参考价值的文章主要介绍了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命令)

qt使用mosquitto,qt,开发语言,物联网,ubuntu

qt使用mosquitto,qt,开发语言,物联网,ubuntu

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

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

qt使用mosquitto,qt,开发语言,物联网,ubuntu

将解压好的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

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

qt使用mosquitto,qt,开发语言,物联网,ubuntu

 使用mqttfx进行连接测试

qt使用mosquitto,qt,开发语言,物联网,ubuntu

二、移植MQTT官方库

1.下载官方源码

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

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

qt使用mosquitto,qt,开发语言,物联网,ubuntu

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

qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

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

qt使用mosquitto,qt,开发语言,物联网,ubuntu

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

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

qt使用mosquitto,qt,开发语言,物联网,ubuntu

 3、移植官方库文件

qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

qt使用mosquitto,qt,开发语言,物联网,ubuntu

qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

 4、编写qt代码

ui界面如下

qt使用mosquitto,qt,开发语言,物联网,ubuntu

 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、实验现象

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

 qt使用mosquitto,qt,开发语言,物联网,ubuntu

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

三、移植第三方库

1、下载第三方源码

下载地址

2、移植

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

1、打开src.pro工程文件

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

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

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

qt使用mosquitto,qt,开发语言,物联网,ubuntu


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

 3、编写qt代码

ui界面

qt使用mosquitto,qt,开发语言,物联网,ubuntu

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文章来源地址https://www.toymoban.com/news/detail-785417.html

到了这里,关于QT简单实现MQTT通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt 实现简单的TCP通信

    这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程。 使用QT的网络套接字需要.pro文件中加入一句: 一、客户端 1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创

    2024年02月08日
    浏览(48)
  • 【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译)

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,其最初由IBM开发,现已成为OASIS标准。MQTT协议常用于物联网领域,特别是在传输 低带宽、高延迟、不稳定网络 条件下的数据,例如传感器数据和遥测数据等。 MQTT协议的优点: 轻量级:

    2023年04月12日
    浏览(90)
  • Qt 实现简单的tcp网络通信

    背景: 最近计网要结课了,匆忙之间有个计网实验还没做。 上网这里查查那里查查,随便搞搞 然后在 这篇文章里找到了能够实现的代码 自己想着把它图形化一下,最后在超级棒棒糖的帮助下实现了。 工具头文件tool.h 该头文件用于添加一些要用到的库,直接引用这个库,比

    2024年02月01日
    浏览(42)
  • 基于QT5.14.2的MQTT通信

    一、概述 这个资料写的很好:MQTT协议,终于有人讲清楚了 参考图: 默认的Qt环境是不能使用MQTT的,但Qt官方提供了基于MQTT的封装,需要通过源码进行编译。 可以在下面的链接中获取到: https://github.com/qt/qtmqtt 在dev分支中可以选择MQTT版本,选择最新的下载到本地。 注意一定

    2024年02月10日
    浏览(45)
  • 【MQTT协议】使用Mosquitto实现mqtt协议(二):编写视频帧的发布/订阅服务

    更多内容详见 【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译) MQTT协议中的QoS(Quality of Service)表示消息传输的服务质量等级,它是MQTT协议中非常重要的一个概念。 MQTT协议中定义了三个不同等级的QoS: QoS 0:最多一次(At most once)传输。消息发布者只发送一次消息,不

    2023年04月14日
    浏览(43)
  • 在.NET7中使用MQTTnet简单实现MQTT通信

    一、MQTT简介 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,主要用于物联网设备间的通信。MQTT协议采用客户端/服务器架构,支持发布/订阅模式和点对点模式,具有高效、可靠、灵活等优点。 MQTT协议主要由三个要素构成:发布者(publisher)、代理服务器(

    2023年04月10日
    浏览(36)
  • QT使用MQTT协议连接ONENET云平台:智能家居PC客户端开发笔记-2 项目开发

    这篇文章主要是分享QT智能家居项目的代码 在我看来,QT MQTT的使用主要难点就是对于环境的搭建,在我们把环境搭建完之后,接下来就是传统手艺了,我们只要知道相应的库函数,调用它,就能实现我们所需要的功能了。 所以,在这里我也只是简单的分享一下我写的第一版

    2024年02月16日
    浏览(52)
  • 如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,广泛用于物联网和传感器网络中。Mosquitto是一个流行的开源MQTT代理,可以在Docker中进行配置和部署。本文将详细介绍如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信。 在开始之前,

    2024年02月06日
    浏览(49)
  • C++ Qt开发:QUdpSocket实现组播通信

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用 QUdpSocket 组件实现基于UDP的组播通信。 组播是一种一对多的通信方式

    2024年03月20日
    浏览(34)
  • QT使用MQTT协议连接ONENET云平台:智能家居PC客户端开发笔记-1 环境搭建

    前端时间做了一个项目,要求在PC端使用QT制作一个客户端,用来接收从单片机上传到Onennet的数据,并且还要下发指令。当时弄了好几天,中途遇见了非常多的问题,所以写下这篇文章记录一下,同时分享一下自己的经验。 我的环境:QT 5.12.6 总结下我遇见的难点: 1,环境配

    2024年02月11日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包