diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6b8f3d2..8dd9c71 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,11 @@ project(nuki_hub CXX)
set(LOG_LEVEL ARDUHAL_LOG_LEVEL_NONE)
+# Length of char arrays to store certificates for MQTTS
+add_compile_definitions(TLS_CA_MAX_SIZE=1500)
+add_compile_definitions(TLS_CERT_MAX_SIZE=1500)
+add_compile_definitions(TLS_KEY_MAX_SIZE=1800)
+
include_directories(${PROJECT_NAME}
PRIVATE
lib/Crc16
@@ -83,6 +88,7 @@ target_link_arduino_libraries(${PROJECT_NAME}
PRIVATE
core
WiFi
+ WiFiClientSecure
Update
# WebServer
DNSServer
diff --git a/Network.cpp b/Network.cpp
index 0339e76..91fb69b 100644
--- a/Network.cpp
+++ b/Network.cpp
@@ -42,11 +42,11 @@ void Network::setupDevice(const NetworkDeviceType hardware)
break;
case NetworkDeviceType::WiFi:
Serial.println(F("Network device: Builtin WiFi"));
- _device = new WifiDevice(_hostname);
+ _device = new WifiDevice(_hostname, _preferences);
break;
default:
Serial.println(F("Unknown network device type, defaulting to WiFi"));
- _device = new WifiDevice(_hostname);
+ _device = new WifiDevice(_hostname, _preferences);
break;
}
}
@@ -161,6 +161,8 @@ bool Network::reconnect()
{
Serial.print(F("MQTT connect failed, rc="));
Serial.println(_device->mqttClient()->state());
+ _device->printError();
+ _device->mqttClient()->disconnect();
_mqttConnected = false;
_nextReconnect = millis() + 5000;
}
diff --git a/PreferencesKeys.h b/PreferencesKeys.h
index 8e48fc1..56466db 100644
--- a/PreferencesKeys.h
+++ b/PreferencesKeys.h
@@ -10,6 +10,9 @@
#define preference_mqtt_lock_path "mqttpath"
#define preference_opener_enabled "openerena"
#define preference_mqtt_opener_path "mqttoppath"
+#define preference_mqtt_ca "mqttca"
+#define preference_mqtt_crt "mqttcrt"
+#define preference_mqtt_key "mqttkey"
#define preference_hostname "hostname"
#define preference_network_timeout "nettmout"
#define preference_query_interval_lockstate "lockStInterval"
diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp
index ac258e9..8cec783 100644
--- a/WebCfgServer.cpp
+++ b/WebCfgServer.cpp
@@ -168,6 +168,21 @@ bool WebCfgServer::processArgs(String& message)
_preferences->putString(preference_mqtt_opener_path, value);
configChanged = true;
}
+ else if(key == "MQTTCA")
+ {
+ _preferences->putString(preference_mqtt_ca, value);
+ configChanged = true;
+ }
+ else if(key == "MQTTCRT")
+ {
+ _preferences->putString(preference_mqtt_crt, value);
+ configChanged = true;
+ }
+ else if(key == "MQTTKEY")
+ {
+ _preferences->putString(preference_mqtt_key, value);
+ configChanged = true;
+ }
else if(key == "HOSTNAME")
{
_preferences->putString(preference_hostname, value);
@@ -437,6 +452,9 @@ void WebCfgServer::buildMqttConfigHtml(String &response)
printInputField(response, "MQTTPORT", "MQTT Broker port", _preferences->getInt(preference_mqtt_broker_port), 5);
printInputField(response, "MQTTUSER", "MQTT User (# to clear)", _preferences->getString(preference_mqtt_user).c_str(), 30);
printInputField(response, "MQTTPASS", "MQTT Password", "*", 30, true);
+ printTextarea(response, "MQTTCA", "MQTT SSL CA Certificate", _preferences->getString(preference_mqtt_ca).c_str(), TLS_CA_MAX_SIZE);
+ printTextarea(response, "MQTTCRT", "MQTT SSL Client Certificate", _preferences->getString(preference_mqtt_crt).c_str(), TLS_CERT_MAX_SIZE);
+ printTextarea(response, "MQTTKEY", "MQTT SSL Client Key", _preferences->getString(preference_mqtt_key).c_str(), TLS_KEY_MAX_SIZE);
printInputField(response, "NETTIMEOUT", "Network Timeout until restart (seconds; -1 to disable)", _preferences->getInt(preference_network_timeout), 5);
response.concat("");
response.concat("
");
@@ -580,6 +598,32 @@ void WebCfgServer::printCheckBox(String &response, const char *token, const char
response.concat("/>");
}
+void WebCfgServer::printTextarea(String& response,
+ const char *token,
+ const char *description,
+ const char *value,
+ const size_t maxLength)
+{
+ char maxLengthStr[20];
+
+ itoa(maxLength, maxLengthStr, 10);
+
+ response.concat("