iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >mqtt服务器搭建与qt下的mqtt客户端实现
  • 525
分享到

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

服务器qt网络 2023-08-31 09:08:55 525人浏览 泡泡鱼
摘要

一、MQtt介绍   MQtT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议。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/
在这里插入图片描述

3.安装mosquitto

在这里插入图片描述
在这里插入图片描述

4.配置文件修改

4.1 mosquitto.conf文件修改

在这里插入图片描述

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

在这里插入图片描述

4.3 重启mosquitto broker服务

在这里插入图片描述

4.4 测试服务器

在这里插入图片描述

三、编译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,然后点击构建即可生成相应的库文件
在这里插入图片描述

3.创建myMqttDemo客户端工程

在这里插入图片描述
在这里插入图片描述

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

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

4.1 拷贝头文件:

在这里插入图片描述

4.2 拷贝库文件:

在这里插入图片描述
在这里插入图片描述

4.3 demo工程引用库文件:

在这里插入图片描述
在这里插入图片描述

四、mqtt客户端demo工程代码

mqttClient.h

#ifndef MQTTCLIENT_H#define MQTTCLIENT_H#include #include "qmqtt.h"class mqttClient : public QObject{    Q_OBJECTpublic:    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 #include "mqttclient.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    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,执行服务和订阅发布操作,开启程序连接服务器,并执行订阅和发布操作,双方都可以收到对方发布的消息。

在这里插入图片描述
在这里插入图片描述

来源地址:https://blog.csdn.net/linyibin_123/article/details/128315580

--结束END--

本文标题: mqtt服务器搭建与qt下的mqtt客户端实现

本文链接: https://www.lsjlt.com/news/385136.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mqtt服务器搭建与qt下的mqtt客户端实现
    一、mqtt介绍   MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简...
    99+
    2023-08-31
    服务器 qt 网络
  • C#实现MQTT服务端与客户端通讯功能
    关于MQTT MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设...
    99+
    2024-04-02
  • Windows下搭建MQTT服务器
    Windows下搭建MQTT服务器 1、MQTT服务器软件筛选2、MQTT服务器软件mosquitto下载3、修改mosquitto配置,并启动mosquitto服务4、利用mosquitto...
    99+
    2023-09-12
    windows 服务器 物联网
  • C#如何实现MQTT服务端与客户端通讯功能
    这期内容当中小编将会给大家带来有关C#如何实现MQTT服务端与客户端通讯功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。关于MQTTMQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 2...
    99+
    2023-06-29
  • QT实现TCP通信(服务器与客户端搭建)
    一、TCP通信框架 二、QT中的服务器操作 创建一个QTcpServer类对象,该类对象就是一个服务器调用listen函数将该对象设置为被动监听状态,监听时,可以监听指定的ip地址,也可以监听所有主机地址,可以通过指定端口号,也可以让服...
    99+
    2023-10-21
    服务器 tcp/ip 网络
  • 教你在windows下搭建MQTT服务器的方法
    目录一、下载mosquitto二、配置mosquitto1. 安装路径打开命令行界面2. 设置user及password3. 配置文件检查4. 设置端口5. 订阅者6. 发布者7. ...
    99+
    2024-04-02
  • MQTT协议-发布消息(服务器向客户端发送)
    MQTT协议-发布消息(服务器向客户端发送) 发布消息报文组成:https://blog.csdn.net/weixin_46251230/article/details/129414158 在了解了...
    99+
    2023-09-22
    阿里云 MQTT协议
  • 如何使用PHP实现基于MQTT的客户端(代码示例)
    MQTT是一种轻量级的消息传输协议,它是基于发布/订阅模式的。MQTT提供了一种低延迟、可靠的连接,特别适用于小型传感器和单片机等硬件设备的通信。在本文中,我们将介绍如何使用PHP实现基于MQTT的客户端代码。MQTT协议简介在开始编写代码...
    99+
    2023-05-14
  • 【JavaEE初阶】 TCP服务器与客户端的搭建
    文章目录 🌲前言🌴ServerSocket API🎄Socket API🍀TCP中的长短连接🎍建立TCP回显客户端与服务器🚩TCP搭建服...
    99+
    2023-12-22
    服务器 java-ee java 开发语言 网络 客户端
  • 使用Docker搭建MQTT服务器的过程详解
    1. 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6 2. 运行镜像 –n...
    99+
    2024-04-02
  • vue下怎么使用mqtt服务端实现即时通讯
    这篇文章主要介绍“vue下怎么使用mqtt服务端实现即时通讯”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue下怎么使用mqtt服务端实现即时通讯”文章能帮助大家解决问题。MQTT协议MQTT(M...
    99+
    2023-07-04
  • Python实现的mqtt客户端工具分享,小巧且超轻量级(python+tkinter+paho.mqtt)
    mqtt协议调试时需要个客户端工具,但网上找的体积包都很大,都不够小巧和便携。于是趁周末时间用python搞出来了个客户端工具,使用python+tinker+paho.mqtt实现。源码量很少但功能不弱,相当的轻量级。分享给有需要的小...
    99+
    2023-09-24
    python mqtt mqtt客户端工具 tkinter
  • python客户端与服务器端通信怎么实现
    Python客户端与服务器端通信可以通过套接字(socket)实现。1. 服务器端首先需要创建一个套接字,并绑定到指定的IP地址和端...
    99+
    2023-09-08
    python 服务器
  • Android socket实现原理详解 服务端和客户端如何搭建
    本文实例为大家分享了Android socket的实现原理,供大家参考,具体内容如下Socket套接字 是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。socket实现的原理机制:通信的两端都有Socket...
    99+
    2023-05-30
    android socket roi
  • 如何实现C#服务端与客户端连接
    今天就跟大家聊聊有关如何实现C#服务端与客户端连接,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#服务端与客户端连接实现的时间性:当服务器开始对端口侦听之后,便可以创建客户端与它建...
    99+
    2023-06-17
  • 如何使用java实现客户端与服务器
    小编给大家分享一下如何使用java实现客户端与服务器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1. web开发;2....
    99+
    2023-06-14
  • python3中实现客户端与服务端交互发
    在python3中实现客户端与服务端程序交互,从客户端发送文件到服务端客户端代码:client.py#!/usr/bin/env python #_*_ encoding=utf-8 _*_ import socket,sys,os ...
    99+
    2023-01-31
    服务端 客户端
  • C#与西门子PLC1500的ModbusTcp服务器通信4--搭建ModbusTcp客户端
     1、客户端选择 客户端可以是一个程序或一个设备,这里我以C#WINFORM程序来实现客户机与PLC的Modbustcp服务器通信,开发环境是VS2019,.NET Framework版本是4.7.2 2、创建winform程序  创...
    99+
    2023-09-16
    c# 服务器 开发语言 tcp client modbus tcp
  • C#中怎么实现服务端与客户端通信
    C#中怎么实现服务端与客户端通信,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#服务端与客户端通信实现实例:TcpClient client;&nb...
    99+
    2023-06-17
  • C#中如何实现服务端与客户端通信
    这篇文章将为大家详细讲解有关C#中如何实现服务端与客户端通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#服务端与客户端通信实现实例:class Server {&n...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作