一,引入qmqtt 库
我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台时 方便,直接编译就行了。
原始仓库路径:https://github.com/emqx/qmqtt/tree/master
二,使用
声明一个单例类,将订阅到主题,直接以属性的方式 进行暴露,这样qml文件中 就可以直接使用。 下边是订阅一个温度 和湿度的主题数据。
#ifndef mqttmanagert_h
#define mqttmanagert_h
#include <iostream>
#include <mqtt/qmqtt.h>
class mqttmanager:public qobject
{
q_object
q_property(qstring intemperature read getintemperature write setintemperature notify intemperaturechanged final)
q_property(qstring inhumidity read getinhumidity write setinhumidity notify inhumiditychanged final)
public:
static mqttmanager* instance();
qstring getintemperature() const;
void setintemperature(qstring newintemperature);
qstring getinhumidity() const;
void setinhumidity(qstring newinhumidity);
private:
~mqttmanager();
mqttmanager();
public slots:
void doconnected();
void onsubscribed(const qstring& topic);
void dodisconnected();
void dodatareceived(qmqtt::message message);
signals:
void intemperaturechanged();
void inhumiditychanged();
private:
qmqtt::client *client;
static mqttmanager *manager;
qstring intemperature;
qstring inhumidity;
};
#endif // mqttmanagert_h#include "mqttmanagert.h"
mqttmanager* mqttmanager::manager=nullptr;
const qstring host= "127.0.0.1"; //服务器地址
//需要订阅的主题
const qstring topic_in_temperature_humidity ="qmqtt/in_temperature_humidity";
mqttmanager::mqttmanager(){
client = new qmqtt::client(qhostaddress(host),1883,this);
connect(client,&qmqtt::client::connected,this,&mqttmanager::doconnected);
connect(client,&qmqtt::client::disconnected,this,&mqttmanager::dodisconnected);
connect(client,&qmqtt::client::received,this,&mqttmanager::dodatareceived);
connect(client, &qmqtt::client::subscribed, this, &mqttmanager::onsubscribed);
client->connecttohost();
}
mqttmanager::~mqttmanager(){
client->disconnected();
}
mqttmanager* mqttmanager::instance(){
if(!manager){
manager = new mqttmanager();
}
return manager;
}
void mqttmanager::doconnected(){
qdebug()<<"doconnected ok";
//再此订阅主题
client->subscribe(topic_in_temperature_humidity);
}
void mqttmanager::onsubscribed(const qstring& topic)
{
qdebug() << "onsubscribed " << topic;
}
void mqttmanager::dodatareceived(qmqtt::message message){
//收到消息
qstring mes = qstring(message.id())+" "+qstring(message.qos())+" "+message.topic()+" "+message.payload()+"\n";
qdebug()<<"datareceived "<<mes;
//根据主题过滤消息
if(message.topic()==topic_in_temperature_humidity){
qstringlist datalist = qstring(message.payload()).split(",");
if(datalist.size()==2){
setintemperature(datalist[0]);
setinhumidity(datalist[1]);
}
}
}
void mqttmanager::dodisconnected(){
qdebug()<<"dodisconnected ok";
}
qstring mqttmanager::getintemperature() const
{
return intemperature;
}
void mqttmanager::setintemperature(qstring newintemperature)
{
if (intemperature == newintemperature)
return;
intemperature = newintemperature;
emit intemperaturechanged();
}
qstring mqttmanager::getinhumidity() const
{
return inhumidity;
}
void mqttmanager::setinhumidity(qstring newinhumidity)
{
if (inhumidity == newinhumidity)
return;
inhumidity = newinhumidity;
emit inhumiditychanged();
}到此这篇关于qt 中集成mqtt协议的使用方法的文章就介绍到这了,更多相关qt 集成mqtt协议内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论