Я работаю над проектом MQTT с использованием QT. Издатель работает нормально, который открывает и закрывает блокировку, управляемую raspi3, но мне также нужно подписать тему и начать другое действие, когда подписанная тема ответит. Я также сделал первый небольшой пример, прежде чем приступить к его реализации в более крупном проекте, который прекрасно работал там.
Но не в этом проекте. Я что-то пропустил?
Вот соответствующие фрагменты из моего кода:
HMIController.cpp
QmlMqttClient *HMIController::createClient()
{
mqttClient = new QmlMqttClient;
mqttClient->handleSub();
return mqttClient;
}
qmlmqttclient.h
#ifndef QMLMQTTCLIENT_H
#define QMLMQTTCLIENT_H
#include <QtCore/QMap>
#include <QtMqtt/QMqttClient>
#include <QtMqtt/QMqttSubscription>
#include <QtMqtt/QMqttMessage>
class QmlMqttClient;
class QmlMqttClient : public QMqttClient
{
Q_OBJECT
public:
QmlMqttClient(QObject *parent = nullptr);
QMqttSubscription *QmlMqttClient::subscribe(const QMqttTopicFilter &topic, quint8 qos = 0);
Q_INVOKABLE qint32 publish(const QMqttTopicName &topic, const QByteArray &message = QByteArray(),
quint8 qos = 0, bool retain = false);
public slots:
void handleOpen();
void handleClose();
void handleSub();
private:
Q_DISABLE_COPY(QmlMqttClient)
private slots:
void brokerDisconnected();
};
#endif // QMLMQTTCLIENT_H
qmlmqttclient.cpp
#include <QtMqtt/QMqttSubscription>
#include <QtMqtt/QMqttTopicFilter>
#include <QMqttTopicName>
#include <QtMqtt/QMqttClient>
#include <QMqttClient>
#include <QMqttSubscription>
#include <QDateTime>
#include <QDebug>
#include <QtQuick>
#include "qmlmqttclient.h"#include "hmicontroller.h"
QmlMqttClient::QmlMqttClient( QObject *parent)
: QMqttClient(parent)
{
this->setHostname("192.168.137.82");
this->setPort(1883);
this->connectToHost();
if (ClientState::Disconnected)
{
connect(this, &QmlMqttClient::disconnected, this, &QmlMqttClient::brokerDisconnected);
qDebug() << "Broker disconnected";
} else if (ClientState::Connecting)
{
qDebug() << "Connecting to MqttBroker ..." << this->clientId();
}
connect(this, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
qDebug() << QDateTime::currentDateTime().toString()
+ QLatin1String(" Received Topic: ")
+ topic.name()
+ QLatin1String(" Message: ")
+ message
+ QLatin1Char('\n');
});
}
qint32 QmlMqttClient::publish(const QMqttTopicName &topic, const QByteArray &message,
quint8 qos, bool retain)
{
return QMqttClient::publish(topic, message, qos, retain);
}
void QmlMqttClient::handleOpen()
{
QString msg = "AUF";
const QMqttTopicName *topic = new QMqttTopicName("lock");
publish(*topic, msg.toUtf8() ,0);
}
void QmlMqttClient::handleClose()
{
QString msg = "ZU";
const QMqttTopicName *topic = new QMqttTopicName("lock");
publish(*topic, msg.toUtf8() ,0);
}
QMqttSubscription *QmlMqttClient::subscribe(const QMqttTopicFilter &topic, quint8 qos)
{
qDebug() << "Subscribed" << this->clientId();
return QMqttClient::subscribe(topic, qos);
}
//Called from hmicontroller
void QmlMqttClient::handleSub()
{
const QMqttTopicFilter *topic = new QMqttTopicFilter("button");
subscribe(*topic, quint8(0));
qDebug() << "Subscribed";
}void QmlMqttClient::brokerDisconnected()
{
qDebug() << "Session closed";
}
Большое спасибо за вашу помощь и, кстати, я также новичок в c ++ и qt. Так что извините за не очень хороший написанный код.
Итак, я нашел свою проблему. Подписчик не подписался на указанную мной тему из-за быстрой загрузки этого метода. С задержкой теперь работает нормально.
Других решений пока нет …