Qt 애플리케이션 개발 6: Qt mqtt 통신

3918 단어 Qt
#ifndef MQTTINTERFACE_H
#define MQTTINTERFACE_H
#include"MQTTClient.h"
#include
#include
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;
    QListtopic;
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

#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="" 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()<

전체 코드:https://download.csdn.net/download/xzpblog/10962367

좋은 웹페이지 즐겨찾기