|
@ -0,0 +1,126 @@ |
|
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
/*
|
|
|
|
|
|
* Qt mutizone MQTT thermostat |
|
|
|
|
|
* |
|
|
|
|
|
* Copyright (C) 2019 Richard Genoud |
|
|
|
|
|
* |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include <QEventLoop>
|
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
|
#include <QElapsedTimer>
|
|
|
|
|
|
#include <QHostInfo>
|
|
|
|
|
|
#include <QHostAddress>
|
|
|
|
|
|
#include <QLoggingCategory>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "qmqtt.h"
|
|
|
|
|
|
#include "backgroundloop.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define MQTT_SERVER "nas"
|
|
|
|
|
|
#define MQTT_PORT 1883
|
|
|
|
|
|
#define MQTT_USERNAME ""
|
|
|
|
|
|
#define MQTT_PASSWORD ""
|
|
|
|
|
|
#define MQTT_CLIENT_ID ""
|
|
|
|
|
|
#define LOOP_SLEEP_TIME_S 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BackgroundLoop::BackgroundLoop() { |
|
|
|
|
|
m_mqtt_client = NULL; |
|
|
|
|
|
qsrand((uint)QDateTime::currentMSecsSinceEpoch()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
BackgroundLoop::~BackgroundLoop() { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool BackgroundLoop::connectMQTT() |
|
|
|
|
|
{ |
|
|
|
|
|
QHostInfo info; |
|
|
|
|
|
QHostAddress address; |
|
|
|
|
|
bool result = false, ok; |
|
|
|
|
|
|
|
|
|
|
|
if (m_mqtt_client) { |
|
|
|
|
|
delete m_mqtt_client; |
|
|
|
|
|
m_mqtt_client = NULL; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ok = address.setAddress(MQTT_SERVER); |
|
|
|
|
|
if (!ok) { |
|
|
|
|
|
/* This must be a domain name, not an IP */ |
|
|
|
|
|
info = QHostInfo::fromName(MQTT_SERVER); |
|
|
|
|
|
if (info.error() != QHostInfo::NoError) { |
|
|
|
|
|
qWarning() << QString("Error looking for address %1").arg(MQTT_SERVER) |
|
|
|
|
|
<< info.errorString(); |
|
|
|
|
|
goto out; |
|
|
|
|
|
} |
|
|
|
|
|
if (info.addresses().isEmpty()) { |
|
|
|
|
|
qWarning() << QString("No address returned for %1").arg(MQTT_SERVER); |
|
|
|
|
|
goto out; |
|
|
|
|
|
} |
|
|
|
|
|
address = info.addresses().first(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
m_mqtt_client = new QMQTT::Client(address, MQTT_PORT); |
|
|
|
|
|
if (!m_mqtt_client) { |
|
|
|
|
|
qWarning() << QString("Error allocating memory for MQTT client"); |
|
|
|
|
|
goto out; |
|
|
|
|
|
} |
|
|
|
|
|
if (QString(MQTT_CLIENT_ID).isEmpty()) { |
|
|
|
|
|
m_mqtt_client->setClientId(QString("thermostat%1").arg(qrand())); |
|
|
|
|
|
} else { |
|
|
|
|
|
m_mqtt_client->setClientId(MQTT_CLIENT_ID); |
|
|
|
|
|
} |
|
|
|
|
|
connect(m_mqtt_client, SIGNAL(connected()), this, SLOT(mqtt_connected())); |
|
|
|
|
|
connect(m_mqtt_client, SIGNAL(disconnected()), this, SLOT(mqtt_disconnected())); |
|
|
|
|
|
connect(m_mqtt_client, SIGNAL(error(const QMQTT::ClientError)), |
|
|
|
|
|
this, SLOT(mqtt_error(const QMQTT::ClientError))); |
|
|
|
|
|
connect(m_mqtt_client, SIGNAL(subscribed(const QString&, const quint8)), |
|
|
|
|
|
this, SLOT(mqtt_subscribed(const QString&, const quint8))); |
|
|
|
|
|
connect(m_mqtt_client, SIGNAL(received(const QMQTT::Message&)), |
|
|
|
|
|
this, SLOT(mqtt_received(const QMQTT::Message&))); |
|
|
|
|
|
|
|
|
|
|
|
m_mqtt_client->setUsername(MQTT_USERNAME); |
|
|
|
|
|
m_mqtt_client->setPassword(MQTT_PASSWORD); |
|
|
|
|
|
m_mqtt_client->connectToHost(); |
|
|
|
|
|
|
|
|
|
|
|
result = true; |
|
|
|
|
|
|
|
|
|
|
|
out: |
|
|
|
|
|
return result; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void BackgroundLoop::mqtt_connected(void) |
|
|
|
|
|
{ |
|
|
|
|
|
qDebug() << "MQTT connected !"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void BackgroundLoop::mqtt_disconnected(void) |
|
|
|
|
|
{ |
|
|
|
|
|
qDebug() << "MQTT disconnected !"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void BackgroundLoop::mqtt_error(const QMQTT::ClientError error) |
|
|
|
|
|
{ |
|
|
|
|
|
qDebug() << "MQTT error ! code: " << error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void BackgroundLoop::mqtt_subscribed(const QString& topic, const quint8 qos) |
|
|
|
|
|
{ |
|
|
|
|
|
qDebug() << "MQTT subscribed! topic: " << topic << " QoS: " << qos; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void BackgroundLoop::mqtt_received(const QMQTT::Message& message) |
|
|
|
|
|
{ |
|
|
|
|
|
qDebug() << "MQTT recieved: " << QString::fromUtf8(message.payload()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void BackgroundLoop::run() |
|
|
|
|
|
{ |
|
|
|
|
|
connectMQTT(); |
|
|
|
|
|
while(!isInterruptionRequested()) { |
|
|
|
|
|
this->sleep(LOOP_SLEEP_TIME_S); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* vim: set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab: */ |