it编程 > 编程语言 > C/C++

Qt 中集成mqtt协议的使用方法

24人参与 2025-02-24 C/C++

一,引入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协议内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

C++中使用mutable关键字的场景分析

02-24

C语言结构体内存对齐问题小结

02-24

使用C++实现链表元素的反转

02-23

C++使用栈实现括号匹配的代码详解

02-23

C++初始化数组的几种常见方法(简单易懂)

02-21

C++ Primer 多维数组的使用

02-21

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论