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