Merge PR #579: Make the cloud discovery a bit easier to work with

This commit is contained in:
Jenkins nymea 2021-04-01 23:58:18 +02:00
commit eeb78a495c
2 changed files with 24 additions and 13 deletions

View File

@ -930,16 +930,16 @@ bool AWSClient::postToMQTT(const QString &coreId, const QString &nonce, QObject*
// Workaround MQTT broker url weirdness as described above // Workaround MQTT broker url weirdness as described above
request.setUrl("https://" + m_configs.value(m_usedConfig).mqttEndpoint + path1); request.setUrl("https://" + m_configs.value(m_usedConfig).mqttEndpoint + path1);
qCDebug(dcCloud()) << "Posting to MQTT:" << request.url().toString(); qCInfo(dcCloud) << "Posting to MQTT:" << request.url().toString();
// qDebug() << "HEADERS:"; // qCDebug(dcCloud) << "HEADERS:";
// foreach (const QByteArray &headerName, request.rawHeaderList()) { // foreach (const QByteArray &headerName, request.rawHeaderList()) {
// qDebug() << headerName << ":" << request.rawHeader(headerName); // qCDebug(dcCloud) << headerName << ":" << request.rawHeader(headerName);
// } // }
// qDebug() << "Payload:" << payload; qCDebug(dcCloud) << "Payload:" << payload;
QNetworkReply *reply = m_nam->post(request, payload); QNetworkReply *reply = m_nam->post(request, payload);
QTimer::singleShot(5000, reply, [reply, senderWatcher, callback](){ QTimer::singleShot(5000, reply, [reply, senderWatcher, callback](){
reply->deleteLater(); reply->deleteLater();
qWarning() << "Timeout posting to MQTT"; qCWarning(dcCloud) << "Timeout posting to MQTT";
if (senderWatcher) { if (senderWatcher) {
callback(false); callback(false);
} }
@ -953,14 +953,14 @@ bool AWSClient::postToMQTT(const QString &coreId, const QString &nonce, QObject*
return; return;
} }
if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcCloud()) << "MQTT Network reply error" << reply->error() << reply->errorString(); qCWarning(dcCloud()) << "MQTT Network reply error" << reply->error() << reply->errorString() << qUtf8Printable(data);
callback(false); callback(false);
return; return;
} }
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
qCWarning(dcCloud()) << "Failed to parse MQTT reply" << error.error << error.errorString() << data; qCWarning(dcCloud()) << "Failed to parse MQTT reply" << error.error << error.errorString() << qUtf8Printable(data);
callback(false); callback(false);
return; return;
} }
@ -1005,6 +1005,11 @@ void AWSClient::fetchDevices()
QByteArray data = reply->readAll(); QByteArray data = reply->readAll();
if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcCloud()) << "Error fetching cloud devices:" << reply->error() << reply->errorString() << qUtf8Printable(data); qCWarning(dcCloud()) << "Error fetching cloud devices:" << reply->error() << reply->errorString() << qUtf8Printable(data);
if (reply->error() == QNetworkReply::AuthenticationRequiredError) {
qCInfo(dcCloud()) << "Trying to refresh access token";
refreshAccessToken();
QueuedCall::enqueue(m_callQueue, QueuedCall("fetchDevices"));
}
return; return;
} }
QJsonParseError error; QJsonParseError error;

View File

@ -42,6 +42,9 @@
#include <QNetworkConfigurationManager> #include <QNetworkConfigurationManager>
#include <QNetworkSession> #include <QNetworkSession>
#include "logging.h"
NYMEA_LOGGING_CATEGORY(dcDiscovery, "Discovery")
NymeaDiscovery::NymeaDiscovery(QObject *parent) : QObject(parent) NymeaDiscovery::NymeaDiscovery(QObject *parent) : QObject(parent)
{ {
m_nymeaHosts = new NymeaHosts(this); m_nymeaHosts = new NymeaHosts(this);
@ -231,11 +234,10 @@ void NymeaDiscovery::syncCloudDevices()
for (int i = 0; i < m_awsClient->awsDevices()->rowCount(); i++) { for (int i = 0; i < m_awsClient->awsDevices()->rowCount(); i++) {
AWSDevice *d = m_awsClient->awsDevices()->get(i); AWSDevice *d = m_awsClient->awsDevices()->get(i);
NymeaHost *host = m_nymeaHosts->find(d->id()); NymeaHost *host = m_nymeaHosts->find(d->id());
if (!host) { bool alreayAdded = host != nullptr;
if (!alreayAdded) {
host = new NymeaHost(); host = new NymeaHost();
host->setUuid(d->id()); host->setUuid(d->id());
qDebug() << "CloudDiscovery: Adding new host:" << host->name() << host->uuid().toString();
m_nymeaHosts->addHost(host);
} }
host->setName(d->name()); host->setName(d->name());
QUrl url; QUrl url;
@ -244,10 +246,14 @@ void NymeaDiscovery::syncCloudDevices()
Connection *conn = host->connections()->find(url); Connection *conn = host->connections()->find(url);
if (!conn) { if (!conn) {
conn = new Connection(url, Connection::BearerTypeCloud, true, d->id()); conn = new Connection(url, Connection::BearerTypeCloud, true, d->id());
qDebug() << "CloudDiscovery: Adding new connection to host:" << host->name() << conn->url().toString(); qCDebug(dcDiscovery) << "Adding new connection to host:" << host->name() << conn->url().toString();
host->connections()->addConnection(conn); host->connections()->addConnection(conn);
} }
conn->setOnline(d->online()); conn->setOnline(d->online());
if (!alreayAdded) {
qCDebug(dcDiscovery) << "Adding new host:" << d->name() << d->id();
m_nymeaHosts->addHost(host);
}
} }
QList<NymeaHost*> hostsToRemove; QList<NymeaHost*> hostsToRemove;
@ -283,7 +289,7 @@ void NymeaDiscovery::loadFromDisk()
host->setUuid(QUuid(serverUuid)); host->setUuid(QUuid(serverUuid));
m_nymeaHosts->addHost(host); m_nymeaHosts->addHost(host);
} }
qDebug() << "Loaded Host from cache" << host->name() << host->uuid(); qCDebug(dcDiscovery()) << "Loaded Host from cache" << host->name() << host->uuid();
foreach (const QString &group, settings.childGroups()) { foreach (const QString &group, settings.childGroups()) {
settings.beginGroup(group); settings.beginGroup(group);
QString url = settings.value("url").toString(); QString url = settings.value("url").toString();
@ -294,7 +300,7 @@ void NymeaDiscovery::loadFromDisk()
QString displayName = settings.value("displayName").toString(); QString displayName = settings.value("displayName").toString();
connection = new Connection(url, bearerType, secure, displayName, host); connection = new Connection(url, bearerType, secure, displayName, host);
host->connections()->addConnection(connection); host->connections()->addConnection(connection);
qDebug() << "|- Connection:" << group << connection->url() << connection->bearerType() << "secure:" << connection->secure(); qCDebug(dcDiscovery()) << "|- Connection:" << group << connection->url() << connection->bearerType() << "secure:" << connection->secure();
} }
settings.endGroup(); settings.endGroup();
} }