diff --git a/libguh-core/awsconnector.cpp b/libguh-core/awsconnector.cpp index 9ecc0330..6524fd93 100644 --- a/libguh-core/awsconnector.cpp +++ b/libguh-core/awsconnector.cpp @@ -35,7 +35,8 @@ QHash AWSConnector::s_requestMap; AWSConnector::AWSConnector(QObject *parent) : QObject(parent) { - connect(this, &AWSConnector::connected, this, &AWSConnector::onConnected); + connect(this, &AWSConnector::connected, this, &AWSConnector::onConnected, Qt::QueuedConnection); + connect(this, &AWSConnector::disconnected, this, &AWSConnector::onDisconnected, Qt::QueuedConnection); } AWSConnector::~AWSConnector() @@ -44,6 +45,7 @@ AWSConnector::~AWSConnector() void AWSConnector::connect2AWS(const QString &endpoint, const QString &clientId, const QString &clientName, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile) { + m_reconnect = true; m_networkConnection = std::shared_ptr(new MbedTLSConnection( endpoint.toStdString(), 8883, @@ -56,8 +58,7 @@ void AWSConnector::connect2AWS(const QString &endpoint, const QString &clientId, true )); m_client = MqttClient::Create(m_networkConnection, std::chrono::milliseconds(30000)); - m_client->SetDisconnectCallbackPtr(&onDisconnected, std::shared_ptr(this)); - m_client->SetAutoReconnectEnabled(true); + m_client->SetDisconnectCallbackPtr(&onDisconnectedCallback, std::shared_ptr(this)); m_clientId = clientId; m_clientName = clientName; @@ -78,6 +79,7 @@ DisconnectCallbackContextData::~DisconnectCallbackContextData() {} void AWSConnector::disconnectAWS() { + m_reconnect = false; if (isConnected()) { m_client->Disconnect(std::chrono::seconds(2)); } @@ -125,9 +127,28 @@ quint16 AWSConnector::publish(const QString &topic, const QVariantMap &message) void AWSConnector::onConnected() { qCDebug(dcAWS()) << "AWS connected"; + m_client->SetAutoReconnectEnabled(true); registerDevice(); } +void AWSConnector::onDisconnected() +{ + qCDebug(dcAWS()) << "AWS disconnected."; + if (m_reconnect) { + qCDebug(dcAWS()) << "Reconnecting..."; + m_connectingFuture = QtConcurrent::run([&]() { + ResponseCode rc = m_client->Connect(std::chrono::milliseconds(30000), true, mqtt::Version::MQTT_3_1_1, std::chrono::seconds(60), Utf8String::Create(m_clientId.toStdString()), nullptr, nullptr, nullptr); + if (rc == ResponseCode::MQTT_CONNACK_CONNECTION_ACCEPTED) { + emit connected(); + } else { + qCWarning(dcAWS) << "Error connecting to AWS. Response code:" << QString::fromStdString(ResponseHelper::ToString(rc)); + m_client.reset(); + m_networkConnection.reset(); + } + }); + } +} + void AWSConnector::retrievePairedDeviceInfo() { QVariantMap params; @@ -154,7 +175,7 @@ void AWSConnector::setName() { QVariantMap params; params.insert("id", ++m_transactionId); - params.insert("timestamp", QDateTime::currentSecsSinceEpoch()); + params.insert("timestamp", QDateTime::currentMSecsSinceEpoch() / 1000); params.insert("command", "postName"); params.insert("name", m_clientName); publish(QString("%1/device/name").arg(m_clientId), params); @@ -216,7 +237,7 @@ void AWSConnector::subscribeCallback(uint16_t actionId, ResponseCode rc) return; } - qCDebug(dcAWS()) << "Subscribe callback for action" << actionId; + qCDebug(dcAWSTraffic()) << "Successfully subscribed (actionId:" << actionId << ")"; } ResponseCode AWSConnector::onSubscriptionReceivedCallback(util::String topic_name, util::String payload, std::shared_ptr p_app_handler_data) @@ -286,9 +307,12 @@ ResponseCode AWSConnector::onSubscriptionReceivedCallback(util::String topic_nam return ResponseCode::SUCCESS; } -ResponseCode AWSConnector::onDisconnected(util::String mqtt_client_id, std::shared_ptr p_app_handler_data) +ResponseCode AWSConnector::onDisconnectedCallback(util::String mqtt_client_id, std::shared_ptr p_app_handler_data) { Q_UNUSED(p_app_handler_data) qCDebug(dcAWS()) << "disconnected" << QString::fromStdString(mqtt_client_id); + +// AWSConnector* connector = static_cast(p_app_handler_data.get()); +// emit connector->disconnected(); return ResponseCode::SUCCESS; } diff --git a/libguh-core/awsconnector.h b/libguh-core/awsconnector.h index 2b7c78cd..a6b0ba00 100644 --- a/libguh-core/awsconnector.h +++ b/libguh-core/awsconnector.h @@ -45,11 +45,13 @@ public: signals: void connected(); + void disconnected(); void devicePaired(const QString &cognritoUserId, int errorCode); void webRtcHandshakeMessageReceived(const QString &transactionId, const QVariantMap &data); private slots: void onConnected(); + void onDisconnected(); void retrievePairedDeviceInfo(); void registerDevice(); void setName(); @@ -61,12 +63,13 @@ private: static void subscribeCallback(uint16_t actionId, awsiotsdk::ResponseCode rc); static awsiotsdk::ResponseCode onSubscriptionReceivedCallback(awsiotsdk::util::String topic_name, awsiotsdk::util::String payload, std::shared_ptr p_app_handler_data); - static awsiotsdk::ResponseCode onDisconnected(awsiotsdk::util::String mqtt_client_id, + static awsiotsdk::ResponseCode onDisconnectedCallback(awsiotsdk::util::String mqtt_client_id, std::shared_ptr p_app_handler_data); private: std::shared_ptr m_networkConnection; std::shared_ptr m_client; + bool m_reconnect = false; QString m_clientId; QString m_clientName;