mqtt服务器搭建与qt下的mqtt客户端实现

这篇具有很好参考价值的文章主要介绍了mqtt服务器搭建与qt下的mqtt客户端实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、mqtt介绍

  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

  MQTT有三种角色的存在:
      Broker代理:很多人理解为中间件,当然可以这样子认为。他就是一个中间件。用于处理信息并发送到相应的订阅者。
      发布者:用于发布信息到代理上面。注意:发布者也可以是订阅者。
      订阅者:就是用于接受信息的客户端。

  MQTT使用TCP/IP提供网络连接,主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN

  三种消息发布服务质量:
    “至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
    “至少一次”,确保消息到达,但消息重复可能会发生。
    “只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次

  MQTT协议中的方法:
    Connect:等待与服务器建立连接
    Disconnect:等待MQTT客户端完成所作的工作,并于服务器断开TCP/IP会话
    Subscribe:等待完成订阅
    UnSubscribe:等待服务器取消客户端的一个活多个和topics订阅
    Publish:MQTT客户端发送消息请求,发送完成后返回应用程序线程

  优点:
    低开销、低带宽占用,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

二、在windows上安装mqtt服务器:

1.mosquitto介绍

  Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件,提供轻量级的、支持可订阅/可发布的消息推送模式,是设备与设备之间的短消息通信变得简单,广泛应用于低功耗传感器、手机(app消息推送是场景之一)、嵌入式电脑、微型控制器等移动设备。

2.下载mosquitto

下载地址:https://mosquitto.org/download/
mqtt客户端设计,qt,服务器,qt,网络

3.安装mosquitto

mqtt客户端设计,qt,服务器,qt,网络
mqtt客户端设计,qt,服务器,qt,网络

4.配置文件修改

4.1 mosquitto.conf文件修改

mqtt客户端设计,qt,服务器,qt,网络

4.2 以管理员身份打开Windows PowerShell, 进行用户密码配置

mqtt客户端设计,qt,服务器,qt,网络

4.3 重启mosquitto broker服务

mqtt客户端设计,qt,服务器,qt,网络

4.4 测试服务器

mqtt客户端设计,qt,服务器,qt,网络

三、编译qtmqtt和创建mqtt客户端工程

Qt在5.10版本开始支持mqtt,但是也没有集成到安装包里面,需要自己下载编译

1.先下载安装Perl (解决编译qtmqtt报perl错误)

下载地址:https://www.perl.org/get.html
ActivePerl_x64_5.24.1.2402.exe

2.下载安装qtmqtt

下载地址:https://github.com/emqx/qmqtt

打开工程文件,选择src执行qmake,然后点击构建即可生成相应的库文件
mqtt客户端设计,qt,服务器,qt,网络

3.创建myMqttDemo客户端工程

mqtt客户端设计,qt,服务器,qt,网络
mqtt客户端设计,qt,服务器,qt,网络

我的demo工程下载地址:https://download.csdn.net/download/linyibin_123/87280629

4.拷贝链接库与头文件到demo工程指定位置

4.1 拷贝头文件:

mqtt客户端设计,qt,服务器,qt,网络

4.2 拷贝库文件:

mqtt客户端设计,qt,服务器,qt,网络
mqtt客户端设计,qt,服务器,qt,网络

4.3 demo工程引用库文件:

mqtt客户端设计,qt,服务器,qt,网络
mqtt客户端设计,qt,服务器,qt,网络

四、mqtt客户端demo工程代码

mqttClient.h

#ifndef MQTTCLIENT_H
#define MQTTCLIENT_H

#include <QObject>
#include "qmqtt.h"

class mqttClient : public QObject
{
    Q_OBJECT
public:
    mqttClient();

    static mqttClient& getInstance();

    void init(QString sIp, quint16 nPort, QString sClientId, QString sUser, QString sPwd);
private:
    QMQTT::Client *m_pClient;

signals:
    void sig_result_connect();
    void sig_result_disconnect();
    void sig_result_dataReceived(QMQTT::Message message);

public slots:
    void slot_connect();
    void slot_disconnect();
    void slot_publish(QString sTopic, QString sPayload);
    void slot_subscribe(QString sTopic);
    void slot_unSubscribe(QString sTopic);

    void on_dataReceived(QMQTT::Message message);

};

#endif // MQTTCLIENT_H

mqttClient.cpp

#include "mqttclient.h"

mqttClient::mqttClient()
{
    m_pClient = nullptr;
}

mqttClient &mqttClient::getInstance()
{
    static mqttClient s_obj;
    return s_obj;
}

void mqttClient::init(QString sIp, quint16 nPort, QString sClientId, QString sUser, QString sPwd)
{
    if(m_pClient)
    {
        delete m_pClient;
        m_pClient = nullptr;
    }
    m_pClient = new QMQTT::Client(QHostAddress(sIp), nPort);
    if(m_pClient)
    {
        qDebug() << "m_pClient Create Success.";
        m_pClient->setClientId(sClientId);
        m_pClient->setUsername(sUser);
        m_pClient->setPassword(sPwd.toLatin1());
        m_pClient->setKeepAlive(60);

        connect(m_pClient, &QMQTT::Client::connected, this, &mqttClient::sig_result_connect);
        connect(m_pClient, &QMQTT::Client::disconnected, this, &mqttClient::sig_result_disconnect);
        connect(m_pClient, SIGNAL(received(QMQTT::Message)), this, SLOT(on_dataReceived(QMQTT::Message)));
    }
}

void mqttClient::slot_connect()
{
    qDebug() << "connect 000";
    if(m_pClient)
    {
        if(!m_pClient->isConnectedToHost())
        {
            qDebug() << "connect 111";
            m_pClient->connectToHost();
        }
    }
}

void mqttClient::slot_disconnect()
{
    qDebug() << "disconnect";
    if(m_pClient->isConnectedToHost())
    {
        m_pClient->disconnectFromHost();
    }
}

void mqttClient::slot_publish(QString sTopic, QString sPayload)
{
    if(sTopic.isEmpty() || sPayload.isEmpty())
    {
        qDebug() << "sTopic or sPayload is empty";
        return;
    }
    QMQTT::Message message(136, sTopic, sPayload.toUtf8());
    m_pClient->publish(message);
}

void mqttClient::slot_subscribe(QString sTopic)
{
    if(sTopic.isEmpty())
    {
        qDebug() << "sTopic is empty";
        return;
    }
    m_pClient->subscribe(sTopic);
}

void mqttClient::slot_unSubscribe(QString sTopic)
{
    if(sTopic.isEmpty())
    {
        qDebug() << "sTopic is empty";
        return;
    }
    m_pClient->unsubscribe(sTopic);
}

void mqttClient::on_dataReceived(QMQTT::Message message)
{
    qDebug() << "on_dataReceived";
    emit sig_result_dataReceived(message);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mqttclient.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

signals:
    void sig_btn_connect();
    void sig_btn_disconnect();
    void sig_btn_publish(QString sTopic, QString sPayload);
    void sig_btn_subscribe(QString sTopic);
    void sig_btn_unSubscribe(QString sTopic);

private slots:
    void on_pushButton_Connect_clicked();
    void on_pushButton_Publish_clicked();
    void on_pushButton_Subscribe_clicked();
    void on_pushButton_UnScribe_clicked();

    void slot_result_connect();
    void slot_result_disconnect();
    void slot_result_dataReceived(QMQTT::Message message);


    void on_pushButton_DisConnect_clicked();

private:
    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this, SIGNAL(sig_btn_connect()),
            &mqttClient::getInstance(), SLOT(slot_connect()));
    connect(this, SIGNAL(sig_btn_disconnect()),
            &mqttClient::getInstance(), SLOT(slot_disconnect()));
    connect(this, SIGNAL(sig_btn_publish(QString, QString)),
            &mqttClient::getInstance(), SLOT(slot_publish(QString, QString)));
    connect(this, SIGNAL(sig_btn_subscribe(QString)),
            &mqttClient::getInstance(), SLOT(slot_subscribe(QString)));
    connect(this, SIGNAL(sig_btn_unSubscribe(QString)),
            &mqttClient::getInstance(), SLOT(slot_unSubscribe(QString)));

    connect(&mqttClient::getInstance(), SIGNAL(sig_result_connect()),
            this, SLOT(slot_result_connect()));
    connect(&mqttClient::getInstance(), SIGNAL(sig_result_disconnect()),
            this, SLOT(slot_result_disconnect()));
    connect(&mqttClient::getInstance(), SIGNAL(sig_result_dataReceived(QMQTT::Message)),
            this, SLOT(slot_result_dataReceived(QMQTT::Message)));
}

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

void MainWindow::on_pushButton_Connect_clicked()
{
    QString sIp = ui->lineEdit_IP->text().trimmed();
    quint16 nPort = (quint16)ui->lineEdit_Port->text().toInt();
    QString sClientId = ui->lineEdit_ClientId->text().trimmed();
    QString sUser = ui->lineEdit_User->text().trimmed();
    QString sPwd = ui->lineEdit_Password->text().trimmed();
    mqttClient::getInstance().init(sIp, nPort, sClientId, sUser, sPwd);

    emit sig_btn_connect();
}

void MainWindow::on_pushButton_Publish_clicked()
{
    QString sTopic = ui->lineEdit_Topic->text().trimmed();
    QString sPayload = ui->lineEdit_Message->text().trimmed();

    emit sig_btn_publish(sTopic, sPayload);
}

void MainWindow::on_pushButton_Subscribe_clicked()
{
    QString sTopic = ui->lineEdit_Topic_2->text().trimmed();
    emit sig_btn_subscribe(sTopic);
}

void MainWindow::on_pushButton_UnScribe_clicked()
{
    QString sTopic = ui->lineEdit_Topic_2->text().trimmed();
    emit sig_btn_unSubscribe(sTopic);
}

void MainWindow::slot_result_connect()
{
    qDebug() << "result:Connected";
    ui->label_Status->setText("Connected");
}

void MainWindow::slot_result_disconnect()
{
    qDebug() << "result:Unconnected";
    ui->label_Status->setText("Unconnected");
}

void MainWindow::slot_result_dataReceived(QMQTT::Message message)
{
    QString sMes = QString(message.id()) + " " + QString(message.qos()) + QString(message.topic()) + message.payload() + "\n";
    ui->textEdit_Log->append(sMes);

}

void MainWindow::on_pushButton_DisConnect_clicked()
{
    emit sig_btn_disconnect();
}

五、客户端与服务器连接调试结果

开启Windows PowerShell,执行服务和订阅发布操作,开启程序连接服务器,并执行订阅和发布操作,双方都可以收到对方发布的消息。

mqtt客户端设计,qt,服务器,qt,网络
mqtt客户端设计,qt,服务器,qt,网络文章来源地址https://www.toymoban.com/news/detail-741027.html

到了这里,关于mqtt服务器搭建与qt下的mqtt客户端实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • QT实现TCP通信(服务器与客户端搭建)

    创建一个QTcpServer类对象,该类对象就是一个服务器 调用listen函数将该对象设置为被动监听状态,监听时,可以监听指定的ip地址,也可以监听所有主机地址,可以通过指定端口号,也可以让服务器自动选择 当有客户端发来连接请求时,该服务器会自动发射一个newConnection信号

    2024年02月09日
    浏览(46)
  • MQTT协议-发布消息(服务器向客户端发送)

    发布消息报文组成:https://blog.csdn.net/weixin_46251230/article/details/129414158 在了解了发布信息的PUBLISH报文后,就可以分析出阿里云服务器向本地客户端发送的报文数据了 实验前需要在阿里云创建产品和设备,并创建简单的温度和湿度物模型:https://blog.csdn.net/weixin_46251230/article/de

    2024年02月06日
    浏览(48)
  • C#MQTT编程07--MQTT服务器和客户端(wpf版)

    上篇完成了winform版的mqtt服务器和客户端,实现了订阅和发布,效果666,长这样  这节要做的wpf版,长这样,效果也是帅BBBB帅,wpf技术是cs程序软件的福音。  wpf的基础知识和案例项目可以看我的另一个专栏系列文章,这里直接干搞,开发环境依然是vs2022,.netframework 4.8,mq

    2024年01月17日
    浏览(61)
  • 手机、电脑mqtt客户端通过腾讯云服务器远程连接ESP32

            本文将实现:         1、esp32与腾讯云物联网服务器通过mqtt协议通信         2、电脑和手机客户端通过mqtt与腾讯云相通信         3、腾讯云服务器内部消息转发,将手机、电脑发布的主题转发给esp32订阅,实现手机、电脑与esp32的远程通信。      

    2024年02月11日
    浏览(50)
  • WPF真入门教程28--项目案例--MQTT服务器和客户端

    这个案例还是布局加视图模型,样式应用,业务逻辑,该项目是一个mqtt服务器和客户端的通信工具,这里不去分析mqtt的通信原理,关注在于wpf技能的应用,能够掌握这个例子,离项目开发也差不多了,只是没有跟db打交道,本项目重点在于理解mvvm模式,开发环境依然是vs20

    2024年01月17日
    浏览(47)
  • 了解多人游戏下的客户端与服务器体系结构

    直连模式下,选择一个玩家充当服务器(房主)。如果游戏出现不同步,那么均按房主的世界来,玩家1可以作弊修改其游戏来影响其他玩家的世界 针对两个玩家来说,直连连接质量更好,延迟小 如果玩家数量很多,不同玩家间的通信则需要靠房主为中介,那通信质量与房主

    2024年02月12日
    浏览(31)
  • Qt 服务器/客户端TCP通讯

    最近需要用到TCP/IP通讯,这边就先找个简单的例程学习一下。Qt的TCP通讯编程可以使用QtNetwork模块,QtNetwork模块提供的类能够创建基于TCP/IP的客户端与服务端应用程序,一般会使用QTcpSocket、QTcpServer类 网络通信方式主要有两种:TCP与UDP。以下拷贝网络上总结两者之间的区别:

    2023年04月26日
    浏览(62)
  • QT实现tcp服务器客户端

    2024年02月07日
    浏览(46)
  • Qt实现客户端与服务器消息发送

    里用Qt来简单设计实现一个场景,即: (1)两端:服务器QtServer和客户端QtClient (2)功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度。 环境:VS20013 + Qt5.11.2 + Qt设计师 先看效果: 客户端与服务器的基本概念不说了,关于TCP通信的三次握

    2024年02月11日
    浏览(44)
  • Qt多线程TCP服务器客户端传输文件

    TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。 TCP提供可靠交付的服务。通过TCP 连接传送的数据,无差错、不丢失、不

    2024年02月13日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包