Ubuntu16.04LTS环境下搭建MQTT服务器以及QT实现MQTT客户端
MQTT服务器搭建
使用EMQX搭建MQTT服务器,EMQX 4.2.14 for Ubuntu 16.04下载
下载zip包,选择安装方式为zip,cpu架构选择x86_64
按照网页的指示进行下载、安装即可。
下载后按照网页指示,输入对应的命令,就可以在ubuntu解压emqx,解压完成直接进入文件夹运行emqx。
emqx开始运行后,进入浏览器,输入ip地址+:18083或是127.0.0.1:18083,输入账户admin,密码public,就能够打开MQTT控制台。
停止emqx:
QT实现MQTT客户端
移植MQTT库
可选用的库有很多,移植方式有很多,可以将源码编译过后将库导入工程,也可以直接将源码拷贝如工程使用。直接将源码拷贝到工程目录下
这里参考的是这篇博文:Linux Qt下MQTT模块的导入(源码移植)
选择的库为qmqtt-master,库只支持MQTTV3.0和MQTTV3.1协议,暂时还不支持MQTTV5.0协议,直接拷贝源码到工程目录下。
好处就是可以直接查看函数源文件,且移植非常方便,只要将源码下载下来,将源码目录中/src/mqtt文件夹整个cp到工程目录下。将文件夹内的.cpp和.h文件添加进工程目录,就完成了。
在工程内添加库
接下来需要在工程里添加MQTT的.cpp和.h文件,查看一下要添加的文件
在.pro里面添加:
执行qmake,重新构建工程,有报错的地方就修改一下,不报错就算移植完成了
QT程序编写
程序与云平台的通信格式采用JSON,定义一个类
关于具体实现,qmqtt_master有给一个例子,可以参考:
class GatawayToCloud : public QObject{Q_OBJECT
public:explicit GatawayToCloud(QObject *parent = 0);~GatawayToCloud();private:QMQTT::Client * mqtt_client;QHostAddress host;quint16 port;QString clientID;QString userName;QByteArray password;QTimer * timer;bool autoReconncetFlag;QMQTT::Message msgFromCloud;QMQTT::Message msgToCloud;signals:void revMqttMsg(QString,QJsonArray);void revMqttMsg(QString,QJsonObject);void revMqttMsg(QString,QString);void revMqttMsg(QString,QByteArray);private slots:void timeOut(void);void receiveCloudMessage(QMQTT::Message message);public:void connectToCloud(void);void disconnectFromCloud(void);void setHost(QString);void setPort(quint16);void setClientID(QString);void setUserName(QString);void setPassword(QByteArray);void connectState(void);bool isConnected(void);void subscribeTopic(const QString,qint8);void unsubscribeTopic(const QString);void publishMessage(const QString,QByteArray);
};
类实现:
GatawayToCloud::GatawayToCloud(QObject *parent) : QObject (parent)
{mqtt_client = new QMQTT::Client(QHostAddress("192.168.1.188"),1883);/*disconnect when init*/mqtt_client->disconnectFromHost();autoReconncetFlag =false;/*timer*/timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));timer->start(5000);
}GatawayToCloud::~GatawayToCloud()
{timer->stop();
}void GatawayToCloud::timeOut()
{if(!autoReconncetFlag)return;if(mqtt_client->connectionState() != QMQTT::ConnectionState::STATE_CONNECTED ){connectState();mqtt_client->disconnectFromHost();connectToCloud();}
}void GatawayToCloud::receiveCloudMessage(QMQTT::Message message)
{qDebug()<<("receive cloud message");QString topic = message.topic();QByteArray load = message.payload();emit revMqttMsg(topic,load);// QJsonDocument json_file = QJsonDocument::fromJson(load);// //plain text
// if(json_file.isEmpty()){// emit revMqttMsg(topic,(QString)load);
// }
// //json
// if(!json_file.array().isEmpty())
// emit revMqttMsg(topic,json_file.array());
// else if(!json_file.object().isEmpty()){// emit revMqttMsg(topic,json_file.object());
// }
}void GatawayToCloud::connectToCloud()
{mqtt_client->setKeepAlive(150);mqtt_client->setHost(host);mqtt_client->setPort(port);mqtt_client->setClientId(clientID);mqtt_client->setUsername(userName);mqtt_client->setPassword(password);mqtt_client->cleanSession();mqtt_client->setVersion(QMQTT::MQTTVersion::V3_1_0);mqtt_client->connectToHost();/*start auto reconnect*/autoReconncetFlag = true;/**///connect(mqtt_client,SIGNAL(received),this,SLOT(receiveCloudMessage));connect(mqtt_client, SIGNAL(received(QMQTT::Message)),this, SLOT(receiveCloudMessage(QMQTT::Message)));
}void GatawayToCloud::disconnectFromCloud()
{/*stop auto reconnect*/autoReconncetFlag = false;mqtt_client->disconnectFromHost();
}void GatawayToCloud::setHost(QString hostAddr)
{host.setAddress(hostAddr);
}void GatawayToCloud::setPort(quint16 hostPort)
{port = hostPort;
}void GatawayToCloud::setClientID(QString cltID)
{clientID = cltID;
}void GatawayToCloud::setUserName(QString usrNm)
{userName = usrNm;
}void GatawayToCloud::setPassword(QByteArray hostPassword)
{password = hostPassword;
}void GatawayToCloud::connectState()
{if(mqtt_client->connectionState() == QMQTT::ConnectionState::STATE_INIT){qDebug()<<("mqtt state: connect init");}else if(mqtt_client->connectionState() == QMQTT::ConnectionState::STATE_CONNECTING){qDebug()<<("mqtt state: connect connecting");}else if(mqtt_client->connectionState() == QMQTT::ConnectionState::STATE_DISCONNECTED){qDebug()<<("mqtt state: connect disconncet");}else if(mqtt_client->connectionState() == QMQTT::ConnectionState::STATE_CONNECTED){qDebug()<<("mqtt state: connected");}
}bool GatawayToCloud::isConnected()
{return mqtt_client->connectionState()==QMQTT::ConnectionState::STATE_CONNECTED;
}void GatawayToCloud::subscribeTopic(const QString topic,qint8 qos=0)
{if(mqtt_client->connectionState() != QMQTT::ConnectionState::STATE_CONNECTED){qDebug()<<("unconnected to mqtt,subcribe fail");return;}qDebug()<<("subcribe topic"+topic);mqtt_client->subscribe(topic,qos);
}void GatawayToCloud::unsubscribeTopic(const QString topic)
{if(mqtt_client->connectionState() != QMQTT::ConnectionState::STATE_CONNECTED){qDebug()<<("unconnected to mqtt,unsubcribe fail");return;}qDebug()<<("unsubcribe topic"+topic);mqtt_client->unsubscribe(topic);
}void GatawayToCloud::publishMessage(const QString topic, QByteArray msg)
{if(mqtt_client->connectionState() != QMQTT::ConnectionState::STATE_CONNECTED){qDebug()<<("unconnected to mqtt,publish fail");return;}qDebug()<<("publish topic "+topic);/*Message(const quint16 id, const QString &topic, const QByteArray &payload,const quint8 qos = 0, const bool retain = false, const bool dup = false);*/QMQTT::Message message((quint16)0x1000,topic,msg);mqtt_client->publish(message);
}
界面设计
功能实现部分槽函数
云端消息接收及显示
/*接收到云端消息*/
void MainWindow::receiveCloudMsg(QString topic, QJsonArray json_array)
{QString msg_str;msg_str += QString("Topic JsonArray:"+topic+"\r\n");QJsonDocument json_file;json_file.setArray(json_array);QByteArray msg_array;msg_array += json_file.toJson();msg_str += msg_array;ui->textEdit_receiveFromCloud->append(msg_str);
}void MainWindow::receiveCloudMsg(QString topic, QJsonObject json_object)
{QString msg_str;msg_str += QString("Topic JsonObject:"+topic+"\r\n");QJsonDocument json_file;json_file.setObject(json_object);QByteArray msg_array;msg_array += json_file.toJson();msg_str += msg_array;ui->textEdit_receiveFromCloud->append(msg_str);
}void MainWindow::receiveCloudMsg(QString topic, QString str)
{ui->textEdit_receiveFromCloud->append(QString("Topic String:"+topic+"\r\n") + str);
}
PushButton控件槽函数
void MainWindow::on_pushButton_connect_clicked()
{//从textedit控件内获取参数mqttClient->setHost(ui->textEdit_IPaddr->toPlainText());mqttClient->setPort(ui->textEdit_port->toPlainText().toUInt());mqttClient->setClientID(ui->textEdit_clientID->toPlainText());mqttClient->setUserName(ui->textEdit_userName->toPlainText());mqttClient->setPassword(ui->textEdit_passWord->toPlainText().toUtf8());//连接mqttClient->connectToCloud();connect(mqttClient,SIGNAL(revMqttMsg(QString,QJsonArray)),this,SLOT(receiveCloudMsg(QString, QJsonArray)));connect(mqttClient,SIGNAL(revMqttMsg(QString,QJsonObject)),this,SLOT(receiveCloudMsg(QString, QJsonObject)));connect(mqttClient,SIGNAL(revMqttMsg(QString,QString)),this,SLOT(receiveCloudMsg(QString, QString)));connect(mqttClient,SIGNAL(revMqttMsg(QString,QByteArray)),this,SLOT(receiveCloudMsg(QString, QByteArray)));
}void MainWindow::on_pushButton_publish_clicked()
{QByteArray msg ;msg += ui->textEdit_sendToCloud->toPlainText();qDebug()<<msg;
// QJsonObject tmp_object;
// tmp_object.insert("msg","hello");
// QJsonDocument tmp_doc;
// tmp_doc.setObject(tmp_object);
// msg = tmp_doc.toJson();mqttClient->publishMessage(ui->textEdit_topic->toPlainText(),msg);
}void MainWindow::on_pushButton_subscribe_clicked()
{/*订阅主题,安全等级QoS0*/mqttClient->subscribeTopic(ui->textEdit_topic->toPlainText(),0);
}void MainWindow::on_pushButton_unsubscribe_clicked()
{/*取消订阅主题*/mqttClient->unsubscribeTopic(ui->textEdit_topic->toPlainText());
}void MainWindow::on_pushButton_clear_clicked()
{ui->textEdit_receiveFromCloud->clear();
}
Ubuntu16.04LTS环境下搭建MQTT服务器以及QT实现MQTT客户端相关推荐
- 云环境下搭建FTP服务器(不使用21端口)
云环境下搭建FTP服务器(不使用21端口) 背景: 1:服务在某云端环境中 2:业务需要在云端环境中部署FTP服务 3:为了安全考虑,在云:安全组中,关闭20.21端口 步骤: 1:使用新的端口在服务 ...
- Windows和Linux环境下搭建SVN服务器
--------------------------Windows下搭建SVN服务器----------------------------- 一.安装SVN服务端 软件包Setup-Subversi ...
- Linux环境下搭建Apache服务器(完整版)
Linux下搭建Apache服务器(完整版) 什么是Apache? Apache Licence是著名的非盈利开源组织Apache采用的协议.该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权, ...
- window环境下搭建SVN服务器
第一步:准备工具: 1.SVN服务端工具(window版):VisualSVN-Server-2.1.11.msi,下载地址:http://download.csdn.net/detail/duanc ...
- win10自带sftp服务器_FreeSSHD在Windows环境下搭建SFTP服务器
0 建议现在Windows环境下安装cygwin,否则在Windows环境下cmd模式使用不了sftp去连接,可以利用win scp去测试连接 2 安装 傻瓜式一键安装 安装过程中会提示"提 ...
- 网络打印服务器 linux,在Linux环境下搭建网络打印服务器
一台旧的打印机没有网口,为方便大家使用决定搭建网络打印服务器.能使用的电脑是古董了,只好使用TinyCore安装使用作为打印服务器了. 先下载最新的tinycore 9.0版,使用usbwri ...
- linux环境下搭建osm_web服务器一(Postgresql配置及osm2pgsql原始数据导入):
Postgresql配置及osm2pgsql原始数据导入 2012年,Ubuntu 12.04LTS发布,又一个长效支持版,我们又该更新OpenStreetMap服务器了,这次,将详细在博客中记录配置 ...
- 在Ubuntu环境下搭建Git服务器
一.1.环境准备,1台Ubuntu系统的服务器(PC),1台用于客户端的自用PC,客户端PC安装了Sourcetree软件. 二.Ubuntu服务器配置: 1.安装git; $ sudo apt-ge ...
- 实例浅谈Linux环境下搭建Web服务器与创建个人主页
版权声明:对于本博客所有原创文章,允许个人.教育和非商业目的使用,但务必保证文章的完整性且不作任何修改地以超链接形式注明原始作者.出处及本声明. 博客地址:http://blog.csdn.ne ...
最新文章
- wamp多站点访问设置
- 智源创新中心——与你同行,用AI改变世界
- JS 触发服务器事件
- Linux 中ifconfig和ip addr命令查看不到ip解决方法
- 分分钟一键部署Zabbix Server
- sql 合并相同条件的字段
- bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)
- SQL---------表的约束
- C++和Delphi工程0.5四舍五入问题的的排查
- 做企业需要一点逆向思维
- 【jQuery笔记Part2】02-jQuery展开收起动画帷幔效果案例下拉菜单案例显示隐藏更多案例折叠菜单案例
- ESRI ArcGIS 9.0系列软件报价
- 数字图像处理(极简) 第一章 概述(docx)
- 关于debian网卡驱动
- 腾讯云GPU云服务器配置初体验
- 使用列表实现筛选法求素数
- 虚拟化安全怎么做?靠安全设备虚拟化还是换个思路?
- 你什么时候意识到该存钱了?生病住ICU隔壁病友每天被催款时
- 颜色匹配 Matlab版本
- java 排名算法_排行榜的算法