Qt实现mqtt客户端和mqtt服务器搭建

本文详细介绍了如何在Ubuntu18.04系统上,使用Qt5.13.2通过qtmqtt库编译源码并创建MQTT客户端测试程序。同时,文中提到了Windows上部署mosquitto以及Linux上部署EMQXMQTT服务器的方法,包括安装步骤和验证服务器运行的步骤。
摘要由CSDN通过智能技术生成
  1. 下载qtmqtt源码

下载地址:https://github.com/qt/qtmqtt,选择跟自己使用Qt版本一致的分支

  1. 使用qmake编译qtmqtt源码

编译环境:Ubuntu1804+Qt5.13.2


cd qtmqtt
mkdir build && cd build
qmake .. (此步执行报错的话请选用qmake的绝对路径)
make 
make install

3. 编写Qt客户端测试程序

  1. pro 文件增加


QT  +=  mqtt
  1. .h文件主要代码


#include <QMqttClient>

    void initMqttClinet();

private slots:
    void on_pBtn_Connect_clicked();

    void stateChangedSlot(QMqttClient::ClientState state);

    void errorChangedSlot(QMqttClient::ClientError error);

    void messageReceivedSlot(const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName());
    
    void on_pBtn_Publish_clicked();

    void on_pBtn_Subscribe_clicked();

    void on_pBtn_Ping_clicked();

private:
    QMqttClient* mqttClient;
  1. .cpp文件主要代码


void MainWindow::initMqttClinet()
{
    mqttClient = new QMqttClient();
    mqttClient->setHostname(ui->lineEditHost->text().trimmed());
    mqttClient->setPort(1883);
    mqttClient->setProtocolVersion(QMqttClient::MQTT_3_1_1);
    mqttClient->setClientId(ui->lineEditClientId->text().trimmed());
    mqttClient->setUsername("admin");
    mqttClient->setPassword("password");

    connect(mqttClient, &QMqttClient::stateChanged, this, &MainWindow::stateChangedSlot);
    connect(mqttClient, &QMqttClient::errorChanged, this, &MainWindow::errorChangedSlot);
    connect(mqttClient, &QMqttClient::messageReceived, this, &MainWindow::messageReceivedSlot);

    mqttClient->connectToHost();
}


void MainWindow::on_pBtn_Connect_clicked()
{
    initMqttClinet();
}

void MainWindow::stateChangedSlot(QMqttClient::ClientState state)
{
    QString info("");
    if(state == 0)
    {
        info = QString("mqtt disconnected. error:%1" ).arg(mqttClient->error());
    }
    else if(state == 1)
    {
        info = "mqtt connecting";
    }
    else if(state == 2)
    {
        info = QString("mqtt connected. hostname:%1").arg(mqttClient->hostname());
    }
    ui->editLog->insertPlainText(QDateTime::currentDateTime().toString()
                                 + QString("state:%1 info:%2\n").arg(state).arg(info));
}

void MainWindow::errorChangedSlot(QMqttClient::ClientError error)
{
    qDebug()<<__FILE__<<__LINE__<<error;

    ui->editLog->insertPlainText(QString("error:%1").arg(error));
}

void MainWindow::messageReceivedSlot(const QByteArray &message, const QMqttTopicName &topic)
{
    qDebug()<<__FILE__<<__LINE__<<message<<topic;

    const QString content = QDateTime::currentDateTime().toString()
                + QLatin1String(" Received Topic: ")
                + topic.name()
                + QLatin1String(" Message: ")
                + message
                + QLatin1Char('\n');
    ui->editLog->insertPlainText(content);
}

void MainWindow::on_pBtn_Publish_clicked() // 发布
{
    if(mqttClient == nullptr)
    {
        ui->editLog->insertPlainText(QString("[Error] Before publish, Please init mqtt client.\n"));
        return;
    }
    if (mqttClient->publish(ui->lineEditTopic->text(),ui->lineEditMessage->text().toUtf8()) == -1)
    {
        ui->editLog->insertPlainText(QString("[Error] Could not publish message.\n"));
    }
}

void MainWindow::on_pBtn_Subscribe_clicked() // 订阅
{
    if(mqttClient == nullptr)
    {
        ui->editLog->insertPlainText(QString("[Error]  Before subscribe, Please init mqtt client.\n"));
        return;
    }
    auto subscription = mqttClient->subscribe(ui->lineEditTopic->text());
    if (!subscription) {
        ui->editLog->insertPlainText(QString("[Error] Could not subscribe. Is there a valid connection?\n"));
        return;
    }
}

void MainWindow::on_pBtn_Ping_clicked()
{
    bool res = mqttClient->requestPing();
    ui->editLog->insertPlainText(QString("[RESULT] PING? %1\n").arg(res));
}
  1. 界面截图

4.部署mqtt服务端

  1. Windows部署mosquitto
  1. 下载地址:Download | Eclipse Mosquitto

  1. 参考连接:mqtt服务器搭建与qt下的mqtt客户端实现_qt连接mqtt_浅笑一斤的博客-CSDN博客

  1. Linux部署EMQX
  1. 下载地址:免费下载、试用 EMQ 产品

  1. 安装方法如界面下图所示

  1. 打开浏览器测试服务端

输入url:http://127.0.0.1:18083打开界面如下图所示则表示服务器端已启动

初次登录时,默认用户名为admin,密码为public;需要根据提示自行设置密码。

1883(暴露给外部的MQTT服务端口),18083(服务器控制面板端口)

MQTT(Message Queue Telemetry Transport)是一种轻量级的消息传输协议,适用于物联网设备与服务器之间的数据传输,具有低带宽、低功耗、高可靠性等特点。Qt是一种跨平台的C++图形界面应用程序开发框架,具有简单易学、代码简洁、易于维护等优点,可以用来实现MQTT客户端。下面将介绍如何在Qt实现MQTT客户端。 1.安装MQTTQt没有自带MQTT库,需要手动安装第三方库。可以选择paho.mqtt.c或eclipse.mosquitto等开源MQTT库,这里以paho.mqtt.c为例。下载并解压paho.mqtt.c库,将其包含到Qt项目中,同时在.pro文件中添加如下语句: INCLUDEPATH += $$PWD/paho.mqtt.c/include LIBS += -L$$PWD/paho.mqtt.c/build/output -lpaho-mqtt3as-static 2.实现MQTT客户端Qt实现MQTT客户端,需要用到MQTT库中的头文件和API函数。下面以订阅主题为例,展示如何在Qt实现MQTT客户端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #define ADDRESS "tcp://localhost:1883" #define CLIENTID "ExampleClientSub" #define TOPIC "sample/topic" #define QOS 1 #define TIMEOUT 10000L volatile MQTTClient_deliveryToken deliveredtoken; void delivered(void *context, MQTTClient_deliveryToken dt) { printf("Message with token value %d delivery confirmed\n", dt); deliveredtoken = dt; } int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { printf("Message arrived\n"); printf(" topic: %s\n", topicName); printf(" message: %.*s\n", message->payloadlen, (char*)message->payload); MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } void connlost(void *context, char *cause) { printf("\nConnection lost\n"); printf(" cause: %s\n", cause); } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; int rc; MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered); if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code %d\n", rc); exit(EXIT_FAILURE); } MQTTClient_subscribe(client, TOPIC, QOS); printf("Subscribed to topic %s\n", TOPIC); getchar(); MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; } 3.编译运行MQTT客户端 将以上代码保存为main.c文件,运行以下命令编译生成可执行文件: gcc -o main main.c -lpaho-mqtt3as 运行可执行文件即可实现MQTT客户端的订阅功能。 以上就是利用Qt实现MQTT客户端的步骤。通过第三方MQTT库和Qt的API函数,可以方便地实现MQTT客户端的开发,适用于物联网等领域的数据传输和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值