Qt应用程序开发六:Qt mqtt通信

#ifndef MQTTINTERFACE_H
#define MQTTINTERFACE_H
#include"MQTTClient.h"
#include<QObject>
#include<QList>
class MqttInterFace:public QObject
{

    Q_OBJECT
public:

    void Release();
    void HandleMessage(const char* data,char* topic);
    bool InitMqtt(QString mttqClient);
    int MqttSubscribe(QString mttqToppic);
    int PublicMessage(QString message,QString topic);
    static MqttInterFace *GetMqttInstance();
    void SetMqttAddr(QString addr);
    bool hasInit;
    QList<QString>topic;
public:signals:
    void mqttMessage(int id,QString topic);
    void mttState(int state);
protected:
    MqttInterFace(QObject *parent=0);
private:
    MQTTClient              client;
    QString                     m_mqttAddr;
    bool                          mIsConnect;
    static MqttInterFace *_mqtt;






};


#endif // MQTTINTERFACE_H
#include"mqttinterface.h"
#include<QDebug>

#define MQTT_ADDRESS               "addr"
#define MQTT_TOPIC                   "topic"
#define MQTT_USERNAME           "username"
#define MQTT_PASSWORD           "password"
#define MQTT_QOS                      0
#define MQTT_TIMEOUT              10000L


MqttInterFace *MqttInterFace::_mqtt = NULL;
static QString  _mttqClient;

//消息到大回调
static int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    Q_UNUSED(context)
    Q_UNUSED(topicLen)
    MqttInterFace::GetMqttInstance()->HandleMessage((char*)message->payload,topicName);
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}

//重连
static void connectionLost(void* context, char* cause){
    qDebug()<<__FUNCTION__<< context<<cause<<"reconnecting";
    MqttInterFace* mqtt =  MqttInterFace::GetMqttInstance();
    mqtt->hasInit = false;
    mqtt->InitMqtt(_mttqClient);

}

MqttInterFace::MqttInterFace(QObject *parent):QObject(parent)
{
    hasInit =false;
}

//发布消息
int MqttInterFace::PublicMessage(QString message,QString topic)
{
    QByteArray sendAraray = message.toLatin1();
    MQTTClient_deliveryToken token;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    pubmsg.payload = (void*)sendAraray.data();
    pubmsg.payloadlen = sendAraray.size();
    pubmsg.qos = MQTT_QOS;
    pubmsg.retained = 0;
    int rc =  MQTTClient_publishMessage(client,topic.toLatin1(), &pubmsg, &token);
    if(rc != MQTTCLIENT_SUCCESS){
           return rc;
    }
    return  MQTTClient_waitForCompletion(client, token, MQTT_TIMEOUT);
}

void MqttInterFace::Release()
{
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
}

//接收到的数据
void MqttInterFace::HandleMessage(const char *data,char* topic)
{
    emit mqttMessage(atoi(data),QString::fromLatin1(topic));
}

//订阅主题
int MqttInterFace::MqttSubscribe(QString mttqToppic)
{
    if(!topic.contains(mttqToppic)){
        topic.append(mttqToppic);
    }
    if(mIsConnect)
          return MQTTClient_subscribe(client, mttqToppic.toStdString().c_str(), MQTT_QOS);
    return -1;
}

//初始化
bool MqttInterFace::InitMqtt(QString mttqClient)
{
    if(hasInit) return true;
    hasInit = true;
    _mttqClient = mttqClient;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc = 0;
    MQTTClient_create(&client, m_mqttAddr.toStdString().c_str(), mttqClient.toStdString().c_str(),MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    conn_opts.username = MQTT_USERNAME;
    conn_opts.password = MQTT_PASSWORD;
    MQTTClient_setCallbacks(client, NULL, connectionLost, msgarrvd, NULL);

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
         qDebug()<<"mqtt connect failed";
         mIsConnect = false;
        connectionLost(NULL,NULL);
        return false;
    }else{
       mIsConnect = true;
        if(topic.size() == 0)
        {
            return true;
        }
        for(int m = 0; m < topic.size();++m){
            MQTTClient_subscribe(client, topic.at(m).toStdString().c_str(), MQTT_QOS);
        }
    }

    return true;


}

MqttInterFace *MqttInterFace::GetMqttInstance()
{
    if(_mqtt == NULL)
        _mqtt = new MqttInterFace(NULL);
    return _mqtt;
}

void MqttInterFace::SetMqttAddr(QString addr)
{
      m_mqttAddr = addr;
}

完整代码:https://download.csdn.net/download/xzpblog/10962367

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值