应课设要求需要使用MQTT通信协议进行网关开发,所以就花了时间捣鼓一下,也遇到很多的坑所以写了这篇博客记录一下。
1、mqtt服务器有很多在这里我选择EMQ X因为这个是开源并且还有可视化的后台管理便于开发和调试。可以到官网直接下载:点击进去下载
3、接下来就是上传到Ubuntu虚拟机进行解压安装
解压命令:unzip emqx-ubuntu16.04-4.3.10-amd64.zip
安装直接进入解压目录:emqx/bin/
执行命令:./emqx start
4、测试服务器:
在浏览器中输入 http://localhost:18083,用户名admin,密码public,进入Dashboard
小编使用的测试工具是MQTT.fx,这个工具个人决定还是很好用的建议大家去下载
5、关闭服务器
在目录中输入./emqx stop 即可
6、服务其搭建好了之后接下来就是进行mqtt库的移植了,可以到GitHub下载源码点击下载
这里一定要注意的是版本号跟QT一定要对应否则编译不通过 !!!
7、接下来就是上传到Ubuntu进行解压
8、进入解压目录使用QT打开工程文件编译源码
打开之后就是直接简单粗暴编译,过程有一丢丢慢(不出意外会报错,下面就会讲怎么修改)
显示头文件找不到,是因为头文件路径的目录不正确,要进行修改 使用绝对路径即可
接下来就是反复调试查找要修改的头文件路径直到编译通过,通过之后会生成一个工程文件夹里面就有我们需要使用到的库了,别泄气老铁们到这里已经成功3/4了。需要用的只有include文件夹和lib文件夹。
接下来就是新建我们自己的QT工程了,把库加进去就可以爽快的进行开发啦,下面是我自己新建的工程,这里可能会有些朋友不熟悉添加外部库(非常简单)
需要把include文件夹拷贝到源码的mqtt目录里面
下面是把lib文件夹和刚才添加了include源码文件夹的mqtt文件夹放到自己的新建工程自己的工程添加完后的:
打开工程添加库
点击工程右键“添加库”
选择对应的平台就可以了,小编的是Linux平台,你们按照自己的系统来选择即可。添加成功界面如下:
在头文件目录添加一个文件如下:
在头文件中添加mqtt相关的文件编译成功,致辞移植成功啦!
9、下面就是懒人图形界面设计
设计好界面后直接上代码关联后台
.cpp源文件
#include "dialog.h"
#include "ui_dialog.h"
#include <qdebug.h>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
pMqttClient = new QMqttClient(this);//创建一个客户端对象
connect(pMqttClient,&QMqttClient::stateChanged,this,&Dialog::updateLogStateChange);
connect(pMqttClient,&QMqttClient::messageReceived,this,&Dialog::recv_message);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::updateLogStateChange()//监测客户端的状态是否发生改变
{
const QString content = QLatin1String(":state change")
+QString::number(pMqttClient->state())+QLatin1Char('\n');
qDebug()<<content;
}
void Dialog::on_connectBt_clicked()//连接服务器
{
pMqttClient->setHostname(ui->ServerIPEdit->text().trimmed());//设置主机IP
pMqttClient->setPort(ui->PortEdit->text().trimmed().toUInt());//设置端口号
updateLogStateChange();
if(pMqttClient->state()==QMqttClient::Disconnected){
pMqttClient->connectToHost();
ui->connectBt->setText(tr("Disconnected"));
}else{
pMqttClient->disconnectFromHost();
ui->connectBt->setText(tr("Connect"));
}
}
void Dialog::on_PublishBt_clicked()//发布主题
{
QString topic=ui->topicEdit->text().trimmed();//获取主题
QString playload = ui->playloadEdit->text().trimmed();
pMqttClient->publish(QMqttTopicName(topic),playload.toLocal8Bit());
qDebug()<<"publish: ["<<topic<<"] "<<playload;
}
void Dialog::on_SubscribeBt_clicked()//订阅主题
{
QString topic = ui->Subscribe_top_Edit->text().trimmed();//获取订阅的主题
pMqttClient->subscribe(QMqttTopicFilter(topic));
qDebug()<<"Subscribe:"<<topic;
}
void Dialog::recv_message(const QByteArray &message,const QMqttTopicName &topic)//获取订阅的消息内容
{
QString receiveTempStr = ui->Subscribe_play_Edit->toPlainText();
QString receiveStr = receiveTempStr + "\n["+topic.name()+"] "+message;
ui->Subscribe_play_Edit->setPlainText(receiveStr);
ui->Subscribe_play_Edit->moveCursor(QTextCursor::End);
qDebug()<<message<<"\n"<<topic.name();
}
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <mqtt/qmqttclient.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
protected:
QMqttClient *pMqttClient;
private slots:
void on_connectBt_clicked();
void on_PublishBt_clicked();
void on_SubscribeBt_clicked();
void updateLogStateChange();//客户端状态发生改变
void recv_message(const QByteArray &message,const QMqttTopicName &topic);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
至此实验结束啦