Предполагаю, что я дурак, но у меня не получается разобраться с библиотекой ArduinoJSON. Хочу в файл сохранять настройки устройства. Структура конфига должна быть примерно такая:
Не могу понять как это реализовать. По примерам из инета получилось сделать конфиг который работает только с char. И если String в char конвертировать я научился, то... "На этом наши полномочия всё".
Вот части моего быдло-кода:
C++:
name: char, number: byte, state: byte
Вот части моего быдло-кода:
-
C++:
String espName = "esp4test2019"; //Имя самой esp8266. Используется для формирования записей MQTT byte numRelays = 4; //Количество реле byte relayDefaultState = 0; char mqtt_server[40]; char mqtt_port[6] = "1883"; char dev_name[32]; char uptime[14]; char num_relays[1]; bool shouldSaveConfig = false;
-
C++:
void JSONconfigSave() { DynamicJsonBuffer jsonBuffer; JsonObject& json = jsonBuffer.createObject(); json["esp_name"] = dev_name; json["num_relays"] = numRelays; json["relay_default_state"] = relayDefaultState; json["mqtt_server"] = mqtt_server; json["mqtt_port"] = mqtt_port; File configFile = SPIFFS.open("/config.json", "w"); json.printTo(Serial); json.printTo(configFile); configFile.close(); }
-
C++:
void JSONconfigLoad() { Serial.println(F("reading config file")); File configFile = SPIFFS.open("/config.json", "r"); if (configFile) { size_t size = configFile.size(); std::unique_ptr<char[]> buf(new char[size]); configFile.readBytes(buf.get(), size); DynamicJsonBuffer jsonBuffer; JsonObject& json = jsonBuffer.parseObject(buf.get()); json.printTo(Serial); if (json.success()) { Serial.println(F("\nparsed json")); strcpy(dev_name, json["esp_name"]); espName = dev_name; strcpy(num_relays, json["num_relays"]); numRelays = (byte) num_relays; strcpy(relayDefaultState, json["relay_default_state"]); strcpy(mqtt_server, json["mqtt_server"]); strcpy(mqtt_port, json["mqtt_port"]); } else { Serial.println(F("Failed to load json config")); } configFile.close(); }}
-
C++:
HTTPserver.on("/saveParams", handleGenericArgs); HTTPserver.on("/config", [](){ webPage4Config(); HTTPserver.send(200, "text/html", webPageConfig); }); [*]void webPage4Config() { webPageConfig = webPageHEADER; webPageConfig += "<title>" + espName + "</title></head><body bgcolor=\"#cecece\"><center>"; webPageConfig += "<table style=\"border: 0px; vertical-align:\"><tr><td><span class=\"header\">" + espName + "</span></td><td>"; webPageConfig += "<table style=\"border: 0px; padding: 0px; border-spacing: 0px; border-collapse: separate; text-align: right; vertical-align: text-top; font-size: 85%;\">"; webPageConfig += "<tr><td>RSSI: </td><td>" + String(WiFi.RSSI()) + " dBm</td></tr><tr><td>VCC: </td><td>" + String(ESP.getVcc() * 0.001) + " V</td></tr><tr><td></td><td></td></tr></table></td></tr><tr><td colspan=\"2\" align=\"right\">Uptime: " + String(uptime) + "</td></tr></table><br>"; webPageConfig += "<table style=\"border: 0px;\"><tr><td>"; webPageConfig += "<form method=\"POST\" action=\"/saveParams\">"; webPageConfig += "<fieldset><legend>Настройки общие</legend>"; webPageConfig += "Имя устройства:<br><input type=\"text\" name=\"dev_name\" maxlength=\"32\" size=\"40\" placeholder=\"" + espName + "\"><br>"; webPageConfig += "Количество розеток:<br>"; webPageConfig += "<table style=\"border: 0px; width: 100%;\"><tr>"; webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"1\">1</td>"; webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"2\">2</td>"; webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"3\">3</td>"; webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"4\" checked>4</td>"; webPageConfig += "</tr></table>"; webPageConfig += "</fieldset><br>"; webPageConfig += "<fieldset><legend>Настройки MQTT</legend>"; webPageConfig += "Адрес сервера:<br><input type=\"ip\" name=\"mqtt_server\" maxlength=\"16\" size=\"40\" placeholder=\"IP адрес в формате 255.255.255.255\" pattern=\""; webPageConfig += "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; webPageConfig += "\"><br>"; webPageConfig += "Порт сервера:<br><input type=\"text\" name=\"mqtt_port\" maxlength=\"5\" size=\"40\" min=\"1\" max=\"65534\" step=\"1\" placeholder=\"" + String(mqtt_port) + "\" pattern=\"[0-9]{,5}\">"; webPageConfig += "</fieldset><br>"; webPageConfig += "<center><input type=\"submit\" name=\"action\" value=\"Запомнить настройки\"></center></form>"; webPageConfig += "</td></tr></table>"; webPageConfig += "</center></body></html>"; } void handleGenericArgs() { String message; for (int i = 0; i < HTTPserver.args()-1; i++) { message += HTTPserver.argName(i) + ": "; //Get the name of the parameter message += HTTPserver.arg(i) + "\n"; //Get the value of the parameter if (HTTPserver.arg(i) != "") { if (HTTPserver.argName(i) == "dev_name") {espName = HTTPserver.arg(i); espName.toCharArray(dev_name, 32);} if (HTTPserver.argName(i) == "numRelays") { /* numRelays = (byte) HTTPserver.arg(i); */} if (HTTPserver.argName(i) == "mqtt_server") { } if (HTTPserver.argName(i) == "mqtt_port") { } } } HTTPserver.send(200, "text/plain", message); //Response to the HTTP request JSONconfigSave(); }