some more work for latest api changes
This commit is contained in:
parent
a2b55cfc2f
commit
c040a71cdb
@ -42,7 +42,7 @@ AWSConnector::~AWSConnector()
|
||||
{
|
||||
}
|
||||
|
||||
void AWSConnector::connect2AWS(const QString &endpoint, const QString &clientId, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile)
|
||||
void AWSConnector::connect2AWS(const QString &endpoint, const QString &clientId, const QString &clientName, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile)
|
||||
{
|
||||
m_networkConnection = std::shared_ptr<MbedTLSConnection>(new MbedTLSConnection(
|
||||
endpoint.toStdString(),
|
||||
@ -59,6 +59,7 @@ void AWSConnector::connect2AWS(const QString &endpoint, const QString &clientId,
|
||||
m_client->SetDisconnectCallbackPtr(&onDisconnected, std::shared_ptr<DisconnectCallbackContextData>(this));
|
||||
m_client->SetAutoReconnectEnabled(true);
|
||||
m_clientId = clientId;
|
||||
m_clientName = clientName;
|
||||
|
||||
qCDebug(dcAWS()) << "Connecting to AWS with ID:" << m_clientId << "endpoint:" << endpoint;
|
||||
m_connectingFuture = QtConcurrent::run([&]() {
|
||||
@ -121,25 +122,10 @@ quint16 AWSConnector::publish(const QString &topic, const QVariantMap &message)
|
||||
return packetId;
|
||||
}
|
||||
|
||||
void AWSConnector::subscribe(const QStringList &topics)
|
||||
{
|
||||
m_subscribedTopics.append(topics);
|
||||
|
||||
if (!isConnected()) {
|
||||
qCDebug(dcAWS()) << "Can't subscribe to AWS: Not connected. Subscription will happen upon next connection.";
|
||||
return;
|
||||
}
|
||||
doSubscribe(topics);
|
||||
}
|
||||
|
||||
void AWSConnector::onConnected()
|
||||
{
|
||||
qCDebug(dcAWS()) << "AWS connected";
|
||||
registerDevice();
|
||||
retrievePairedDeviceInfo();
|
||||
if (!m_subscribedTopics.isEmpty()) {
|
||||
doSubscribe(m_subscribedTopics);
|
||||
}
|
||||
}
|
||||
|
||||
void AWSConnector::retrievePairedDeviceInfo()
|
||||
@ -147,7 +133,8 @@ void AWSConnector::retrievePairedDeviceInfo()
|
||||
QVariantMap params;
|
||||
params.insert("timestamp", QDateTime::currentMSecsSinceEpoch());
|
||||
params.insert("id", ++m_transactionId);
|
||||
publish(QString("%1/pair/list").arg(m_clientId), params);
|
||||
params.insert("command", "getUsers");
|
||||
publish(QString("%1/device/users").arg(m_clientId), params);
|
||||
}
|
||||
|
||||
void AWSConnector::registerDevice()
|
||||
@ -157,19 +144,23 @@ void AWSConnector::registerDevice()
|
||||
// call we need to subscribe to a topic every device can subscribe to. If we'd use our deviceId, a potential
|
||||
// black hat could snoop in all the devices we register on the system. So in case someone actually does that
|
||||
// let's give him meaningless IDs instead of real device ids.
|
||||
QString tmpId = QUuid::createUuid().toString().remove(QRegExp("[{}]*"));
|
||||
m_createDeviceId = QUuid::createUuid().toString().remove(QRegExp("[{}]*"));
|
||||
|
||||
// first subscribe to this tmp id topic
|
||||
subscribe({QString("create/device/%1").arg(tmpId)});
|
||||
|
||||
// and register ourselves
|
||||
QVariantMap params;
|
||||
params.insert("id", tmpId);
|
||||
params.insert("UUID", m_clientId);
|
||||
publish("create/device", params);
|
||||
m_createDeviceSubscriptionId = subscribe({QString("create/device/%1").arg(m_createDeviceId)});
|
||||
}
|
||||
|
||||
void AWSConnector::doSubscribe(const QStringList &topics)
|
||||
void AWSConnector::setName()
|
||||
{
|
||||
QVariantMap params;
|
||||
params.insert("id", ++m_transactionId);
|
||||
params.insert("timestamp", QDateTime::currentSecsSinceEpoch());
|
||||
params.insert("command", "postName");
|
||||
params.insert("name", m_clientName);
|
||||
publish(QString("%1/device/name").arg(m_clientId), params);
|
||||
}
|
||||
|
||||
quint16 AWSConnector::subscribe(const QStringList &topics)
|
||||
{
|
||||
util::Vector<std::shared_ptr<mqtt::Subscription>> subscription_list;
|
||||
foreach (const QString &topic, topics) {
|
||||
@ -181,7 +172,9 @@ void AWSConnector::doSubscribe(const QStringList &topics)
|
||||
uint16_t packetId;
|
||||
ResponseCode res = m_client->SubscribeAsync(subscription_list, subscribeCallback, packetId);
|
||||
qCDebug(dcAWSTraffic()) << "subscribe call queued with status:" << QString::fromStdString(ResponseHelper::ToString(res)) << packetId;
|
||||
qWarning() << "'''" << s_requestMap.count();
|
||||
s_requestMap.insert(packetId, this);
|
||||
return packetId;
|
||||
}
|
||||
|
||||
void AWSConnector::publishCallback(uint16_t actionId, ResponseCode rc)
|
||||
@ -203,7 +196,27 @@ void AWSConnector::publishCallback(uint16_t actionId, ResponseCode rc)
|
||||
|
||||
void AWSConnector::subscribeCallback(uint16_t actionId, ResponseCode rc)
|
||||
{
|
||||
qCDebug(dcAWS()) << "subscribed to topic" << actionId << QString::fromStdString(ResponseHelper::ToString(rc));
|
||||
if (rc != ResponseCode::SUCCESS) {
|
||||
qCWarning(dcAWS()) << "Error subscribing to" << actionId << QString::fromStdString(ResponseHelper::ToString(rc));
|
||||
return;
|
||||
}
|
||||
|
||||
AWSConnector *connector = s_requestMap.take(actionId);
|
||||
if (!connector) {
|
||||
qCWarning(dcAWS()) << "received a subscribe callback but don't have a request id for it.";
|
||||
return;
|
||||
}
|
||||
|
||||
if (actionId == connector->m_createDeviceSubscriptionId) {
|
||||
qCDebug(dcAWS()) << "subscribed to create/device/response";
|
||||
QVariantMap params;
|
||||
params.insert("id", connector->m_createDeviceId);
|
||||
params.insert("UUID", connector->m_clientId);
|
||||
connector->publish("create/device", params);
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(dcAWS()) << "Subscribe callback for action" << actionId;
|
||||
}
|
||||
|
||||
ResponseCode AWSConnector::onSubscriptionReceivedCallback(util::String topic_name, util::String payload, std::shared_ptr<SubscriptionHandlerContextData> p_app_handler_data)
|
||||
@ -220,12 +233,19 @@ ResponseCode AWSConnector::onSubscriptionReceivedCallback(util::String topic_nam
|
||||
if (topic.startsWith("create/device/")) {
|
||||
int statusCode = jsonDoc.toVariant().toMap().value("result").toMap().value("code").toInt();
|
||||
if (statusCode != 200) {
|
||||
qCWarning(dcAWS()) << "Error registering device in the cloud. AWS connetion will not work.";
|
||||
qCWarning(dcAWS()) << "Error registering device in the cloud. AWS connetion will not work:" << statusCode;
|
||||
return ResponseCode::SUCCESS;
|
||||
}
|
||||
qCDebug(dcAWS()) << "Device registered in cloud";
|
||||
connector->subscribe({QString("%1/pair/response").arg(connector->m_clientId),
|
||||
QString("%1/pair/list/response").arg(connector->m_clientId)});
|
||||
|
||||
QStringList subscriptions;
|
||||
subscriptions.append(QString("%1/pair/response").arg(connector->m_clientId));
|
||||
subscriptions.append(QString("%1/device/users/response").arg(connector->m_clientId));
|
||||
connector->subscribe(subscriptions);
|
||||
|
||||
connector->retrievePairedDeviceInfo();
|
||||
connector->setName();
|
||||
|
||||
} else if (topic == QString("%1/pair/response").arg(connector->m_clientId)) {
|
||||
int statusCode = jsonDoc.toVariant().toMap().value("status").toInt();
|
||||
int id = jsonDoc.toVariant().toMap().value("id").toInt();
|
||||
@ -237,13 +257,15 @@ ResponseCode AWSConnector::onSubscriptionReceivedCallback(util::String topic_nam
|
||||
} else {
|
||||
qCWarning(dcAWS()) << "Received a pairing response for a transaction we didn't start";
|
||||
}
|
||||
} else if (topic == QString("%1/pair/list/response").arg(connector->m_clientId)) {
|
||||
} else if (topic == QString("%1/device/users/response").arg(connector->m_clientId)) {
|
||||
qCDebug(dcAWS) << "have device pairings:" << jsonDoc.toVariant().toMap().value("pairings").toList();
|
||||
QStringList topics;
|
||||
foreach (const QVariant &pairing, jsonDoc.toVariant().toMap().value("pairings").toList()) {
|
||||
topics << QString("eu-west-1:%1/listeningPeer/#").arg(pairing.toMap().value("cognitoIdIdentityId").toString());
|
||||
}
|
||||
connector->subscribe(topics);
|
||||
} else if (topic == QString("%1/device/name/response").arg(connector->m_clientId)) {
|
||||
qCDebug(dcAWS) << "Set device name in cloud with status:" << jsonDoc.toVariant().toMap().value("status").toInt();
|
||||
} else if (topic.contains("listeningPeer") && !topic.contains("reply")) {
|
||||
static QStringList dupes;
|
||||
QString id = jsonDoc.toVariant().toMap().value("id").toString();
|
||||
|
||||
@ -35,7 +35,7 @@ public:
|
||||
explicit AWSConnector(QObject *parent = 0);
|
||||
~AWSConnector();
|
||||
|
||||
void connect2AWS(const QString &endpoint, const QString &clientId, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile);
|
||||
void connect2AWS(const QString &endpoint, const QString &clientId, const QString &clientName, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile);
|
||||
void disconnectAWS();
|
||||
bool isConnected() const;
|
||||
|
||||
@ -52,11 +52,11 @@ private slots:
|
||||
void onConnected();
|
||||
void retrievePairedDeviceInfo();
|
||||
void registerDevice();
|
||||
void setName();
|
||||
|
||||
private:
|
||||
quint16 publish(const QString &topic, const QVariantMap &message);
|
||||
void subscribe(const QStringList &topics);
|
||||
void doSubscribe(const QStringList &topcis);
|
||||
quint16 subscribe(const QStringList &topics);
|
||||
static void publishCallback(uint16_t actionId, awsiotsdk::ResponseCode rc);
|
||||
static void subscribeCallback(uint16_t actionId, awsiotsdk::ResponseCode rc);
|
||||
static awsiotsdk::ResponseCode onSubscriptionReceivedCallback(awsiotsdk::util::String topic_name, awsiotsdk::util::String payload,
|
||||
@ -69,10 +69,12 @@ private:
|
||||
std::shared_ptr<awsiotsdk::MqttClient> m_client;
|
||||
|
||||
QString m_clientId;
|
||||
QString m_clientName;
|
||||
QFuture<void> m_connectingFuture;
|
||||
QStringList m_subscribedTopics;
|
||||
|
||||
int m_transactionId = 0;
|
||||
QString m_createDeviceId;
|
||||
int m_createDeviceSubscriptionId = 0;
|
||||
QHash<quint16, QString> m_pairingRequests;
|
||||
|
||||
static QHash<quint16, AWSConnector*> s_requestMap;
|
||||
|
||||
@ -46,6 +46,11 @@ void CloudManager::setDeviceId(const QUuid &deviceId)
|
||||
m_deviceId = deviceId;
|
||||
}
|
||||
|
||||
void CloudManager::setDeviceName(const QString &name)
|
||||
{
|
||||
m_deviceName = name;
|
||||
}
|
||||
|
||||
void CloudManager::setClientCertificates(const QString &caCertificate, const QString &clientCertificate, const QString &clientCertificateKey)
|
||||
{
|
||||
m_caCertificate = caCertificate;
|
||||
@ -66,7 +71,10 @@ void CloudManager::setEnabled(bool enabled)
|
||||
qCWarning(dcCloud()) << "Don't have a unique device ID.";
|
||||
missingConfig = true;
|
||||
}
|
||||
|
||||
if (m_deviceName.isEmpty()) {
|
||||
qCWarning(dcCloud()) << "Don't have a device name set";
|
||||
missingConfig = true;
|
||||
}
|
||||
if (m_serverUrl.isEmpty()) {
|
||||
qCWarning(dcCloud()) << "Cloud server URL not set.";
|
||||
missingConfig = true;
|
||||
@ -105,6 +113,7 @@ void CloudManager::connect2aws()
|
||||
m_awsConnector->connect2AWS(m_serverUrl,
|
||||
"1e10fb7e-d9d9-4145-88dd-2d3caf623c18", // micha's test id (needs micha's test certs) - remove that before merging
|
||||
// m_deviceId.toString().remove(QRegExp("[{}]*")),
|
||||
m_deviceName,
|
||||
m_caCertificate,
|
||||
m_clientCertificate,
|
||||
m_clientCertificateKey
|
||||
|
||||
@ -39,6 +39,7 @@ public:
|
||||
|
||||
void setServerUrl(const QString &serverUrl);
|
||||
void setDeviceId(const QUuid &deviceId);
|
||||
void setDeviceName(const QString &name);
|
||||
void setClientCertificates(const QString &caCertificate, const QString &clientCertificate, const QString &clientCertificateKey);
|
||||
|
||||
bool enabled() const;
|
||||
@ -67,6 +68,7 @@ private:
|
||||
|
||||
QString m_serverUrl;
|
||||
QUuid m_deviceId;
|
||||
QString m_deviceName;
|
||||
QString m_caCertificate;
|
||||
QString m_clientCertificate;
|
||||
QString m_clientCertificateKey;
|
||||
|
||||
@ -448,6 +448,7 @@ void GuhCore::init() {
|
||||
|
||||
m_cloudManager = new CloudManager(m_networkManager, this);
|
||||
m_cloudManager->setDeviceId(m_configuration->serverUuid());
|
||||
m_cloudManager->setDeviceName(m_configuration->serverName());
|
||||
m_cloudManager->setServerUrl(m_configuration->cloudServerUrl());
|
||||
m_cloudManager->setClientCertificates(m_configuration->cloudCertificateCA(), m_configuration->cloudCertificate(), m_configuration->cloudCertificateKey());
|
||||
if (!m_configuration->cloudServerUrl().isEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user