目录
前言
一、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命令)
如果出现上面没有共享文件的现象可以执行以下命令(要在桌面路径或者根路径下执行)
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o nonempty -o allow_other
将解压好的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
再开一个终端测试是否能成功
使用mqttfx进行连接测试
二、移植MQTT官方库
1.下载官方源码
mqtt官方将源码放到了Github上,建议下载和自己qt对应的版本,如果qt版本过低就随便下载就好了。(我后续会把mqttfx,源码等打包放在网盘中放在最底下)
2、打开文件并且编译文件
qmake和构建这个src文件就可以,可以将模式换成release模式,也可以debug,不同的编译后续的操作也不同
后续可能会报错,根据提示就是没有这个库文件,我在后面加上.h就行了
构建完成后,提取我们需要的文件
3、移植官方库文件
4、编写qt代码
ui界面如下
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、实验现象
注意:编译的时候要根据自己选择的lib库进行适合的方式编译,我之前用的debug一直连接不上mqtt,换了方式就ok了。(当然不排除你在使用的时候有其他的原因导致,如出现问题请自行百度)
三、移植第三方库
1、下载第三方源码
下载地址
2、移植
与上述官方库移植步骤一致,我就不一一截图进行解释了,简单描述下步骤。
1、打开src.pro工程文件
2、编译工程文件(会出现错误,根据错误修改一下包含的头文件)
3、根据需要将编译好的lib中的库文件进行拷贝,以及源文件中的src/mqtt中的所有.h文件
4、新建自己的工程,加入include和lib文件,在工程中加入network,以及添加外部库
最后两句如果没有可以自己加上
3、编写qt代码
ui界面
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软件链接如下:文章来源:https://www.toymoban.com/news/detail-785417.html
http://链接:https://pan.baidu.com/s/1Zk8FCpTAGVi3fz5I32vzZw?pwd=10th 提取码:10th文章来源地址https://www.toymoban.com/news/detail-785417.html
到了这里,关于QT简单实现MQTT通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!