mqtt broker now working

This commit is contained in:
Michael Zanetti 2018-11-19 14:05:11 +01:00
parent 371c2f76c2
commit 8d05f984c0
20 changed files with 520 additions and 72 deletions

View File

@ -100,6 +100,8 @@ ConfigurationHandler::ConfigurationHandler(QObject *parent):
QVariantList webSocketServerConfigurations;
webSocketServerConfigurations.append(JsonTypes::serverConfigurationRef());
returns.insert("webSocketServerConfigurations", webSocketServerConfigurations);
QVariantList mqttServerConfigurations;
mqttServerConfigurations.append(JsonTypes::serverConfigurationRef());
QVariantMap cloudConfiguration;
cloudConfiguration.insert("enabled", JsonTypes::basicTypeToString(JsonTypes::Bool));
returns.insert("cloud", cloudConfiguration);
@ -182,53 +184,129 @@ ConfigurationHandler::ConfigurationHandler(QObject *parent):
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetCloudEnabled", returns);
// MQTT
params.clear(); returns.clear();
setDescription("GetMqttServerConfigurations", "Get all MQTT Server configurations.");
setParams("GetMqttServerConfigurations", params);
returns.insert("mqttServerConfigurations", QVariantList() << JsonTypes::serverConfigurationRef());
setReturns("GetMqttServerConfigurations", returns);
params.clear(); returns.clear();
setDescription("SetMqttServerConfiguration", "Configure a MQTT Server interface on the MQTT broker. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Setting authenticationEnabled to true will require MQTT clients to use credentials set in the MQTT broker policies.");
params.insert("configuration", JsonTypes::serverConfigurationRef());
setParams("SetMqttServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetMqttServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("DeleteMqttServerConfiguration", "Delete a MQTT Server interface of the server.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteMqttServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteMqttServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("GetMqttPolicies", "Get all MQTT broker policies.");
setParams("GetMqttPolicies", params);
returns.insert("mqttPolicies", QVariantList() << JsonTypes::mqttPolicyRef());
setReturns("GetMqttPolicies", returns);
params.clear(); returns.clear();
setDescription("SetMqttPolicy", "Configure a MQTT broker policy. If the ID is an existing one, the existing policy will be modified, otherwise a new one will be added.");
params.insert("policy", JsonTypes::mqttPolicyRef());
setParams("SetMqttPolicy", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetMqttPolicy", returns);
params.clear(); returns.clear();
setDescription("DeleteMqttPolicy", "Delete a MQTT policy from the broker.");
params.insert("clientId", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteMqttPolicy", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteMqttPolicy", returns);
// Notifications
params.clear(); returns.clear();
setDescription("BasicConfigurationChanged", "Emitted whenever the basic configuration of this server changes.");
params.insert("serverName", JsonTypes::basicTypeToString(JsonTypes::String));
params.insert("serverUuid", JsonTypes::basicTypeToString(JsonTypes::Uuid));
params.insert("serverTime", JsonTypes::basicTypeToString(JsonTypes::Uint));
params.insert("timeZone", JsonTypes::basicTypeToString(JsonTypes::String));
params.insert("debugServerEnabled", JsonTypes::basicTypeToString(JsonTypes::Bool));
params.insert("basicConfiguration", basicConfiguration);
setParams("BasicConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("TcpServerConfigurationChanged", "Emitted whenever the TCP server configuration changes.");
params.insert("host", JsonTypes::basicTypeToString(JsonTypes::String));
params.insert("port", JsonTypes::basicTypeToString(JsonTypes::Uint));
setParams("TcpServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("WebServerConfigurationChanged", "Emitted whenever the web server configuration changes.");
params.insert("host", JsonTypes::basicTypeToString(JsonTypes::String));
params.insert("port", JsonTypes::basicTypeToString(JsonTypes::Uint));
setParams("WebServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("WebSocketServerConfigurationChanged", "Emitted whenever the web socket server configuration changes.");
params.insert("host", JsonTypes::basicTypeToString(JsonTypes::String));
params.insert("port", JsonTypes::basicTypeToString(JsonTypes::Uint));
setParams("WebSocketServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("LanguageChanged", "Emitted whenever the language of the server changed. The Plugins, Vendors and DeviceClasses have to be reloaded to get the translated data.");
params.insert("language", JsonTypes::basicTypeToString(JsonTypes::String));
setParams("LanguageChanged", params);
params.clear(); returns.clear();
setDescription("TcpServerConfigurationChanged", "Emitted whenever the TCP server configuration changes.");
params.insert("tcpServerConfiguration", JsonTypes::serverConfigurationRef());
setParams("TcpServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("TcpServerConfigurationRemoved", "Emitted whenever a TCP server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("TcpServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("WebSocketServerConfigurationChanged", "Emitted whenever the web socket server configuration changes.");
params.insert("webSocketServerConfiguration", JsonTypes::serverConfigurationRef());
setParams("WebSocketServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("WebSocketServerConfigurationRemoved", "Emitted whenever a WebSocket server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("WebSocketServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("MqttServerConfigurationChanged", "Emitted whenever the MQTT broker configuration is changed.");
params.insert("mqttServerConfiguration", JsonTypes::serverConfigurationRef());
setParams("MqttServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("MqttServerConfigurationRemoved", "Emitted whenever a MQTT server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("MqttServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("WebServerConfigurationChanged", "Emitted whenever the web server configuration changes.");
params.insert("webServerConfiguration", JsonTypes::webServerConfigurationRef());
setParams("WebServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("WebServerConfigurationRemoved", "Emitted whenever a Web server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("WebServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("CloudConfigurationChanged", "Emitted whenever the cloud configuration is changed.");
params.insert("enabled", JsonTypes::basicTypeToString(JsonTypes::Bool));
params.insert("cloudConfiguration", cloudConfiguration);
setParams("CloudConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("MqttPolicyChanged", "Emitted whenever a MQTT broker policy is changed.");
params.insert("policy", JsonTypes::mqttPolicyRef());
setParams("MqttPolicyChanged", params);
params.clear(); returns.clear();
setDescription("MqttPolicyRemoved", "Emitted whenever a MQTT broker policy is removed.");
params.insert("clientId", JsonTypes::basicTypeToString(QVariant::String));
setParams("MqttPolicyRemoved", params);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::serverNameChanged, this, &ConfigurationHandler::onBasicConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::timeZoneChanged, this, &ConfigurationHandler::onBasicConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::localeChanged, this, &ConfigurationHandler::onBasicConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::debugServerEnabledChanged, this, &ConfigurationHandler::onBasicConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::tcpServerConfigurationChanged, this, &ConfigurationHandler::onTcpServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webServerConfigurationChanged, this, &ConfigurationHandler::onWebServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webSocketServerConfigurationChanged, this, &ConfigurationHandler::onWebSocketServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::cloudEnabledChanged, this, &ConfigurationHandler::onCloudConfigurationChanged);
connect(NymeaCore::instance()->deviceManager(), &DeviceManager::languageUpdated, this, &ConfigurationHandler::onLanguageChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::tcpServerConfigurationChanged, this, &ConfigurationHandler::onTcpServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::tcpServerConfigurationRemoved, this, &ConfigurationHandler::onTcpServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webServerConfigurationChanged, this, &ConfigurationHandler::onWebServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webServerConfigurationRemoved, this, &ConfigurationHandler::onWebServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webSocketServerConfigurationChanged, this, &ConfigurationHandler::onWebSocketServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webSocketServerConfigurationRemoved, this, &ConfigurationHandler::onWebSocketServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttServerConfigurationChanged, this, &ConfigurationHandler::onMqttServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttServerConfigurationRemoved, this, &ConfigurationHandler::onMqttServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttPolicyChanged, this, &ConfigurationHandler::onMqttPolicyChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttPolicyRemoved, this, &ConfigurationHandler::onMqttPolicyRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::cloudEnabledChanged, this, &ConfigurationHandler::onCloudConfigurationChanged);
}
/*! Returns the name of the \l{ConfigurationHandler}. In this case \b Configuration.*/
@ -397,7 +475,7 @@ JsonReply *ConfigurationHandler::SetWebSocketServerConfiguration(const QVariantM
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidPort));
}
qCDebug(dcJsonRpc()) << QString("Configure web socket server %1:%2").arg(config.address.toString()).arg(config.port);
qCDebug(dcJsonRpc()) << QString("Configuring web socket server %1:%2").arg(config.address.toString()).arg(config.port);
NymeaCore::instance()->configuration()->setWebSocketServerConfiguration(config);
@ -414,6 +492,75 @@ JsonReply *ConfigurationHandler::DeleteWebSocketServerConfiguration(const QVaria
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::GetMqttServerConfigurations(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantMap ret;
QVariantList mqttServerConfigs;
foreach (const ServerConfiguration &config, NymeaCore::instance()->configuration()->mqttServerConfigurations()) {
mqttServerConfigs << JsonTypes::packServerConfiguration(config);
}
ret.insert("mqttServerConfigurations", mqttServerConfigs);
return createReply(ret);
}
JsonReply *ConfigurationHandler::SetMqttServerConfiguration(const QVariantMap &params) const
{
ServerConfiguration config = JsonTypes::unpackServerConfiguration(params.value("configuration").toMap());
if (config.id.isEmpty()) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
if (config.address.isNull())
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidHostAddress));
if (config.port <= 0 || config.port > 65535) {
qCWarning(dcJsonRpc()) << "Port out of range";
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidPort));
}
qCDebug(dcJsonRpc()) << QString("Configure MQTT server %1:%2").arg(config.address.toString()).arg(config.port);
NymeaCore::instance()->configuration()->setMqttServerConfiguration(config);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteMqttServerConfiguration(const QVariantMap &params) const
{
QString id = params.value("id").toString();
if (id.isEmpty() || !NymeaCore::instance()->configuration()->mqttServerConfigurations().contains(id)) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
NymeaCore::instance()->configuration()->removeMqttServerConfiguration(id);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::GetMqttPolicies(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantList mqttPolicies;
foreach (const MqttPolicy &policy, NymeaCore::instance()->configuration()->mqttPolicies()) {
mqttPolicies << JsonTypes::packMqttPolicy(policy);
}
QVariantMap ret;
ret.insert("mqttPolicies", mqttPolicies);
return createReply(ret);
}
JsonReply *ConfigurationHandler::SetMqttPolicy(const QVariantMap &params) const
{
MqttPolicy policy = JsonTypes::unpackMqttPolicy(params.value("policy").toMap());
NymeaCore::instance()->configuration()->updateMqttPolicy(policy);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteMqttPolicy(const QVariantMap &params) const
{
QString clientId = params.value("clientId").toString();
bool success = NymeaCore::instance()->configuration()->removeMqttPolicy(clientId);
return createReply(statusToReply(success ? NymeaConfiguration::ConfigurationErrorNoError : NymeaConfiguration::ConfigurationErrorInvalidId));
}
JsonReply *ConfigurationHandler::SetCloudEnabled(const QVariantMap &params) const
{
bool enabled = params.value("enabled").toBool();
@ -430,40 +577,96 @@ JsonReply *ConfigurationHandler::SetDebugServerEnabled(const QVariantMap &params
void ConfigurationHandler::onBasicConfigurationChanged()
{
QVariantMap params;
qCDebug(dcJsonRpc()) << "Notification: Basic configuration changed";
QVariantMap params;
params.insert("basicConfiguration", JsonTypes::packBasicConfiguration());
emit BasicConfigurationChanged(params);
}
void ConfigurationHandler::onTcpServerConfigurationChanged(const QString &id)
{
QVariantMap params;
qCDebug(dcJsonRpc()) << "Notification: TCP server configuration changed";
QVariantMap params;
params.insert("tcpServerConfiguration", JsonTypes::packServerConfiguration(NymeaCore::instance()->configuration()->tcpServerConfigurations().value(id)));
emit TcpServerConfigurationChanged(params);
}
void ConfigurationHandler::onTcpServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc) << "Notification: TCP server configuration removed";
QVariantMap params;
params.insert("id", id);
emit TcpServerConfigurationRemoved(params);
}
void ConfigurationHandler::onWebServerConfigurationChanged(const QString &id)
{
QVariantMap params;
qCDebug(dcJsonRpc()) << "Notification: web server configuration changed";
QVariantMap params;
params.insert("webServerConfiguration", JsonTypes::packWebServerConfiguration(NymeaCore::instance()->configuration()->webServerConfigurations().value(id)));
emit WebServerConfigurationChanged(params);
}
void ConfigurationHandler::onWebServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: Web server configuration removed";
QVariantMap params;
params.insert("id", id);
emit WebServerConfigurationChanged(params);
}
void ConfigurationHandler::onWebSocketServerConfigurationChanged(const QString &id)
{
QVariantMap params;
qCDebug(dcJsonRpc()) << "Notification: web socket server configuration changed";
QVariantMap params;
params.insert("webSocketServerConfiguration", JsonTypes::packServerConfiguration(NymeaCore::instance()->configuration()->webSocketServerConfigurations().value(id)));
emit WebSocketServerConfigurationChanged(params);
}
void ConfigurationHandler::onWebSocketServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: WebSocket server configuration removed";
QVariantMap params;
params.insert("id", id);
emit WebSocketServerConfigurationRemoved(params);
}
void ConfigurationHandler::onMqttServerConfigurationChanged(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT server configuration changed";
QVariantMap params;
params.insert("mqttServerConfiguration", JsonTypes::packServerConfiguration(NymeaCore::instance()->configuration()->mqttServerConfigurations().value(id)));
emit MqttServerConfigurationChanged(params);
}
void ConfigurationHandler::onMqttServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT server configuration removed";
QVariantMap params;
params.insert("id", id);
emit MqttServerConfigurationRemoved(params);
}
void ConfigurationHandler::onMqttPolicyChanged(const QString &clientId)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT policy changed";
QVariantMap params;
params.insert("policy", JsonTypes::packMqttPolicy(NymeaCore::instance()->configuration()->mqttPolicies().value(clientId)));
emit MqttPolicyChanged(params);
}
void ConfigurationHandler::onMqttPolicyRemoved(const QString &clientId)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT policy removed";
QVariantMap params;
params.insert("clientId", clientId);
emit MqttPolicyRemoved(params);
}
void ConfigurationHandler::onCloudConfigurationChanged(bool enabled)
{
qCDebug(dcJsonRpc()) << "Notification: cloud configuration changed";
QVariantMap params;
qCDebug(dcJanus()) << "Notification: cloud configuration changed";
QVariantMap cloudConfiguration;
cloudConfiguration.insert("enabled", enabled);
params.insert("cloudConfiguration", cloudConfiguration);
@ -472,8 +675,8 @@ void ConfigurationHandler::onCloudConfigurationChanged(bool enabled)
void ConfigurationHandler::onLanguageChanged()
{
QVariantMap params;
qCDebug(dcJsonRpc()) << "Notification: language configuration changed";
QVariantMap params;
params.insert("language", NymeaCore::instance()->configuration()->locale().name());
emit LanguageChanged(params);
}

View File

@ -32,7 +32,7 @@ class ConfigurationHandler : public JsonHandler
Q_OBJECT
public:
ConfigurationHandler(QObject *parent = 0);
ConfigurationHandler(QObject *parent = nullptr);
QString name() const;
Q_INVOKABLE JsonReply *GetConfigurations(const QVariantMap &params) const;
@ -41,31 +41,53 @@ public:
Q_INVOKABLE JsonReply *SetServerName(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetTimeZone(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetLanguage(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetDebugServerEnabled(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetCloudEnabled(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetTcpServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *DeleteTcpServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetWebServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *DeleteWebServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetWebSocketServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *DeleteWebSocketServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetCloudEnabled(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetDebugServerEnabled(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *GetMqttServerConfigurations(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetMqttServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *DeleteMqttServerConfiguration(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *GetMqttPolicies(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *SetMqttPolicy(const QVariantMap &params) const;
Q_INVOKABLE JsonReply *DeleteMqttPolicy(const QVariantMap &params) const;
signals:
void BasicConfigurationChanged(const QVariantMap &params);
void TcpServerConfigurationChanged(const QVariantMap &params);
void WebServerConfigurationChanged(const QVariantMap &params);
void WebSocketServerConfigurationChanged(const QVariantMap &params);
void CloudConfigurationChanged(const QVariantMap &params);
// TODO: remove, should be part of BasicConfigurationChanged
void LanguageChanged(const QVariantMap &params);
void CloudConfigurationChanged(const QVariantMap &params);
void TcpServerConfigurationChanged(const QVariantMap &params);
void TcpServerConfigurationRemoved(const QVariantMap &params);
void WebServerConfigurationChanged(const QVariantMap &params);
void WebServerConfigurationRemoved(const QVariantMap &params);
void WebSocketServerConfigurationChanged(const QVariantMap &params);
void WebSocketServerConfigurationRemoved(const QVariantMap &params);
void MqttServerConfigurationChanged(const QVariantMap &params);
void MqttServerConfigurationRemoved(const QVariantMap &params);
void MqttPolicyChanged(const QVariantMap &params);
void MqttPolicyRemoved(const QVariantMap &params);
private slots:
void onBasicConfigurationChanged();
void onTcpServerConfigurationChanged(const QString &id);
void onWebServerConfigurationChanged(const QString &id);
void onWebSocketServerConfigurationChanged(const QString &id);
void onCloudConfigurationChanged(bool enabled);
void onLanguageChanged();
void onCloudConfigurationChanged(bool enabled);
void onTcpServerConfigurationChanged(const QString &id);
void onTcpServerConfigurationRemoved(const QString &id);
void onWebServerConfigurationChanged(const QString &id);
void onWebServerConfigurationRemoved(const QString &id);
void onWebSocketServerConfigurationChanged(const QString &id);
void onWebSocketServerConfigurationRemoved(const QString &id);
void onMqttServerConfigurationChanged(const QString &id);
void onMqttServerConfigurationRemoved(const QString &id);
void onMqttPolicyChanged(const QString &clientId);
void onMqttPolicyRemoved(const QString &clientId);
};
}

View File

@ -88,7 +88,7 @@ class JsonHandler : public QObject
{
Q_OBJECT
public:
explicit JsonHandler(QObject *parent = 0);
explicit JsonHandler(QObject *parent = nullptr);
virtual QString name() const = 0;

View File

@ -203,6 +203,7 @@ JsonRPCServer::JsonRPCServer(const QSslConfiguration &sslConfiguration, QObject
params.clear(); returns.clear();
setDescription("CloudConnectedChanged", "Emitted whenever the cloud connection status changes.");
params.insert("connected", JsonTypes::basicTypeToString(JsonTypes::Bool));
params.insert("connectionState", JsonTypes::cloudConnectionStateRef());
setParams("CloudConnectedChanged", params);
params.clear();
@ -607,15 +608,15 @@ void JsonRPCServer::processJsonPacket(TransportInterface *interface, const QUuid
reply->startWait();
} else {
Q_ASSERT_X((targetNamespace == "JSONRPC" && method == "Introspect") || handler->validateReturns(method, reply->data()).first
,"validating return value", formatAssertion(targetNamespace, method, handler, reply->data()).toLatin1().data());
,"validating return value", formatAssertion(targetNamespace, method, QMetaMethod::Method, handler, reply->data()).toLatin1().data());
sendResponse(interface, clientId, commandId, reply->data());
reply->deleteLater();
}
}
QString JsonRPCServer::formatAssertion(const QString &targetNamespace, const QString &method, JsonHandler *handler, const QVariantMap &data) const
QString JsonRPCServer::formatAssertion(const QString &targetNamespace, const QString &method, QMetaMethod::MethodType methodType, JsonHandler *handler, const QVariantMap &data) const
{
QJsonDocument doc = QJsonDocument::fromVariant(handler->introspect(QMetaMethod::Method).value(targetNamespace + "." + method));
QJsonDocument doc = QJsonDocument::fromVariant(handler->introspect(methodType).value(targetNamespace + "." + method));
QJsonDocument doc2 = QJsonDocument::fromVariant(data);
return QString("\nMethod: %1\nTemplate: %2\nValue: %3")
.arg(targetNamespace + "." + method)
@ -633,6 +634,7 @@ void JsonRPCServer::sendNotification(const QVariantMap &params)
notification.insert("notification", handler->name() + "." + method.name());
notification.insert("params", params);
Q_ASSERT_X(handler->validateParams(method.name(), params).first, "validating return value", formatAssertion(handler->name(), method.name(), QMetaMethod::Signal, handler, notification).toLatin1().data());
QByteArray data = QJsonDocument::fromVariant(notification).toJson(QJsonDocument::Compact);
qCDebug(dcJsonRpcTraffic()) << "Sending notification:" << data;
@ -652,7 +654,7 @@ void JsonRPCServer::asyncReplyFinished()
}
if (!reply->timedOut()) {
Q_ASSERT_X(reply->handler()->validateReturns(reply->method(), reply->data()).first
,"validating return value", formatAssertion(reply->handler()->name(), reply->method(), reply->handler(), reply->data()).toLatin1().data());
,"validating return value", formatAssertion(reply->handler()->name(), reply->method(), QMetaMethod::Method, reply->handler(), reply->data()).toLatin1().data());
sendResponse(interface, reply->clientId(), reply->commandId(), reply->data());
} else {
sendErrorResponse(interface, reply->clientId(), reply->commandId(), "Command timed out");

View File

@ -112,7 +112,7 @@ private:
int m_notificationId;
void registerHandler(JsonHandler *handler);
QString formatAssertion(const QString &targetNamespace, const QString &method, JsonHandler *handler, const QVariantMap &data) const;
QString formatAssertion(const QString &targetNamespace, const QString &method, QMetaMethod::MethodType methodType, JsonHandler *handler, const QVariantMap &data) const;
};
}

View File

@ -125,6 +125,7 @@ QVariantMap JsonTypes::s_tokenInfo;
QVariantMap JsonTypes::s_serverConfiguration;
QVariantMap JsonTypes::s_webServerConfiguration;
QVariantMap JsonTypes::s_tag;
QVariantMap JsonTypes::s_mqttPolicy;
void JsonTypes::init()
{
@ -392,6 +393,13 @@ void JsonTypes::init()
s_webServerConfiguration = s_serverConfiguration;
s_webServerConfiguration.insert("publicFolder", basicTypeToString(QVariant::String));
// MQTT
s_mqttPolicy.insert("clientId", basicTypeToString(QVariant::String));
s_mqttPolicy.insert("username", basicTypeToString(QVariant::String));
s_mqttPolicy.insert("password", basicTypeToString(QVariant::String));
s_mqttPolicy.insert("allowedPublishTopicFilters", basicTypeToString(QVariant::StringList));
s_mqttPolicy.insert("allowedSubscribeTopicFilters", basicTypeToString(QVariant::StringList));
// Tag
s_tag.insert("o:deviceId", basicTypeToString(QVariant::Uuid));
s_tag.insert("o:ruleId", basicTypeToString(QVariant::Uuid));
@ -1197,6 +1205,16 @@ QVariantMap JsonTypes::packWebServerConfiguration(const WebServerConfiguration &
return webServerConfiguration;
}
QVariantMap JsonTypes::packMqttPolicy(const MqttPolicy &policy)
{
QVariantMap policyMap;
policyMap.insert("clientId", policy.clientId);
policyMap.insert("username", policy.username);
policyMap.insert("password", policy.password);
policyMap.insert("allowedPublishTopicFilters", policy.allowedPublishTopicFilters);
policyMap.insert("allowedSubscribeTopicFilters", policy.allowedSubscribeTopicFilters);
return policyMap;
}
/*! Returns a variant list containing all rule descriptions. */
QVariantList JsonTypes::packRuleDescriptions()
@ -1277,6 +1295,8 @@ QString JsonTypes::basicTypeToString(const QVariant::Type &type)
return "Uuid";
case QVariant::String:
return "String";
case QVariant::StringList:
return "StringList";
case QVariant::Int:
return "Int";
case QVariant::UInt:
@ -1674,6 +1694,17 @@ WebServerConfiguration JsonTypes::unpackWebServerConfiguration(const QVariantMap
return webServerConfiguration;
}
MqttPolicy JsonTypes::unpackMqttPolicy(const QVariantMap &mqttPolicyMap)
{
MqttPolicy policy;
policy.clientId = mqttPolicyMap.value("clientId").toString();
policy.username = mqttPolicyMap.value("username").toString();
policy.password = mqttPolicyMap.value("password").toString();
policy.allowedPublishTopicFilters = mqttPolicyMap.value("allowedPublishTopicFilters").toStringList();
policy.allowedSubscribeTopicFilters = mqttPolicyMap.value("allowedSubscribeTopicFilters").toStringList();
return policy;
}
/*! Compairs the given \a map with the given \a templateMap. Returns the error string and false if
the params are not valid. */
QPair<bool, QString> JsonTypes::validateMap(const QVariantMap &templateMap, const QVariantMap &map)
@ -1733,6 +1764,10 @@ QPair<bool, QString> JsonTypes::validateProperty(const QVariant &templateValue,
QString errorString = QString("Param %1 is not a string.").arg(value.toString());
return report(value.canConvert(QVariant::String), errorString);
}
if (strippedTemplateValue == JsonTypes::basicTypeToString(QVariant::StringList)) {
QString errorString = QString("Param %1 is not a string list.").arg(value.toString());
return report(value.canConvert(QVariant::StringList), errorString);
}
if (strippedTemplateValue == JsonTypes::basicTypeToString(QVariant::Bool)) {
QString errorString = QString("Param %1 is not a bool.").arg(value.toString());
return report(value.canConvert(QVariant::Bool), errorString);
@ -1980,6 +2015,12 @@ QPair<bool, QString> JsonTypes::validateVariant(const QVariant &templateVariant,
qCWarning(dcJsonRpc) << "WebServerConfiguration not matching";
return result;
}
} else if (refName == mqttPolicyRef()) {
QPair<bool, QString> result = validateMap(s_mqttPolicy, variant.toMap());
if (!result.first) {
qCWarning(dcJsonRpc) << "MqttPolicy not matching";
return result;
}
} else if (refName == tagRef()) {
QPair<bool, QString> result = validateMap(tagDescription(), variant.toMap());
if (!result.first) {

View File

@ -106,6 +106,7 @@ public:
enum BasicType {
Uuid,
String,
StringList,
Int,
Uint,
Double,
@ -176,6 +177,7 @@ public:
DECLARE_OBJECT(serverConfiguration, "ServerConfiguration")
DECLARE_OBJECT(webServerConfiguration, "WebServerConfiguration")
DECLARE_OBJECT(tag, "Tag")
DECLARE_OBJECT(mqttPolicy, "MqttPolicy")
// pack types
static QVariantMap packEventType(const EventType &eventType);
@ -220,6 +222,7 @@ public:
static QVariantMap packBasicConfiguration();
static QVariantMap packServerConfiguration(const ServerConfiguration &config);
static QVariantMap packWebServerConfiguration(const WebServerConfiguration &config);
static QVariantMap packMqttPolicy(const MqttPolicy &policy);
static QVariantList packRuleDescriptions();
static QVariantList packRuleDescriptions(const QList<Rule> &rules);
@ -254,6 +257,7 @@ public:
static ServerConfiguration unpackServerConfiguration(const QVariantMap &serverConfigurationMap);
static WebServerConfiguration unpackWebServerConfiguration(const QVariantMap &webServerConfigurationMap);
static MqttPolicy unpackMqttPolicy(const QVariantMap &mqttPolicyMap);
// validate
static QPair<bool, QString> validateMap(const QVariantMap &templateMap, const QVariantMap &map);

View File

@ -5,7 +5,7 @@ include(../nymea.pri)
QT += sql qmqtt
INCLUDEPATH += $$top_srcdir/libnymea
LIBS += -L$$top_builddir/libnymea/ -lnymea -lssl -lcrypto -lavahi-common -lavahi-client
LIBS += -L$$top_builddir/libnymea/ -lnymea -lssl -lcrypto -lavahi-common -lavahi-client -lnymea-mqtt
target.path = /usr/lib/$$system('dpkg-architecture -q DEB_HOST_MULTIARCH')
INSTALLS += target
@ -37,6 +37,7 @@ HEADERS += nymeacore.h \
servers/rest/pluginsresource.h \
servers/rest/rulesresource.h \
servers/websocketserver.h \
servers/mqttbroker.h \
jsonrpc/jsonrpcserver.h \
jsonrpc/jsonhandler.h \
jsonrpc/devicehandler.h \
@ -121,6 +122,7 @@ SOURCES += nymeacore.cpp \
servers/rest/logsresource.cpp \
servers/rest/pluginsresource.cpp \
servers/rest/rulesresource.cpp \
servers/mqttbroker.cpp \
jsonrpc/jsonrpcserver.cpp \
jsonrpc/jsonhandler.cpp \
jsonrpc/devicehandler.cpp \

View File

@ -66,7 +66,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
if (settings.childGroups().contains("TcpServer")) {
settings.beginGroup("TcpServer");
if (settings.value("disabled").toBool()) {
qCDebug(dcApplication) << "TCP Server disabled by configuration";
qCDebug(dcApplication) << "TCP server disabled by configuration";
} else if (!settings.childGroups().isEmpty()) {
foreach (const QString &key, settings.childGroups()) {
ServerConfiguration config = readServerConfig("TcpServer", key);
@ -78,7 +78,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
settings.endGroup();
}
if (createDefaults) {
qCWarning(dcApplication) << "No TCP Server configuration found. Generating default of 0.0.0.0:2222";
qCWarning(dcApplication) << "No TCP server configuration found. Generating default of 0.0.0.0:2222";
ServerConfiguration config;
config.id = "default";
config.address = QHostAddress("0.0.0.0");
@ -95,7 +95,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
if (settings.childGroups().contains("WebServer")) {
settings.beginGroup("WebServer");
if (settings.value("disabled").toBool()) {
qCDebug(dcApplication) << "WebServer disabled by configuration";
qCDebug(dcApplication) << "Web server disabled by configuration";
} else if (!settings.childGroups().isEmpty()) {
foreach (const QString &key, settings.childGroups()) {
WebServerConfiguration config = readWebServerConfig(key);
@ -107,7 +107,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
settings.endGroup();
}
if (createDefaults) {
qCWarning(dcApplication) << "No WebServer configuration found. Generating default of 0.0.0.0:3333";
qCWarning(dcApplication) << "No Web server configuration found. Generating default of 0.0.0.0:3333";
WebServerConfiguration insecureConfig;
insecureConfig.id = "insecure";
insecureConfig.address = QHostAddress("0.0.0.0");
@ -136,7 +136,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
if (settings.childGroups().contains("WebSocketServer")) {
settings.beginGroup("WebSocketServer");
if (settings.value("disabled").toBool()) {
qCDebug(dcApplication) << "WebSocket Server disabled by configuration.";
qCDebug(dcApplication) << "WebSocket server disabled by configuration.";
} else if (!settings.childGroups().isEmpty()) {
foreach (const QString &key, settings.childGroups()) {
ServerConfiguration config = readServerConfig("WebSocketServer", key);
@ -148,7 +148,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
settings.endGroup();
}
if (createDefaults) {
qCWarning(dcApplication) << "No WebSocketServer configuration found. Generating default of 0.0.0.0:4444";
qCWarning(dcApplication) << "No WebSocket server configuration found. Generating default of 0.0.0.0:4444";
ServerConfiguration config;
config.id = "default";
config.address = QHostAddress("0.0.0.0");
@ -160,6 +160,34 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
storeServerConfig("WebSocketServer", config);
}
// MQTT Server
createDefaults = !settings.childGroups().contains("MqttServer");
if (settings.childGroups().contains("MqttServer")) {
settings.beginGroup("MqttServer");
if (settings.value("disabled").toBool()) {
qCDebug(dcApplication) << "MQTT server disabled by configuration.";
} else if (!settings.childGroups().isEmpty()) {
foreach (const QString &key, settings.childGroups()) {
ServerConfiguration config = readServerConfig("MqttServer", key);
m_mqttServerConfigs[config.id] = config;
}
} else {
createDefaults = true;
}
settings.endGroup();
}
if (createDefaults) {
qCWarning(dcApplication) << "No MQTT server configuration found. Generating default of 0.0.0.0:1883";
ServerConfiguration config;
config.id = "default";
config.address = QHostAddress("0.0.0.0");
config.port = 1883;
config.sslEnabled = false;
config.authenticationEnabled = true;
m_mqttServerConfigs[config.id] = config;
storeServerConfig("MqttServer", config);
}
// Write defaults for log settings
settings.beginGroup("Logs");
settings.setValue("logDBDriver", logDBDriver());
@ -315,6 +343,48 @@ void NymeaConfiguration::removeWebSocketServerConfiguration(const QString &id)
emit webSocketServerConfigurationRemoved(id);
}
QHash<QString, ServerConfiguration> NymeaConfiguration::mqttServerConfigurations() const
{
return m_mqttServerConfigs;
}
void NymeaConfiguration::setMqttServerConfiguration(const ServerConfiguration &config)
{
m_mqttServerConfigs[config.id] = config;
storeServerConfig("MqttServer", config);
emit mqttServerConfigurationChanged(config.id);
}
void NymeaConfiguration::removeMqttServerConfiguration(const QString &id)
{
m_mqttServerConfigs.take(id);
deleteServerConfig("MqttServer", id);
emit mqttServerConfigurationRemoved(id);
}
QHash<QString, MqttPolicy> NymeaConfiguration::mqttPolicies() const
{
return m_mqttPolicies;
}
void NymeaConfiguration::updateMqttPolicy(const MqttPolicy &policy)
{
m_mqttPolicies[policy.clientId] = policy;
storeMqttPolicy(policy);
emit mqttPolicyChanged(policy.clientId);
}
bool NymeaConfiguration::removeMqttPolicy(const QString &clientId)
{
if (!m_mqttPolicies.contains(clientId)) {
return false;
}
m_mqttPolicies.take(clientId);
deleteMqttPolicy(clientId);
emit mqttPolicyRemoved(clientId);
return true;
}
bool NymeaConfiguration::bluetoothServerEnabled() const
{
NymeaSettings settings(NymeaSettings::SettingsRoleGlobal);
@ -322,7 +392,7 @@ bool NymeaConfiguration::bluetoothServerEnabled() const
return settings.value("enabled", false).toBool();
}
void NymeaConfiguration::setBluetoothServerEnabled(const bool &enabled)
void NymeaConfiguration::setBluetoothServerEnabled(bool enabled)
{
qCDebug(dcApplication()) << "Configuration: Bluetooth server" << (enabled ? "enabled" : "disabled");
@ -330,7 +400,7 @@ void NymeaConfiguration::setBluetoothServerEnabled(const bool &enabled)
settings.beginGroup("BluetoothServer");
settings.setValue("enabled", enabled);
settings.endGroup();
emit bluetoothServerEnabled();
emit bluetoothServerEnabledChanged();
}
bool NymeaConfiguration::cloudEnabled() const
@ -599,6 +669,23 @@ WebServerConfiguration NymeaConfiguration::readWebServerConfig(const QString &id
return config;
}
void NymeaConfiguration::storeMqttPolicy(const MqttPolicy &policy)
{
NymeaSettings settings(NymeaSettings::SettingsRoleMqttPolicies);
settings.beginGroup(policy.clientId);
settings.setValue("username", policy.username);
settings.setValue("password", policy.password);
settings.setValue("allowedPublishTopicFilters", policy.allowedPublishTopicFilters);
settings.setValue("allowedSubscribeTopicFilters", policy.allowedSubscribeTopicFilters);
settings.endGroup();
}
void NymeaConfiguration::deleteMqttPolicy(const QString &clientId)
{
NymeaSettings settings(NymeaSettings::SettingsRoleMqttPolicies);
settings.remove(clientId);
}
QDebug operator <<(QDebug debug, const ServerConfiguration &configuration)
{
debug.nospace() << "ServerConfiguration(" << configuration.address;

View File

@ -37,7 +37,7 @@ public:
bool sslEnabled = true;
bool authenticationEnabled = true;
bool operator==(const ServerConfiguration &other) {
bool operator==(const ServerConfiguration &other) const {
return id == other.id
&& address == other.address
&& port == other.port
@ -48,7 +48,6 @@ public:
QDebug operator <<(QDebug debug, const ServerConfiguration &configuration);
class WebServerConfiguration: public ServerConfiguration
{
public:
@ -56,6 +55,17 @@ public:
bool restServerEnabled = false;
};
class MqttPolicy
{
public:
QString clientId;
QString username;
QString password;
QStringList allowedSubscribeTopicFilters;
QStringList allowedPublishTopicFilters;
};
typedef QList<MqttPolicy> MqttPolicies;
class NymeaConfiguration : public QObject
{
Q_OBJECT
@ -73,7 +83,7 @@ public:
ConfigurationErrorInvalidCertificate
};
explicit NymeaConfiguration(QObject *parent = 0);
explicit NymeaConfiguration(QObject *parent = nullptr);
// Global settings
QUuid serverUuid() const;
@ -110,9 +120,18 @@ public:
void setWebSocketServerConfiguration(const ServerConfiguration &config);
void removeWebSocketServerConfiguration(const QString &id);
// MQTT
QHash<QString, ServerConfiguration> mqttServerConfigurations() const;
void setMqttServerConfiguration(const ServerConfiguration &config);
void removeMqttServerConfiguration(const QString &id);
QHash<QString, MqttPolicy> mqttPolicies() const;
void updateMqttPolicy(const MqttPolicy &policy);
bool removeMqttPolicy(const QString &clientId);
// Bluetooth
bool bluetoothServerEnabled() const;
void setBluetoothServerEnabled(const bool &enabled);
void setBluetoothServerEnabled(bool enabled);
// Cloud
bool cloudEnabled() const;
@ -139,6 +158,8 @@ private:
QHash<QString, ServerConfiguration> m_tcpServerConfigs;
QHash<QString, WebServerConfiguration> m_webServerConfigs;
QHash<QString, ServerConfiguration> m_webSocketServerConfigs;
QHash<QString, ServerConfiguration> m_mqttServerConfigs;
QHash<QString, MqttPolicy> m_mqttPolicies;
void setServerUuid(const QUuid &uuid);
void setWebServerPublicFolder(const QString & path);
@ -151,6 +172,10 @@ private:
void storeWebServerConfig(const WebServerConfiguration &config);
WebServerConfiguration readWebServerConfig(const QString &id);
void storeMqttPolicy(const MqttPolicy &policy);
MqttPolicy readMqttPolicy(const QString &clientId);
void deleteMqttPolicy(const QString &clientId);
signals:
void serverNameChanged(const QString &serverName);
void timeZoneChanged();
@ -162,12 +187,21 @@ signals:
void webServerConfigurationRemoved(const QString &configId);
void webSocketServerConfigurationChanged(const QString &configId);
void webSocketServerConfigurationRemoved(const QString &configId);
void mqttServerConfigurationChanged(const QString &configId);
void mqttServerConfigurationRemoved(const QString &configId);
void mqttPolicyChanged(const QString &clientId);
void mqttPolicyRemoved(const QString &clientId);
void bluetoothServerEnabledChanged();
void mqttBrokerEnabledChanged();
void mqttPortChanged();
void cloudEnabledChanged(bool enabled);
void debugServerEnabledChanged(bool enabled);
};
}
Q_DECLARE_METATYPE(nymeaserver::ServerConfiguration)
Q_DECLARE_METATYPE(nymeaserver::MqttPolicy)
#endif // NYMEACONFIGURATION_H

View File

@ -37,7 +37,6 @@
#include "nymeacore.h"
#include "certificategenerator.h"
#include "nymeasettings.h"
#include "nymeaconfiguration.h"
#include "jsonrpc/jsonrpcserver.h"
#include "servers/mocktcpserver.h"
@ -46,6 +45,7 @@
#include "servers/websocketserver.h"
#include "servers/webserver.h"
#include "servers/bluetoothserver.h"
#include "servers/mqttbroker.h"
#include <QSslCertificate>
#include <QSslConfiguration>
@ -130,7 +130,10 @@ ServerManager::ServerManager(NymeaConfiguration *configuration, QObject *parent)
m_webServers.insert(config.id, webServer);
}
m_mqttBroker = new MqttBroker(this);
foreach (const ServerConfiguration &config, configuration->mqttServerConfigurations()) {
m_mqttBroker->startServer(config);
}
connect(configuration, &NymeaConfiguration::tcpServerConfigurationChanged, this, &ServerManager::tcpServerConfigurationChanged);
connect(configuration, &NymeaConfiguration::tcpServerConfigurationRemoved, this, &ServerManager::tcpServerConfigurationRemoved);
@ -138,6 +141,10 @@ ServerManager::ServerManager(NymeaConfiguration *configuration, QObject *parent)
connect(configuration, &NymeaConfiguration::webSocketServerConfigurationRemoved, this, &ServerManager::webSocketServerConfigurationRemoved);
connect(configuration, &NymeaConfiguration::webServerConfigurationChanged, this, &ServerManager::webServerConfigurationChanged);
connect(configuration, &NymeaConfiguration::webServerConfigurationRemoved, this, &ServerManager::webServerConfigurationRemoved);
connect(configuration, &NymeaConfiguration::mqttServerConfigurationChanged, this, &ServerManager::mqttServerConfigurationChanged);
connect(configuration, &NymeaConfiguration::mqttServerConfigurationRemoved, this, &ServerManager::mqttServerConfigurationRemoved);
connect(configuration, &NymeaConfiguration::mqttPolicyChanged, this, &ServerManager::mqttPolicyChanged);
connect(configuration, &NymeaConfiguration::mqttPolicyRemoved, this, &ServerManager::mqttPolicyRemoved);
}
/*! Returns the pointer to the created \l{JsonRPCServer} in this \l{ServerManager}. */
@ -164,6 +171,11 @@ MockTcpServer *ServerManager::mockTcpServer() const
return m_mockTcpServer;
}
MqttBroker *ServerManager::mqttBroker() const
{
return m_mqttBroker;
}
void ServerManager::tcpServerConfigurationChanged(const QString &id)
{
ServerConfiguration config = NymeaCore::instance()->configuration()->tcpServerConfigurations().value(id);
@ -249,6 +261,30 @@ void ServerManager::webServerConfigurationRemoved(const QString &id)
server->deleteLater();
}
void ServerManager::mqttServerConfigurationChanged(const QString &id)
{
ServerConfiguration config = NymeaCore::instance()->configuration()->mqttServerConfigurations().value(id);
if (m_mqttBroker->isRunning(id)) {
m_mqttBroker->stopServer(id);
}
m_mqttBroker->startServer(config, m_sslConfiguration);
}
void ServerManager::mqttServerConfigurationRemoved(const QString &id)
{
m_mqttBroker->stopServer(id);
}
void ServerManager::mqttPolicyChanged(const QString &clientId)
{
m_mqttBroker->updatePolicy(NymeaCore::instance()->configuration()->mqttPolicies().value(clientId));
}
void ServerManager::mqttPolicyRemoved(const QString &clientId)
{
m_mqttBroker->removePolicy(clientId);
}
bool ServerManager::loadCertificate(const QString &certificateKeyFileName, const QString &certificateFileName)
{
QFile certificateKeyFile(certificateKeyFileName);

View File

@ -24,6 +24,7 @@
#include <QObject>
#include "loggingcategories.h"
#include "nymeaconfiguration.h"
#include <QSslConfiguration>
#include <QSslKey>
@ -55,6 +56,8 @@ public:
MockTcpServer *mockTcpServer() const;
MqttBroker *mqttBroker() const;
private slots:
void tcpServerConfigurationChanged(const QString &id);
void tcpServerConfigurationRemoved(const QString &id);
@ -62,6 +65,10 @@ private slots:
void webSocketServerConfigurationRemoved(const QString &id);
void webServerConfigurationChanged(const QString &id);
void webServerConfigurationRemoved(const QString &id);
void mqttServerConfigurationChanged(const QString &id);
void mqttServerConfigurationRemoved(const QString &id);
void mqttPolicyChanged(const QString &clientId);
void mqttPolicyRemoved(const QString &clientId);
private:
// Interfaces
@ -74,6 +81,8 @@ private:
QHash<QString, WebServer*> m_webServers;
MockTcpServer *m_mockTcpServer;
MqttBroker *m_mqttBroker;
// Encrytption and stuff
QSslConfiguration m_sslConfiguration;
QSslKey m_certificateKey;

View File

@ -53,3 +53,4 @@ Q_LOGGING_CATEGORY(dcJanus, "Janus")
Q_LOGGING_CATEGORY(dcJanusTraffic, "JanusTraffic")
Q_LOGGING_CATEGORY(dcBluetoothServer, "BluetoothServer")
Q_LOGGING_CATEGORY(dcBluetoothServerTraffic, "BluetoothServerTraffic")
Q_LOGGING_CATEGORY(dcMqtt, "Mqtt")

View File

@ -61,5 +61,6 @@ Q_DECLARE_LOGGING_CATEGORY(dcJanus)
Q_DECLARE_LOGGING_CATEGORY(dcJanusTraffic)
Q_DECLARE_LOGGING_CATEGORY(dcBluetoothServer)
Q_DECLARE_LOGGING_CATEGORY(dcBluetoothServerTraffic)
Q_DECLARE_LOGGING_CATEGORY(dcMqtt)
#endif // LOGGINGCATEGORYS_H

View File

@ -104,6 +104,9 @@ NymeaSettings::NymeaSettings(const SettingsRole &role, QObject *parent):
case SettingsRoleTags:
fileName = "tags.conf";
break;
case SettingsRoleMqttPolicies:
fileName = "mqttpolicies.conf";
break;
}
m_settings = new QSettings(basePath + settingsPrefix + fileName, QSettings::IniFormat, this);
}

View File

@ -41,7 +41,8 @@ public:
SettingsRolePlugins,
SettingsRoleGlobal,
SettingsRoleDeviceStates,
SettingsRoleTags
SettingsRoleTags,
SettingsRoleMqttPolicies,
};
explicit NymeaSettings(const SettingsRole &role = SettingsRoleNone, QObject *parent = nullptr);

View File

@ -6,7 +6,7 @@ NYMEA_PLUGINS_PATH=/usr/lib/$$system('dpkg-architecture -q DEB_HOST_MULTIARCH')/
# define protocol versions
JSON_PROTOCOL_VERSION_MAJOR=1
JSON_PROTOCOL_VERSION_MINOR=10
JSON_PROTOCOL_VERSION_MINOR=11
REST_API_VERSION=1
DEFINES += NYMEA_VERSION_STRING=\\\"$${NYMEA_VERSION_STRING}\\\" \

View File

@ -131,7 +131,8 @@ int main(int argc, char *argv[])
"Janus",
"JanusTraffic",
"BluetoothServer",
"BluetoothServerTraffic"
"BluetoothServerTraffic",
"Mqtt"
};
QStringList loggingFiltersPlugins;

View File

@ -23,4 +23,5 @@ SUBDIRS = versioning \
timemanager \
userloading \
usermanager \
mqttbroker \
tags \

View File

@ -230,7 +230,7 @@ QVariant NymeaTestBase::checkNotification(const QSignalSpy &spy, const QString &
QVariantList NymeaTestBase::checkNotifications(const QSignalSpy &spy, const QString &notification)
{
//qDebug() << "Got" << spy.count() << "notifications while waiting for" << notification;
// qWarning() << "Got" << spy.count() << "notifications while waiting for" << notification;
QVariantList notificationList;
for (int i = 0; i < spy.count(); i++) {
// Make sure the response it a valid JSON string