Qt 中集成mqtt协议

一,引入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();
}
相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript