> 技术文档 > 手把手教你搭建本地MQTT服务器,并通过QT连接

手把手教你搭建本地MQTT服务器,并通过QT连接


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 目录

    文章目录

    前言

    一、本地MQTT服务器搭建

    1.通过EMQX搭建MQTT服务器

    ①EMQX下载解压

    ②打开Windows终端

    ③启动服务器

    2.通过浏览器访问服务器并进行配置

    ①浏览器打开服务器

    ②创建客户端认证

    ③创建用户(这里创建两个用户)

    3.使用MQTTX对本地服务器进行调试

    ①下载MQTTX

    ②安装MQTTX

    ③使用MQTTX进行调试

    二、QT连接MQTT服务器

    1.生成mqtt库文件

    ①源码下载并打开工程

    ②切换qt编译模式并构建

    ③添加mqtt头文件

    ④编译生成

    ⑤生成的库文件

    ⑥打包库文件

    2.导入生成的lib文件

    ①复制库文件

    ②导入库文件

    3.QT代码的实现

    总结



前言

        写这篇文章的目的,本人有个项目需要用到MQTT服务器,创建一个主题,stm32、qt上位机、微信小程序订阅主题进行数据互传和对stm32的控制等。本来是使用阿里云飞燕物联网平台生成的设备,用的也是mqtt服务器,但是不能添加自定义的topic,导致无法通过不同的设备连接到相同服务器同一个主题。如果只有stm32连接阿里云的话,阿里云提供的内容开发起来还是很快的,还提供了云智能APP,可以对stm32进行控制。由于添加了qt上位机,就不用阿里云了,自然而然不能用云智能APP,就用简单的微信小程序代替了。

一、本地MQTT服务器搭建

1.通过EMQX搭建MQTT服务器

①EMQX下载解压

从官网下载EMQX压缩包 EMQX 概览,并解压(尽量不包含中文路径

②打开Windows终端

打开解压文件中的bin文件夹,然后输入cmd+回车,打开终端(我这里改了文件名)

③启动服务器

终端中输入命令 .\\emqx start ,启动服务器,每次重启电脑都要启动一次服务器才能正常使用

2.通过浏览器访问服务器并进行配置

①浏览器打开服务器

打开浏览器,输入网址http://localhost:18083/(或者http://127.0.0.1:18083/)

默认账号:admin

默认密码:public

②创建客户端认证

认证方式选择最常用的用户名、密码、代理ID认证(username、password、client id),(阿里云物联网平台也是这种方式)

数据源选择内置数据库

配置参数保持默认即可

③创建用户

创建认证成功后,点击用户管理

点击右边的绿色+号,添加用户

输入自己想要创建的账号和密码,(后面MQTTX调试要用到

到这里服务器的配置就算完成了

3.使用MQTTX对本地服务器进行调试

①下载MQTTX

网址MQTTX 下载,下载适合自己电脑版本的MQTTX

②安装MQTTX

下载完成后双击MQTTX-Setup-1.11.1-x64.exe进行安装

这两个选项任意选择,(建议安装在一个非中文的路径下)

③使用MQTTX进行调试

设置简体中文

创建两个不同名称但是服务器地址相同的客户端

服务器地址:可以是本地的地址127.0.0.1:1,也可以是其他MQTT服务器的地址(如阿里云)

端口1883:常用于本地开发测试(端口还有:8883、8080/8081/443可自行了解)

client id:自动生成

用户名和密码是上面服务器配置的时候生成的用户名和密码

用户名、密码、服务器地址和端口号要记住,qt连接时候要用到

新建的两个连接添加相同的主题进行订阅,test1向主题发布数据,test2通过对主题的订阅接收数据

本地服务器的搭建个调试就到这里了

二、QT连接MQTT服务器

1.生成mqtt库文件

①源码下载并打开工程

网址:https://github.com/qt/qtmqtt,这里下载的5.14版本的,下载完成后解压打开工程

②切换qt编译模式并构建

从仿真模式(debug)替换成发行模式(release)

右击src文件夹,先执行qmake,在构建“src”

③添加mqtt头文件

由于QT编译的时候是在其安装目录下搜索文件的,所以要把mqtt的头文件添加进去。在QT安装目下 的include文件夹下创建 QtMqtt文件夹。例如: QT\\5.14.2\\mingw73_32\\include\\QtMqtt,并把qtmqtt-5.14\\qtmqtt-5.14\\src\\mqtt下的所有.h头文件添加到QtMqtt文件夹

④编译生成

⑤生成的库文件

参考路径:qtmqtt-5.14\\build-qtmqtt-Desktop_Qt_5_14_2_MinGW_32_bit-Release\\lib

⑥打包库文件

新建一个文件夹qtmqtt_lib

2.导入生成的lib文件

①复制库文件

将qtmqtt_lib放到QT工程目录下,与pro文件同路径

②导入库文件

右击,选择添加库

选择外部库

然后点击下一步,点击完成,这样MQTT第三方库就算导入成功了

3.QT代码的实现

mqtt_smarthome.cpp

#include \"mqtt_smarthome.h\"#include \"ui_mqtt_smarthome.h\"Mqtt_SmartHome::Mqtt_SmartHome(QWidget *parent) : QMainWindow(parent) , ui(new Ui::Mqtt_SmartHome){ ui->setupUi(this); mqtt_Init(); this->connectToBroker();}Mqtt_SmartHome::~Mqtt_SmartHome(){ delete ui;}void Mqtt_SmartHome::mqtt_Init(){ client = new QMqttClient(this); connect(client, &QMqttClient::messageReceived, this, &Mqtt_SmartHome::doMQTTReceivedMessageSlot); connect(client, &QMqttClient::connected, this, &Mqtt_SmartHome::doMQTTConnectedSlot); connect(client, &QMqttClient::errorChanged, this, &Mqtt_SmartHome::doMQTTErrorChangedSlot); connectToBroker();//连接mqtt服务器}void Mqtt_SmartHome::connectToBroker(){ client->setHostname(\"localhost\");//本地服务器地址 client->setPort(1883);//端口 client->setClientId(\"iamqt\");//id,每个客户端的id都不一样 //服务器的用户名和密码先去配置过了 client->setUsername(\"SmartHome\");//用户名 client->setPassword(\"SmartHome\");//密码 client->connectToHost();}void Mqtt_SmartHome::subscribeToTopic(const QString &topic){ if (client->state() == QMqttClient::Connected) { auto subscription = client->subscribe(QMqttTopicFilter(topic)); if (!subscription) { // 处理订阅失败的情况 qDebug() <state() == QMqttClient::Connected) { client->publish(QMqttTopicName(topic), message.toUtf8()); }}void Mqtt_SmartHome::doMQTTReceivedMessageSlot(const QByteArray &message, const QMqttTopicName &topic){ // 处理接收到的消息 qDebug() << \"Received message:\" << message << \"from topic:\" << topic.name();}void Mqtt_SmartHome::doMQTTConnectedSlot(){ // 连接成功后可以进行订阅操作 qDebug() << \"订阅成功\"; subscribeToTopic(\"test/data\");}void Mqtt_SmartHome::doMQTTErrorChangedSlot(QMqttClient::ClientError error){ qDebug() << \"MQTT连接错误:\" << error;}

mqtt_smarthome.h

#ifndef MQTT_SMARTHOME_H#define MQTT_SMARTHOME_H#include #include #include QT_BEGIN_NAMESPACEnamespace Ui { class Mqtt_SmartHome; }QT_END_NAMESPACEclass Mqtt_SmartHome : public QMainWindow{ Q_OBJECTpublic: Mqtt_SmartHome(QWidget *parent = nullptr); ~Mqtt_SmartHome(); void mqtt_Init(); void connectToBroker(); void subscribeToTopic(const QString &topic); void publishMessage(const QString &topic, const QString &message);private slots: void doMQTTReceivedMessageSlot(const QByteArray &message, const QMqttTopicName &topic); void doMQTTConnectedSlot(); void doMQTTErrorChangedSlot(QMqttClient::ClientError error);private: Ui::Mqtt_SmartHome *ui; QMqttClient *client;};#endif // MQTT_SMARTHOME_H

mqtt_smarthome.pro,这里主要添加了  QT += network

QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use# any Qt feature that has been marked deprecated (the exact warnings# depend on your compiler). Please consult the documentation of the# deprecated API in order to know how to port your code away from it.DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.# In order to do so, uncomment the following line.# You can also select to disable deprecated APIs only up to a certain version of Qt.#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \\ main.cpp \\ mqtt_smarthome.cppHEADERS += \\ mqtt_smarthome.hFORMS += \\ mqtt_smarthome.ui# Default rules for deployment.qnx: target.path = /tmp/$${TARGET}/binelse: unix:!android: target.path = /opt/$${TARGET}/bin!isEmpty(target.path): INSTALLS += targetwin32: LIBS += -L$$PWD/qtmqtt_lib/lib/ -lQt5MqttINCLUDEPATH += $$PWD/qtmqtt_lib/includeDEPENDPATH += $$PWD/qtmqtt_lib/includewin32:!win32-g++: PRE_TARGETDEPS += $$PWD/qtmqtt_lib/lib/Qt5Mqtt.libelse:win32-g++: PRE_TARGETDEPS += $$PWD/qtmqtt_lib/lib/libQt5Mqtt.a

运行效果


总结

单纯记录下学习