#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