diff --git a/src/config/settings.h b/src/config/settings.h index ea864ede..ebb78586 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -68,11 +68,11 @@ typedef struct { } cfgLed_t; typedef struct { - char broker[MQTT_ADDR_LEN]; + String broker; uint16_t port; - char user[MQTT_USER_LEN]; + String user; char pwd[MQTT_PWD_LEN]; - char topic[MQTT_TOPIC_LEN]; + String topic; } cfgMqtt_t; typedef struct { @@ -272,10 +272,10 @@ class settings { mCfg.serial.debug = false; mCfg.mqtt.port = DEF_MQTT_PORT; - snprintf(mCfg.mqtt.broker, MQTT_ADDR_LEN, "%s", DEF_MQTT_BROKER); - snprintf(mCfg.mqtt.user, MQTT_USER_LEN, "%s", DEF_MQTT_USER); + mCfg.mqtt.broker = DEF_MQTT_BROKER; + mCfg.mqtt.user = DEF_MQTT_USER; snprintf(mCfg.mqtt.pwd, MQTT_PWD_LEN, "%s", DEF_MQTT_PWD); - snprintf(mCfg.mqtt.topic, MQTT_TOPIC_LEN, "%s", DEF_MQTT_TOPIC); + mCfg.mqtt.topic = DEF_MQTT_TOPIC; mCfg.led.led0 = DEF_LED0_PIN; mCfg.led.led1 = DEF_LED1_PIN; @@ -366,10 +366,10 @@ class settings { obj[F("topic")] = mCfg.mqtt.topic; } else { mCfg.mqtt.port = obj[F("port")]; - snprintf(mCfg.mqtt.broker, MQTT_ADDR_LEN, "%s", obj[F("broker")].as()); - snprintf(mCfg.mqtt.user, MQTT_USER_LEN, "%s", obj[F("user")].as()); + mCfg.mqtt.broker = obj[F("broker")].as(); + mCfg.mqtt.user = obj[F("user")].as(); snprintf(mCfg.mqtt.pwd, MQTT_PWD_LEN, "%s", obj[F("pwd")].as()); - snprintf(mCfg.mqtt.topic, MQTT_TOPIC_LEN, "%s", obj[F("topic")].as()); + mCfg.mqtt.topic = obj[F("topic")].as(); } } diff --git a/src/defines.h b/src/defines.h index 1c2e5d23..62c61a9f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -85,10 +85,7 @@ union serial_u { #define DEVNAME_LEN 16 #define NTP_ADDR_LEN 32 // DNS Name -#define MQTT_ADDR_LEN 32 // DNS Name -#define MQTT_USER_LEN 16 -#define MQTT_PWD_LEN 32 -#define MQTT_TOPIC_LEN 64 +#define MQTT_PWD_LEN 64 #define MQTT_MAX_PACKET_SIZE 384 diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index f3ff4eb1..895d9398 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -44,7 +44,7 @@ class PubMqtt { mSunrise = sunrise; mSunset = sunset; - mClient->setServer(mCfg_mqtt->broker, mCfg_mqtt->port); + mClient->setServer(mCfg_mqtt->broker.c_str(), mCfg_mqtt->port); mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); setCallback(std::bind(&PubMqtt::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); @@ -107,7 +107,7 @@ class PubMqtt { return mTxCnt; } - void sendMqttDiscoveryConfig(const char *topic) { + void sendMqttDiscoveryConfig(String topic) { DPRINTLN(DBG_VERBOSE, F("sendMqttDiscoveryConfig")); char stateTopic[64], discoveryTopic[64], buffer[512], name[32], uniq_id[32]; @@ -173,23 +173,21 @@ class PubMqtt { if(strlen(mDevName) > 0) { // der Server und der Port müssen neu gesetzt werden, // da ein MQTT_CONNECTION_LOST -3 die Werte zerstört hat. - mClient->setServer(mCfg_mqtt->broker, mCfg_mqtt->port); + mClient->setServer(mCfg_mqtt->broker.c_str(), mCfg_mqtt->port); mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); - char lwt[MQTT_TOPIC_LEN + 7 ]; // "/uptime" --> + 7 byte - snprintf(lwt, MQTT_TOPIC_LEN + 7, "%s/uptime", mCfg_mqtt->topic); + String lwt = mCfg_mqtt->topic + "/uptime"; - if((strlen(mCfg_mqtt->user) > 0) && (strlen(mCfg_mqtt->pwd) > 0)) - resub = mClient->connect(mDevName, mCfg_mqtt->user, mCfg_mqtt->pwd, lwt, 0, false, "offline"); + if((mCfg_mqtt->user.length() > 0) && (strlen(mCfg_mqtt->pwd) > 0)) + resub = mClient->connect(mDevName, mCfg_mqtt->user.c_str(), mCfg_mqtt->pwd, lwt.c_str(), 0, false, "offline"); else - resub = mClient->connect(mDevName, lwt, 0, false, "offline"); + resub = mClient->connect(mDevName, lwt.c_str(), 0, false, "offline"); // ein Subscribe ist nur nach einem connect notwendig if(resub) { - char topic[MQTT_TOPIC_LEN + 13 ]; // "/devcontrol/#" --> + 6 byte // ToDo: "/devcontrol/#" is hardcoded - snprintf(topic, MQTT_TOPIC_LEN + 13, "%s/devcontrol/#", mCfg_mqtt->topic); - DPRINTLN(DBG_INFO, F("subscribe to ") + String(topic)); - mClient->subscribe(topic); // subscribe to mTopic + "/devcontrol/#" + String topic = mCfg_mqtt->topic + "/devcontrol/#"; // "/devcontrol/#" + DPRINTLN(DBG_INFO, F("subscribe to ") + topic); + mClient->subscribe(&topic); // subscribe to mTopic + "/devcontrol/#" } } } diff --git a/src/web/web.cpp b/src/web/web.cpp index 45be992e..ce7e7bf8 100644 --- a/src/web/web.cpp +++ b/src/web/web.cpp @@ -434,11 +434,12 @@ void web::showSave(AsyncWebServerRequest *request) { if(request->arg("mqttAddr") != "") { String addr = request->arg("mqttAddr"); addr.trim(); - addr.toCharArray(mConfig->mqtt.broker, MQTT_ADDR_LEN); - request->arg("mqttUser").toCharArray(mConfig->mqtt.user, MQTT_USER_LEN); + mConfig->mqtt.broker = addr; + + mConfig->mqtt.user = request->arg("mqttUser"); if(request->arg("mqttPwd") != "{PWD}") request->arg("mqttPwd").toCharArray(mConfig->mqtt.pwd, MQTT_PWD_LEN); - request->arg("mqttTopic").toCharArray(mConfig->mqtt.topic, MQTT_TOPIC_LEN); + mConfig->mqtt.topic = request->arg("mqttTopic"); mConfig->mqtt.port = request->arg("mqttPort").toInt(); }